如何取消绑定特定的事件处理程序

MeP*_*oan 45 javascript jquery events event-handling unbind

码:

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


$(document).keyup(function(exit) {
              if (exit.keyCode == 27) { functionZzy(); }
});
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*ver 80

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

function keyUpFunc(e) {
  if (e.keyCode == 27) { functionZzy(); }
}
$(document).keyup(keyUpFunc);
Run Code Online (Sandbox Code Playgroud)

然后在取消绑定时:

$(document).unbind("keyup", keyUpFunc);
Run Code Online (Sandbox Code Playgroud)


Fel*_*ing 63

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

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

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

$('#Inputfield').unbind('keyup.notkeep');
// or event  $('#Inputfield').unbind('.notkeep');
Run Code Online (Sandbox Code Playgroud)

由于jQuery的1.7,该方法.on.off是添加和移除事件处理程序的首选方式.为此,他们完全一样.bind,并.unbind和也与命名空间的事件工作.

  • 这是最好的答案,命名空间的概念非常有用,我一直都在使用它.如果您(或更重要的是其他人)在以后将事件绑定添加到同一元素而未意识到它已绑定到它的事件,它将提供支持.当然,如果他们去使用$('#myelement').解绑('焦点'),在没有命名空间的情况下键入锤子你的事件无论如何都将被解除绑定...因此告诉与你合作的人开始使用它! (9认同)
  • 虽然命名空间可能很有用,但是定位已绑定的函数的特定实例的能力可能更有用.我有几个相同功能的实例绑定到我的文档,我想只销毁其中一个.命名空间对我没有帮助. (2认同)

Dan*_* D. 9

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

$(document).one('keyup', function(e) {
              if (e.keyCode == 27) { functionZzy(); }
});
Run Code Online (Sandbox Code Playgroud)


lon*_*day 7

如果你在一个元素上只有一个处理程序,你可以安全地解除绑定,unbind而不使用Nick Craver建议的命名函数.在这种情况下,打电话

$('#Inputfield').unbind('keyup');
Run Code Online (Sandbox Code Playgroud)

不会影响处理程序document.