1

我有以下代码:

function Selector()
{
 ...
 this.items = new Array();
 // i load here the items with dom-s
 this.setActiveItem = function(item)
 {
  this.items[item].className = "selector-item-active";
  ...
 }
 var _this = this;
 for (var i=0; i<itemsName.length; i++)
  this.items[i].addEventListener("mouseup",function(){_this.setActiveItem(i)});
}

问题是,当侦听器调用setActiveItem函数时,我在控制台中收到以下消息:

无法设置未定义的属性“类名”

所以监听器不能传递这个值。

有什么解决办法吗?

4

2 回答 2

1

事件侦听器不保留其this所属对象的范围。您还需要使用闭包将项目索引封装到回调中。而是尝试使用_this(如您定义的那样)引用变量,如下所示:

this.setActiveItem = function(item)
{
    return function (evt) {
        _this.items[item] = _this.items[item] || {};
        _this.items[item].className = "selector-item-active";
        ...
    }
}

...

for (var i=0; i<itemsName.length; i++)
    this.items[i].addEventListener("mouseup", this.setActiveItem(i));
于 2013-03-10T21:09:02.523 回答
0

itemsName.length每当执行 mouseup 事件时, i 的值将等于 at。使用匿名函数来保存 i;

修改后的代码:

.......
 var _this = this;
 for (var i=0; i<itemsName.length; i++){
  (function(j){
           _this.items[j].addEventListener("mouseup",
                        function(){
                              _this.setActiveItem(j);
                        }
                 );
            })(i);// preserve i for each for loop iterations
 }
}
于 2013-03-10T21:10:03.833 回答