4

我说的是以下内容:

.unbind().click(function () {
    // Do something
}

对我来说它看起来有点狡猾,但它是有道理的:开发人员希望首先删除绑定到元素的所有事件,然后绑定一个点击事件。

这个问题有更好的解决方案吗?或者纠正我的思维方式。

4

5 回答 5

9

这不是一个很好的做法,因为您无法控制哪些点击事件未绑定。有两种不同的方法可以改善这一点:


使用事件命名空间(更快)

您可以使用命名空间来控制您取消绑定您将再次绑定的单击事件:

$(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) { //...


表现?

如果您想知道不同处理程序的性能:

在此处查看此性能测试

于 2012-08-21T07:49:34.153 回答
2

每当我不得不“更新”某些按钮、链接等行为时,我都会采用这种方法,我认为它没有任何问题。但请注意,使用您的代码,您将删除附加到元素的每个处理程序。所以与其:

$(selector).unbind('click').click(function(){
    // do something
})
于 2012-08-21T07:33:43.820 回答
1

好吧,至少最好指定哪些事件处理程序应该解除绑定。因此,如果有一些点击事件处理程序并且我们只想取消绑定它,那么我们可以使用unbind('click').

于 2012-08-21T07:34:53.653 回答
1

由于除了您的处理程序之外可能还有其他一些处理程序,因此使用命名空间是有意义的。

$(selector).off('click.myns').on('click.myns', function() {....})

or 

$(selector).unbind('click.myns').bind('click.myns',function() {...})

这样你只会接触到你自己的处理程序,而不是其他一些处理程序,例如由 jquery 插件添加的

于 2012-08-21T07:37:35.133 回答
1

我通常会尽可能使用命名事件函数,以便能够显式地解除绑定:

$('a').unbind('click.myfunc').bind('click.myfunc', function(evt) { ... });

通过这种方式,您可以将此绑定添加到可以多次执行的 init 函数中(适用于因任何原因无法使用委托的情况)。

一般来说,如果我不需要,我不会尝试解除绑定每个事件甚至某个事件的每个处理程序。

我也试图保持最新状态并用开/关替换所有绑定/取消绑定调用;-)

于 2012-08-21T07:37:43.257 回答