在大家的帮助下,我得到了它的工作。我将“上下文:”从“this.parentNode”更改为“this”。我仍然对“this”上下文感到困惑。通过有限的测试,它似乎解决了我运行多个实例的问题。谢谢你的帮助。新代码如下所示。
我是 jQuery 和 Javascript 的新手。我正在创建一个通用对象来导航数据库表 (NavDb)。如果我创建 1 个实例,它会完美运行。当我运行多个实例时,它失败了。我将问题追溯到我如何使用“this”。一个初始化/处理 ajax 请求的例程失败。一个表单可以有任意数量的选择器(自动完成或下拉菜单)。该例程递归地执行 ajax 请求,直到所有选择器都已初始化。'this' 变量在进入 'success:' 函数时引用 ajax 对象。我需要一个对父对象的引用,所以我在第 2 行创建了一个 $this。问题是它创建了一个闭包并弄乱了第二个实例(我相信这就是正在发生的事情)。如何在成功函数中获取对父对象的引用?我可以将 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();
}
});
};
};