2009-11-24 67 views
3

我正在写一个JavaScript附加组件(不是在jQuery中),当某个事件被触发时它开始工作。它在大多数网站上都能正常工作,但我在使用stopPropagation()的网站中遇到了问题。 无论如何,是否可以绕过此事件并附加事件? 谢谢!绕过event.stopProgagation

+2

javascript插件?你的意思是Firefox附加? – 2009-11-24 09:23:27

+0

这是当站点加载时激活的JavaScript代码,非常像GreaseMonkey,除非它不是Firefox特定的。 – Nir 2009-11-24 09:55:41

回答

0

stopPropagation()如何应对? (添加更多描述如何/你的附加作品/附加)。

stopPropagation()所做的唯一的事情就是阻止事件冒泡到接收事件的元素的父元素。因此父对象的事件处理程序不会被调用。但是直接在元素上的相同事件的多个处理程序都被调用。

所以......只要您将您的事件处理程序直接绑定到事件首先生成的元素上,您就可以。如果您只是试着听例如在body并依靠所有事件冒泡给你,你是运气不好。

例如如果你现在点击红色的div,你会得到一个提醒sibling handler和一个说inline handler,虽然之前定义的内联onclick处理程序调用stopPropagation()

(注:此示例不处理,它使用attachEvent()cancelBubble IE细节)

<style type="text/css" media="screen"> 
    #parent1 { background-color: green; width:300px; height:300px } 
    #test { background-color: red; width:200px; height:200px } 
</style> 

<div id="parent1"> 
    <div id="test" onclick="javascript:event.stopPropagation();alert('inline handler');"></div> 
</div> 

<script type="text/javascript"> 
    parent1.addEventListener('click', 
     function(e) { alert('parent'); }, 
     false 
    ); 
    test.addEventListener('click', 
     function(e) { alert('sibling handler'); }, 
     false 
    ); 
</script> 
+0

谢谢,我实际上正在寻找一种更通用的方式来捕捉所有事件,并且您对“运气不好”的评论有所帮助。 – Nir 2009-11-25 09:32:57

2

对于符合标准的浏览器,使用capturing phase。对于IE,您可以通过在元素上调用setCapture来捕获鼠标事件(可能是body)。一旦你完成了你的工作,请在event对象的srcElement上拨打fireEvent

+0

谢谢,但我需要捕获所有事件,而不仅仅是一个对象。 – Nir 2009-11-25 05:25:52

+0

捕获文档上的事件将捕获它,而不管触发什么元素; IE只会允许捕捉鼠标事件。你能描述为什么你想要在任意页面上捕获_all_事件吗? – 2009-11-25 10:34:05

+0

我承认这是一个有效的想法。实际上,当我写下我的答案时,我想到了它。但是使用捕捉阶段会给你带来许多麻烦。每个浏览器都支持捕捉阶段有点不同。 'addEventListener(x,y,true)'从浏览器到浏览器的行为略有不同。当然,IE有自己的做事方式('setCapture','relaseCapture')。 IE(至少<= IE6)仅支持在捕获阶段捕获鼠标事件。 – jitter 2009-11-25 11:08:40