0

我有一些附加在大量元素上的事件,例如 click、dblclick。要一次将 click 和 dblclick 事件与所有元素解除绑定,我在 jquery 中使用了它:

 $(document).unbind("click").unbind("dblclick");

现在我必须再次将这些事件重新绑定到所有元素。为此,我使用了:

 $(document).bind("click").bind("dblclick");

但这不起作用。事件不会重新绑定。我怎样才能做到这一点?

4

3 回答 3

3
$(document).bind("click").bind("dblclick");

我认为这不会绑定任何东西,您需要回调。

$(document).bind("click", onClick).bind("dblclick", onDbClick);

此外,在这种情况下,您可能需要考虑使用命名空间事件

$(document).bind("click.myclick", onClick)

然后稍后仅解除绑定此事件,而使其他事件click保持不变。

$(document).unbind("click.myclick");

PS 现在认为使用新的on,off方法进行绑定是更好的做法。

于 2013-01-15T10:15:58.823 回答
1

解绑:

$(document).off("click", myFunction);

绑定:

$(document).on("click", myFunction);

function myFunction() {
    alert('you clicked the document');
}

jQuery on()off()将是要走的路,并且在重新绑定时,必须再次传入该函数,您不能只是重新绑定并期望它知道要调用什么函数。

于 2013-01-15T10:17:28.150 回答
0

正如@adeneo 建议的那样,最好的方法是命名回调函数。但有时您不知道处理程序何时被绑定(插件中的 f.ex),或者您可能使用以下方式添加了匿名回调:

$(document).click(function() {
    // anonymous
});

$._data然后您可以使用该对象恢复所有这些回调。这是一个适合您的功能:

function restoreHandlers(elem, type) {
  var orig = $._data(elem, 'events');
  if ( type in orig ) {
    return $.map(orig[type], function(o) {
      return o.handler;
    });
  } else return [];
}

像这样使用它(在你解除绑定之前):

var handlers = restoreHandlers(document, 'click');

然后解绑:

$(document).off('click');

然后重新绑定:

$.each(handlers, function(i, fn) {
    $(document).on('click', fn);
});
于 2013-01-15T10:31:28.393 回答