皆様のお力添えで無事完成いたしました。「context:」を「this.parentNode」から「this」に変更します。私はまだ「これ」の文脈で混乱しています。限られたテストで、複数のインスタンスを実行する際の問題が修正されたようです。ご協力いただきありがとうございます。新しいコードを以下に示します。
私はjQueryとJavascriptが初めてです。データベース テーブル (NavDb) をナビゲートするための一般的なオブジェクトを作成しています。1 つのインスタンスを作成すると、完全に機能します。複数のインスタンスを実行すると失敗します。「これ」の使い方に問題があることを突き止めました。ajax リクエストを初期化/処理する 1 つのルーチンが失敗します。フォームには、任意の数のセレクター (オートコンプリートまたはドロップダウン) を含めることができます。このルーチンは、すべてのセレクターが初期化されるまで ajax リクエストを再帰的に実行します。「this」変数は、「success:」関数に入るときの ajax オブジェクトを参照します。親オブジェクトへの参照が必要なので、2 行目に $this を作成しました。問題は、クロージャーが作成され、2 番目のインスタンスが台無しになることです (それが起こっていると思います)。成功関数内の親オブジェクトへの参照を取得するにはどうすればよいですか? ajax リクエストを親オブジェクトにバインドできますか? 私はこのようなものが必要です:
var $this = this.parent;
うまくいけば、私はこれを明確に説明しました。
新しいコード
NavDb.prototype.getSelData = function () {
if (this.curSelector >= this.selectors.length) {
return;
}
else {
var sql = this.selectors[this.curSelector].sql;
$.ajax({
url: 'php/select.php',
type: 'POST',
context: this, // Only needed 'this' not this.parentNode.
dataType: 'json',
data: {
'sql': sql
}
}).done(function (data) {
if (data.success) {
if (data.v.length > 0) {
this.selectors[this.curSelector].data = data;
if (this.selectors[this.curSelector].type == "autoComp") {
this.initAC();
};
if (this.selectors[this.curSelector].type == "dropDown") {
this.initDD();
};
}
}
this.curSelector++;
this.getSelData();
}).fail(function (XHR, textStatus, errorThrown) {
$("#status").html(getErrorText(XHR.responseText));
});
};
};
古いコード
NavDb.prototype.ajaxSelData = function () {
var $this = this;
if (this.curSelector >= this.selectors.length) {
$this = null;
return;
}
else {
var sql = $this.selectors[$this.curSelector].sql;
$.ajax({
url: 'php/select.php',
type: 'POST',
dataType: 'json',
data: {
'sql': sql
},
success: function (data) {
if (data.success) {
if (data.v.length > 0) {
$this.selectors[$this.curSelector].data = data;
if ($this.selectors[$this.curSelector].type == "autoComp") {
$this.initAC();
};
if ($this.selectors[$this.curSelector].type == "dropDown") {
$this.initDD();
};
}
} else {
alert(data.error);
}
$this.curSelector++;
$this.ajaxSelData();
}
});
};
};