如何将JavaScript类实例传递给DOM事件监听器?

8

我有一个看起来非常棘手的情况。我想将对象实例传递给由该对象实例创建的DOM元素的事件监听器(如果有意义的话)。

function Object(callback){
    this.callback = callback;
    this.node = document.createElement('div');
    this.send = function(){
        document.getElementById('list').appendChild(this.node);
    }
    this.node.addEventListener('click',function(){/*this.callback() of Object instance needs to go here*/},true);
}

我知道在事件监听器中使用callback()会起作用,但这不是我需要的,因为我将在稍后使用来自实例的变量,这些变量不是从构造函数传递的。

我该怎么解决这个问题?

1个回答

5
匿名函数改变了this的含义。为了在处理程序中使用它,可以使用另一个变量,或者不创建另一个函数:
var elem = this;
this.node.addEventListener('click',function(){ elem.callback(); },true);

或者

this.node.addEventListener('click', this.callback, true);

另外一个问题,elem是只在定义时被计算还是当事件触发时会再次被计算?如果不是在事件触发时被计算,有没有任何方法可以实现这个功能? - livemac
只有在外部函数被评估时才会进行评估。elem被存储以在回调被触发时使用,但它始终指向同一个实例;如果在此期间更改实例,则elem将反映更改(始终只有一个实例,它不会被复制,elem只是另一个对它的引用)。我看不出为什么需要在事件触发时再次运行分配的原因。 - Zack Bloom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接