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

Javascript 当处理程序需要接收回调函数时,删除jQuery事件侦听器,javascript,jquery,Javascript,Jquery,我有一个听众: $(document).on("keypress", function(e){ebClose(e,mpClose)}); 我正试图找出如何动态删除它。挑战在于我确实希望ebClose接收mpClose作为回调函数,因为在其他情况下,ebClose将接收不同的回调函数 ebClose所做的是: function ebClose(e, callback){ if (e.which == 13){ callback(); } } 也就是说,它检查它是

我有一个听众:

$(document).on("keypress", function(e){ebClose(e,mpClose)});
我正试图找出如何动态删除它。挑战在于我确实希望ebClose接收mpClose作为回调函数,因为在其他情况下,ebClose将接收不同的回调函数

ebClose所做的是:

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

这显然不起作用:

$(document).off("keypress", function(e){ebClose(e,mpClose)});
如果我把它改成这个:

$(document).on("keypress", ebClose);
然后我可以删除它,但不知道如何传递回调。谢谢你的建议。

一个选择是


或者,您也可以使用绑定函数:

或者,类似地,您可以使用:


Che bind()但是,
unbind
遇到了同样的问题,即它不适用于未命名的处理程序……只要您确保名称空间位于事件之后(我在尝试复制该事件时犯的第一个错误),这种方法就行得通。做作的例子:谢谢你的评论-不幸的是,我很难让这个工作。.off(namespace)是否必须位于namespace.on(namespace)函数中?我试图用不同的函数调用它们,但它似乎没有消失!我相信这是我的愚蠢之处missing@user3398945我添加了一个示例(希望能有所帮助)。我还添加了另外两个备选方案,并举例说明。如果你有任何问题,请告诉我。非常感谢。
.bind()
方法非常有效。出于某种原因,名称空间一继续不起作用,即使我从你的小提琴上复制了它。我将不得不仔细考虑为什么它在您的小提琴中工作,但在与工作的
.bind()
code完全相同的位置工作。现在名称空间也工作了。我想小精灵们正在午休,需要快点工作。
// Attach a keypress event namespaced to 'ebclose'
$(document).on("keypress.ebclose", function(e) {
  ebClose(e, mpClose)
});

// Remove the namespaced event:
$(document).off("keypress.ebclose");
$(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));
}
$(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));
}