我说的是以下内容:
.unbind().click(function () {
// Do something
}
对我来说它看起来有点狡猾,但它是有道理的:开发人员希望首先删除绑定到元素的所有事件,然后绑定一个点击事件。
这个问题有更好的解决方案吗?或者纠正我的思维方式。
我说的是以下内容:
.unbind().click(function () {
// Do something
}
对我来说它看起来有点狡猾,但它是有道理的:开发人员希望首先删除绑定到元素的所有事件,然后绑定一个点击事件。
这个问题有更好的解决方案吗?或者纠正我的思维方式。
这不是一个很好的做法,因为您无法控制哪些点击事件未绑定。有两种不同的方法可以改善这一点:
您可以使用命名空间来控制您取消绑定您将再次绑定的单击事件:
$(selector).off('click.namespace').on('click.namespace', function(e) { //...
使用添加到链接的类将其标记为已注册(这不会取消绑定以前绑定的事件,但它有助于防止多个事件绑定,这是在大多数情况下您会在(bind)off
之前使用 (unbind)的问题:on
$(selector).not('.registered').addClass('registered').on('click', function(e) { //...
你甚至可以把它变成一个小性感的插件,写:
$.fn.register = function(register_class) {
register_class || (register_class = 'registered'); // lets you control the class
return this.not('.' + register_class).addClass(register_class);
};
像这样,你可以调用register
每个选择器:
$(selector).register().on('click', function(e) { //...
或者对于特定的类,如果采用 «registered»:
$(selector).register('special_handler_registered').on('click', function(e) { //...
每当我不得不“更新”某些按钮、链接等行为时,我都会采用这种方法,我认为它没有任何问题。但请注意,使用您的代码,您将删除附加到元素的每个处理程序。所以与其:
$(selector).unbind('click').click(function(){
// do something
})
好吧,至少最好指定哪些事件处理程序应该解除绑定。因此,如果有一些点击事件处理程序并且我们只想取消绑定它,那么我们可以使用unbind('click')
.
由于除了您的处理程序之外可能还有其他一些处理程序,因此使用命名空间是有意义的。
$(selector).off('click.myns').on('click.myns', function() {....})
or
$(selector).unbind('click.myns').bind('click.myns',function() {...})
这样你只会接触到你自己的处理程序,而不是其他一些处理程序,例如由 jquery 插件添加的
我通常会尽可能使用命名事件函数,以便能够显式地解除绑定:
$('a').unbind('click.myfunc').bind('click.myfunc', function(evt) { ... });
通过这种方式,您可以将此绑定添加到可以多次执行的 init 函数中(适用于因任何原因无法使用委托的情况)。
一般来说,如果我不需要,我不会尝试解除绑定每个事件甚至某个事件的每个处理程序。
我也试图保持最新状态并用开/关替换所有绑定/取消绑定调用;-)