当处理程序需要接收回调函数时,删除jQuery事件侦听器

时间:2015-11-20 13:56:45

标签: javascript jquery

我有一个听众:

preUpdate-Event

我试图弄清楚如何动态删除它。挑战在于我真的希望ebClos​​e接收mpClose作为回调函数,因为在其他情况下ebClos​​e会收到不同的回调函数。

ebClos​​e的作用是:

$(document).on("keypress", function(e){ebClose(e,mpClose)});

也就是说,它检查它是否是function ebClose(e, callback){ if (e.which == 13){ callback(); } } 密钥,然后调用回调函数。理论上,我可以制作10个不同版本的ebClos​​e并粘贴在不同的函数中以避免需要回调,但似乎它是很多代码。有什么建议可以让策略在需要时删除这个监听器吗?

这显然不起作用:

enter

如果我改成它:

$(document).off("keypress", function(e){ebClose(e,mpClose)});

然后我可以删除它,但不知道如何传递回调。谢谢你的建议。

1 个答案:

答案 0 :(得分:2)

一个选项是namespace the events

Example Here

// Attach a keypress event namespaced to 'ebclose'
$(document).on("keypress.ebclose", function(e) {
  ebClose(e, mpClose)
});

// Remove the namespaced event:
$(document).off("keypress.ebclose");

或者,您也可以使用$.proxy()来绑定函数:

Example Here

$(document).on("keypress", $.proxy(ebClose, this, mpClose));

function ebClose(callback, e){
    if (e.which == 13){
        callback();
    }
}
function mpClose () {
    alert('Remove the event listener');
    $(document).off("keypress", $.proxy(ebClose, this, mpClose));
}

或者,类似地,您可以使用.bind() method

Example Here

$(document).on("keypress", ebClose.bind(this, mpClose));

function ebClose(callback, e){
    if (e.which == 13){
        callback();
    }
}
function mpClose () {
    alert('Remove the event listener');
    $(document).off("keypress", ebClose.bind(this, mpClose));
}