解绑后,jQuery没有将事件重新绑定到处理程序

时间:2017-12-06 15:02:07

标签: javascript jquery

我有以下jQuery代码:

$(document).on('focusout', '#element', function(e){
     alert('test');
});

$(document).on('click', '#element_b', function(e){
     $(document).off('focusout','#element');
     /* do other stuff */
     $(document).on('focusout','#element',function(){});
});

点击#element_b时,绑定到#element的事件应该下车然后重新开启,但由于某些原因,在它关闭后,它不会重新开启。如何重新开始?

2 个答案:

答案 0 :(得分:0)

为了能够重新绑定处理程序,处理程序函数必须在重新绑定时可用于引用。要实现这一点,只需使用名称

定义处理函数
function focusOutHandler(e) {
  alert("test");
}

$(document).on("focusout", "#element", focusOutHandler);

然后你也可以在“点击”处理程序中引用该函数:

$(document).on('click', '#element_b', function(e){
     $(document).off('focusout','#element');
     /* do other stuff */
     $(document).on('focusout', '#element', focusOutHandler);
});

现在,那就是说,在你的问题背景下,这种操作真的没有多大意义。当“click”处理程序代码正在运行时,“focusout”代码无论如何都不会运行。因此,在代码开头删除处理程序,然后在最后添加它将不会产生任何明显的影响。

答案 1 :(得分:0)

我个人会争论一种不同的方法,所以你可以停止修改绑定。而是更改匹配器,使其更具限制性。

$(document).on('focusout', '#element:not(.restricted)', function(e){
    alert('test');
});

如果您选择了这样的选择器,那么打开或关闭它所需要做的就是向元素添加/删除restricted类,或者为代理提供更严格的匹配器。