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的事件应该关闭然后重新打开,但由于某种原因,在它关闭后,它不会重新打开。如何重新打开它?

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

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

然后,您还可以在"click"处理程序中引用该函数:

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

现在,也就是说,在您的问题的上下文中,该操作确实没有多大意义。当"单击"处理程序代码正在运行时,"focusout"代码无论如何都不会运行。因此,在代码开头删除处理程序,然后在末尾重新添加它不会产生任何明显的影响。

我个人主张采用不同的方法,以便您可以停止修改绑定。 相反,请更改匹配器,使其更具限制性。

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

如果你像这样做了选择器,你所要做的就是"切换"它,只需在元素中添加/删除restricted类,或者你给委托的任何更严格的匹配器。

最新更新