假设整个站点中都有大量元素,这些元素的数量和类型的事件类型与它们绑定在一起。

如果我需要用一个单界事件覆盖所有这些事件,并且只有该事件才会开火,那么有什么建议?

我将把事件绑定到点击事件处理程序,并且正在使用jQuery。

提前致谢。

有帮助吗?

解决方案

您正在寻找 jQuery#unbind.

要删除元素或一组元素上的所有事件处理程序,只需做:

$('.some-selector').unbind();

要解开单击处理程序,请使用 unbind('click'):

$('.some-selector').unbind('click');

为了解开所有单击处理程序,然后立即绑定自己的处理程序,您可以做这样的事情:

$('.some-selector').unbind('click').click(function(event) {
  // Your code goes here
});

请注意,这仅适用于使用jQuery绑定的事件(使用 .bind 或任何使用的jQuery方法 .bind 内部)。如果要从给定的一组元素中删除所有可能的onclick事件,则可以使用:

$('.some-selector')
  .unbind('click') // takes care of jQuery-bound click events
  .attr('onclick', '') // clears `onclick` attributes in the HTML
  .each(function() { // reset `onclick` event handlers
    this.onclick = null;
  });

其他提示

我想提供一个思想,而无需将所有事件一起删除(只需覆盖它们)。

如果您的新单界事件(我们称其为“单击”此处)特定于其绑定到的元素,那么我相信您可以简单地通过stopPropagation()函数忽略任何其他事件。像这样

$("specific-selector").on("click", ".specific-class", function (e) {
  e.stopPropagation()
  // e.stopImmediatePropagation()
  /* your code continues ... */
});

它将阻止事件起泡,因此您的其他活动不会开火。使用stopimmediatiatepropagation()来防止与“点击”相同的元素附加的其他事件。

例如,如果“ Mouseleave”事件也被绑定到$(“特定selector。特定类”)元素,则它也不会发射。

最后,所有其他事件都不会对此元素发射,而是您的新“单击”元素。

未解决的问题是,如果其他事件也使用stoppropagation()怎么办? ...然后,我认为具有最佳规范的人会获胜,因此请尽量避免复杂,太多的事件是最终建议。

您可以看到“直接和委派事件” jQuery网站 了解更多信息。

看起来这实际上很简单:

$('#foo').unbind('click');
$('#foo').bind('click', myNewFunction);

不过,感谢您的回答。

尝试使用 居住 代替 bind. 。然后,您可以轻松地删除与 从选择器快速操作,并将另一个实时设置为同样快速。

   $('selection here').live('..', .....);  // multiple invocations
   $('selection here').die();
   $('selection here').live('click',.....);

DOM根本没有触摸。事件条件在事件发生时评估。

但是通常,如果您只想交换处理程序功能,为什么不这样做:

var ahandler = function(evt) { /* first implementation */ }
$('.selector').bind('click', function(evt) { ahandler(evt); });

//and then if you want to change handlers
ahandler = function(evt) { /* new implementation */ };

这绝对没有任何更改,重新插入等的代价。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top