7

event.preventDefault()将覆盖元素的默认事件行为。如何临时覆盖所有点击绑定,而不仅仅是默认的?或者有没有办法保存所有的点击绑定,以便我可以解开它们并在以后使用它们?

好吧,这不是一个正确的答案,而是一种解决方法。我们可以将所需的处理程序压入堆栈顶部,然后使用 return false 来停止其他绑定。https://github.com/private-face/jquery.bind-first

4

3 回答 3

2

您可以使用jQuery.clone(true)它的作用是返回元素的数据。设置为 true 的参数意味着也复制所有事件。

因此,如果您将元素克隆到变量中,您可以通过简单地将目标元素替换为其较旧的克隆(具有旧事件)来恢复旧的点击事件

所以它是这样的:

第 1 步:将目标元素克隆jQuery.clone(true)到一个变量中

第 2 步:使用从目标元素中删除所有点击事件jQuery.off('click')

第 3 步:将您的事件绑定到目标元素jQuery.on('click' function etc...)

第 4 步:完成后,将目标元素替换为其克隆(具有旧事件)

这是一个 JSFiddle 供您观赏

(对于 JSFiddle 的简单性,我很快就对其进行了模拟,但我没有使用它的示例情况。)

编辑:我忘了解释jQuery.clone(true)

于 2013-11-07T20:01:58.780 回答
1

您可以使用

element.addEventListener(type, listener[, useCapture]);

这样,您可以在触发 jQuery 点击处理程序之前“捕捉”点击,就像这样(我从这个 stackoverflow 问题中获取:

document.addEventListener('click', function(e) {
    e.stopPropagation();
}, true);

有关更多信息(以及一些 IE < 9 支持),请参阅developer.mozilla

编辑:来自 Mozilla 的有关 useCapture 的详细信息:

如果为真,useCapture 表示用户希望启动捕获。启动捕获后,指定类型的所有事件将被分派到注册的侦听器,然后再分派到 DOM 树中它下面的任何 EventTarget。通过树向上冒泡的事件不会触发指定使用捕获的侦听器。有关详细说明,请参阅 DOM 级别 3 事件。如果未指定,useCapture 默认为 false。

于 2013-11-07T20:10:06.940 回答
0

如果您可以控制所有 JS 代码并且可以绑定自己的处理程序,并且所有其他事件处理程序都与 jQuery 绑定,那么您可以这样做:

var overrideClick = false;
$("#yourElementId").click(function(e) {
    if (overrideClick) {
        e.stopImmediatePropagation();
        // e.preventDefault();    uncomment this if you want to prevent default action too
    }
});

在需要时设置代码的其他部分overrideClick = true

演示:http: //jsfiddle.net/NCa5X/

jQuery 按照绑定的顺序调用处理程序,因此您可以使用它event.stopImmediatePropagation()来防止调用其他处理程序。

于 2013-06-14T10:45:38.417 回答