17

在我的页面上,我有很多响应点击事件的各种元素。有时我需要根据一些全局标志阻止所有点击。有没有办法可以在集中位置进行此检查?

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

var canClick = false; // Global flag

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

  // Some stuff ...
});

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

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

例子:

$("#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 函数,以便我可以把我的小检查放在那里吗?

我在这里有什么明显的遗漏吗?

谢谢你的帮助。

4

3 回答 3

24

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

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

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

在这里查看它的实际效果:

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

于 2011-05-27T21:03:29.677 回答
0

您可以捕获所有点击事件,然后触发一个自定义事件,在您检查后绑定您的侦听器

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

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

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

于 2011-05-27T20:53:25.080 回答
0

使用注入 Javascript:

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


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

                            + "})()"
            );
于 2020-01-19T02:50:02.060 回答