2009-11-24 56 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