jQuery:在它们发生之前捕获所有点击事件?

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

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

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点击function,以便我可以把我的小支票放在那里吗?

有什么明显的东西我在这里不见了吗?

谢谢你的帮助。

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

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

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

在这里看到它的运作:

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

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

 $("#someDiv").bind('awesomeEvent', function() { //do stuff here } $(*).click(function() { if(canClick) { $(this).trigger('awesomeEvent'); } } 

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