设置onclick处理程序为

时间:2014-03-24 07:15:09

标签: javascript jquery

我有数组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的当前元素。它每次都处理最后一个元素。如何避免这种错误行为?

1 个答案:

答案 0 :(得分:1)

这是一个非常常见的JavaScript陷阱。 JS没有阻止上下文;您在块中设置的任何变量都会转到周围的上下文中。你有几个选择:

  1. 使用$.each()循环,因为它需要一个函数,因此保持上下文。
  2. 使用[].forEach(),类似于$.each(),但使用原生JS。 (注意:在旧版浏览器中不可用。)
  3. 在函数中包装每次迭代,如此
  4. 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