覆盖所有JavaScript事件与单个新事件绑定到元素
-
09-10-2019 - |
题
假设整个站点中都有大量元素,这些元素的数量和类型的事件类型与它们绑定在一起。
如果我需要用一个单界事件覆盖所有这些事件,并且只有该事件才会开火,那么有什么建议?
我将把事件绑定到点击事件处理程序,并且正在使用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 */ };
这绝对没有任何更改,重新插入等的代价。