私のアプリケーションには、ユーザーがプロファイルを無効にできるオプションがあります。それらを再度アクティブにできるのは管理者だけです。
2つのメソッドを持つクラスActivateProfile
があります
userExist(userName)
そのuserNameを持つユーザーが存在し、そのプロファイルが無効化されているかどうかを確認しますactivateAccountByUser(userName)
ユーザーのプロファイルを再度アクティブにします入力タイプのボタンのクリックイベントでJavaScript関数を呼び出します。このコードはChromeおよびMozillaで正常に動作しますが、Internet Explorerではこのエラーが発生します。
SCRIPT438:オブジェクトはプロパティまたはメソッドuserExistをサポートしていません
function activateProf() {
var userName=document.getElementById("userName").value;
if (userName == "") {
alert("Полето е задолжително");
} else {
alert(userName + "1");
ActivateProfile.userExist(userName, { callback:function(exist) {
if (userName) {
ActivateProfile.activateAccountByUser(userName);
alert("User is activated");
} else {
alert("User does not exist");
}
}});
}
}
プロファイルクラスのアクティブ化のコードは次のとおりです。
public void activateAccountByUser(String userName) {
try {
Connection c = DBComm.getInstance().getConnection();
Statement s = c.createStatement();
ResultSet set = s.executeQuery("select * from accounts where userName = '" + userName + "' and isauthorized='2'");
if (set.next()) {
Statement st = c.createStatement();
st.executeUpdate("update accounts set isauthorized='1' where userName='" + userName + "' and isauthorized='2'");
}
s.close();
c.close();
} catch (Exception ex) {
Java.util.logging.Logger.getLogger(ActivateProfile.class.getName()).log(Level.SEVERE, null, ex);
}
}
public boolean userExist(String userName) throws SQLException {
//true exist
//false does not exist
boolean existEmbg = false;
try {
Connection c = DBComm.getInstance().getConnection();
Statement s = c.createStatement();
ResultSet set = s.executeQuery("select * from accounts where userName = '" + userName + "' and isauthorized='2'");
if (set.next()) {
existEmbg = true;
} else {
existEmbg = false;
}
s.close();
c.close();
} catch (Exception ex) {
Java.util.logging.Logger.getLogger(ActivateProfile.class.getName()).log(Level.SEVERE, null, ex);
}
return existEmbg;
}
インターネットを検索して数日後、このエラーは通常、html要素IDがjavascript関数の変数と同じIDを持つときに発生することがわかりました。それらのいずれかの名前を変更した後、私のコードは正常に機能していました。
これは、JavaScriptネームスペースを使用するWebアプリケーションの一般的な問題です。この場合、99.9%の問題は、IEが現在のネームスペース内のメソッドを「this」キーワードにバインドできないことです。
たとえば、メソッド「isAwesome」を持つJS名前空間「StackOverflow」がある場合。通常、「StackOverflow」名前空間内にいる場合、次の構文で「isAwesome」メソッドを呼び出すことができます。
this.isAwesome();
Chrome、Firefox、Operaはこの構文を喜んで受け入れます。 IE一方、そうしません。したがって、JSネームスペースを使用する際の最も安全な方法は、常に実際のネームスペースをプレフィックスとして付けることです。アラ:
StackOverflow.isAwesome();
対応するjavascriptのすべての変数にvarを追加しました。これでIEの問題が解決しました。
前のコード
billableStatus = 1 ;
var classStr = $(this).attr("id").split("_");
date = currentWeekDates[classStr[2]]; // Required
activityNameId = "initialRows_" + classStr[1] + "_projectActivityName";
activityId = $("#"+activityNameId).val();
var projectNameId = "initialRows_" + classStr[1] + "_projectName" ;
projectName = $("#"+projectNameId).val();
var timeshitEntryId = "initialRows_"+classStr[1]+"_"+classStr[2];
timeshitEntry = $("#"+timeshitEntryId).val();
新しいコード
var billableStatus = 1 ;
var classStr = $(this).attr("id").split("_");
var date = currentWeekDates[classStr[2]]; // Required
var activityNameId = "initialRows_" + classStr[1] + "_projectActivityName";
var activityId = $("#"+activityNameId).val();
var projectNameId = "initialRows_" + classStr[1] + "_projectName" ;
var projectName = $("#"+projectNameId).val();
var timeshitEntryId = "initialRows_"+classStr[1]+"_"+classStr[2];
var timeshitEntry = $("#"+timeshitEntryId).val();
私の問題は、jQueryのtype="application/javascript"
タグに<script>
があったことです。 IE8はこれを好まない! WebページがHTML5の場合、タイプを宣言する必要さえありません。そうでない場合は、代わりにtype="text/javascript"
を使用します。
私の場合、次のようなコードがありました。
function.call(context, arg);
IEでエラーメッセージが表示されました
TypeError:オブジェクトはプロパティまたはメソッド 'error'をサポートしていません
「関数」の本文には「console.error」があり、コンソールを閉じたときにコンソールオブジェクトが未定義になることがわかりました。 consoleとconsole.errorが定義されているかどうかを確認することでこれを修正しました
すべてのスクリプトタグに"use strict"
を実装して、矛盾を見つけ、潜在的なスコープ外の変数を修正します。
インポートするファイルにObject.Assignポリフィルを追加してエラーをスローすることで、この問題を解決できました。スタックで呼び出される他のコードで利用できるように、それを最高のインポートにします。
import "mdn-polyfills/Object.assign";
アイテム変数でvar
を使用するのを忘れました
間違ったコード:
var itemCreateInfo = new SP.ListItemCreationInformation();
item = list.addItem(itemCreateInfo);
item.set_item('Title', 'Haytham - Oil Eng');
正しいコード:
var itemCreateInfo = new SP.ListItemCreationInformation();
var item = list.addItem(itemCreateInfo);
item.set_item('Title', 'Haytham - Oil Eng');