我有一些附加在大量元素上的事件,例如 click、dblclick。要一次将 click 和 dblclick 事件与所有元素解除绑定,我在 jquery 中使用了它:
$(document).unbind("click").unbind("dblclick");
现在我必须再次将这些事件重新绑定到所有元素。为此,我使用了:
$(document).bind("click").bind("dblclick");
但这不起作用。事件不会重新绑定。我怎样才能做到这一点?
我有一些附加在大量元素上的事件,例如 click、dblclick。要一次将 click 和 dblclick 事件与所有元素解除绑定,我在 jquery 中使用了它:
$(document).unbind("click").unbind("dblclick");
现在我必须再次将这些事件重新绑定到所有元素。为此,我使用了:
$(document).bind("click").bind("dblclick");
但这不起作用。事件不会重新绑定。我怎样才能做到这一点?
$(document).bind("click").bind("dblclick");
我认为这不会绑定任何东西,您需要回调。
$(document).bind("click", onClick).bind("dblclick", onDbClick);
此外,在这种情况下,您可能需要考虑使用命名空间事件:
$(document).bind("click.myclick", onClick)
然后稍后仅解除绑定此事件,而使其他事件click
保持不变。
$(document).unbind("click.myclick");
正如@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);
});