Javascript unbind匿名回调函数

时间:2013-02-22 14:11:29

标签: javascript events callback anonymous-function

是否有可能取消绑定匿名回调函数...

link.addEventListener("click", function () {
     //Any piece of code
}, true);

link.removeEventListener("click", function () {
     //Any piece of code
});

谢谢, 阿然

3 个答案:

答案 0 :(得分:3)

没有。因为那些匿名函数实际上是不同的。这与{ a: 1 } === { a: 1 }返回false的原因相同。

您需要执行以下操作:

var func = function () { ... };

element.addEventListener( 'click', func, false );

element.removeEventListener( 'click', func, false );

答案 1 :(得分:3)

是。您可以使用arguments.callee在某处保存匿名事件处理函数的句柄,稍后使用此保存的引用取消绑定。

// binding
var el = document.getElementById('foo');
el.addEventListener('click', function(e) {
    alert('Hi'); 

    // this is where we save a handle to the anonymous handler
    // arguments.callee gives us a reference to this function
    el['_ev'] = arguments.callee;

}, false);


// unbinding
var el = document.getElementById('foo'), handler = el['_ev'];
if(handler) {

    // here we use the saved reference to unbind it        
    el.removeEventListener('click', handler);

    el['_ev'] = false;
}

演示: http://jsfiddle.net/jrXex/2/

答案 2 :(得分:2)

函数由指针标识。你没有指向你的匿名函数的指针,所以你没有任何东西要传递给remove()来告诉它要删除哪个函数。

简单地传递一个重复的函数不会这样做,因为副本有一个不同的指针。

您需要坚持将函数赋值给变量,然后将该变量传递给remove()。