我有数组this.conds = ["addr", "acc"]
。我在html树中拥有所有这些DOM
个对象。所有这些代码:
for(cond in this.conds) {
this.searchBy[this.conds[cond]] = {
"btn": $("#" + this.conds[cond] + "Btn"),
"fields": $("#" + this.conds[cond] + "Fields"),
"active": false
};
// Handlers
__THIS = this;
this.searchBy[this.conds[cond]].btn.click(function() {
__THIS.setAllUnactive();
__THIS.searchBy[__THIS.conds[cond]].active = true;
__THIS.searchBy[__THIS.conds[cond]].fields.show();
});
}
我无法使处理程序处理this.conds
的当前元素。它每次都处理最后一个元素。如何避免这种错误行为?
答案 0 :(得分:1)
这是一个非常常见的JavaScript陷阱。 JS没有阻止上下文;您在块中设置的任何变量都会转到周围的上下文中。你有几个选择:
$.each()
循环,因为它需要一个函数,因此保持上下文。[].forEach()
,类似于$.each()
,但使用原生JS。 (注意:在旧版浏览器中不可用。) function handleCond(cond) {
// put all that code here
}
for(cond in this.conds) {
handleCond(this.conds[cond]);
}
我应该注意,最好不要为数组使用for...in
循环。请改用$.each()
或for (i=0;i<list.length;i++)
。
编辑:在选项3中,请务必将this.conds[cond]
切换为普通cond
。