如何解除绑定特定的事件处理程序

IT技术 javascript jquery events event-handling unbind
2021-03-09 23:21:11

代码:

$('#Inputfield').keyup(function(e)
        {
            if(e.which == 13)
            {
                functionXyz();
            }
            else
            {
                functionZyx();
            }
    });  


$(document).keyup(function(exit) {
              if (exit.keyCode == 27) { functionZzy(); }
});

问题:如何删除 keyCode == 27 的 keyup 事件处理程序并保持其他 $(document).keyup 事件处理程序完好无损?

4个回答

您必须使用命名函数,以便您可以在调用时引用该特定处理程序.unbind(),如下所示:

function keyUpFunc(e) {
  if (e.keyCode == 27) { functionZzy(); }
}
$(document).keyup(keyUpFunc);

然后在解除绑定时:

$(document).unbind("keyup", keyUpFunc);

您将事件处理程序附加到不同的元素,因此您可以安全地从特定对象中删除处理程序(我知道已经提到过)。

为了完整起见,如果要将同一事件的多个处理程序附加到同一对象,则可以使用命名空间事件

$('#Inputfield').bind('keyup.keep', function(e){/*...*/});
$('#Inputfield').bind('keyup.notkeep', function(e){/*...*/});

$('#Inputfield').unbind('keyup.notkeep');
// or event  $('#Inputfield').unbind('.notkeep');

jQuery 1.7 开始,方法.on.off是添加和删除事件处理程序的首选方式。为此,它们的行为与命名空间事件完全相同.bind.unbind并且也与命名空间事件一起使用。

这非常有用 - 对我来说是新事物 - 命名空间 - 谢谢!
2021-04-21 23:21:11
虽然命名空间可能很有用,但定位已绑定函数的特定实例的能力可能更有用。我有多个相同函数的实例绑定到我的文档,我只想销毁其中一个。命名空间对我没有帮助。
2021-04-22 23:21:11
绝对是最佳答案
2021-05-10 23:21:11
这是这里最好的答案,命名空间的概念非常有用,我一直在使用它。如果您(或更重要的是其他人)在以后将事件绑定添加到同一元素而没有意识到它已经绑定了事件,它会提供支持。当然,如果他们使用 $('#myelement').unbind('focus'),在没有命名空间的情况下键入锤子,无论如何您的事件都将被解除绑定...因此告诉与您一起工作的人开始使用它!
2021-05-12 23:21:11

jQuery 允许您绑定将在第一次调用后解除绑定的事件。如果您只想运行此 keyup 函数一次,请查看此处列出的 .one() 方法:http : //api.jquery.com/one/

$(document).one('keyup', function(e) {
              if (e.keyCode == 27) { functionZzy(); }
});

如果您在一个元素上只有一个处理程序,您可以安全地解除绑定,unbind而无需使用 Nick Craver 建议的命名函数。在这种情况下,调用

$('#Inputfield').unbind('keyup');

不会影响 上的处理程序document