jQuery:捕获所有单击事件,然后再发生?

问题描述 投票:17回答:3

在我的页面上,我有许多元素可以响应点击事件。有时候,我需要根据某个全局标记来阻止所有点击。有什么方法可以在集中位置进行此检查?

现在在每个事件中我检查标志,例如:

var canClick = false; // Global flag

// Sample click event:
$("#someDiv").click(function(){
  if(!canClick) return;

  // Some stuff ...
});

我想做的是有一个元素可以捕获所有单击事件之前其他任何元素。

我尝试在document上执行此操作,但这些事件仅在其他click事件之后发生。

示例:

$("#someDiv").click(function(){ console.log("someDiv click"); });

$(document).click(function(){ console.log("Document click"); });

// When I click on the someDiv element it prints:
> someDiv click
> Document click

我还尝试将全屏div放在所有内容之上,并使用它来捕获事件,但是问题是没有任何点击通过该全屏div传播。另外,我不想依赖于创建额外的元素来捕获点击,因为它感觉有些hacky。

我是否可以覆盖jQuery click函数,以便我可以将一点支票放入其中?

这里有什么明显的我想念的东西吗?

感谢您的帮助。

jquery events click propagation
3个回答
24
投票

是,使用.addEventListener()并将第3个选项设置为true。这会将侦听器绑定到捕获阶段,并在执行其他任何操作之前执行该函数。

这是一个示例,它将阻止所有点击处理程序执行:

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

在此处查看实际操作:

http://jsfiddle.net/wLwMh/1/


0
投票

您可以捕获所有单击事件,然后触发一个自定义事件,在您检查之后绑定听众。

$("#someDiv").bind('awesomeEvent', function() {
    //do stuff here
}

$(*).click(function() {
    if(canClick) {
        $(this).trigger('awesomeEvent');
    }
}

编辑我应该提到,从性能的角度来看,使用$(*)选择器不是一个好主意。您应该真正尝试以某种方式缩小范围。


0
投票

使用注入Javascript:

view.loadUrl(
                    "javascript:(function() {"


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

                            + "})()"
            );
© www.soinside.com 2019 - 2024. All rights reserved.