2012-05-07 83 views
5

我正在編寫一個腳本,我只想處理鼠標事件,只要它們沒有被任何其他元素處理過。處理未被其他元素處理的Javascript事件

我可以將一個事件偵聽器附加到文檔對象,但它將接收所有事件,而不管它們是否已被處理。

我無法控制HTML頁面中的元素,因此無法在處理事件時手動停止傳播()。

任何想法?

+1

你不控制的點擊事件是如何被綁定的? –

+0

我真的不知道,因爲這是可能與不同種類的頁面一起使用的庫的一部分。可以是addEventListener或onXXX。 – Grodriguez

+1

是的,'addEventListener'使它更難。對於on [event]類型,您可以擁有它,以便綁定到文檔的處理程序以'e.target'開始,並測試它和其祖先以查看哪個處理程序具有該處理程序,然後使用調用它的函數'stopPropagation'。但'addEventListener'不會讓你這樣做。 –

回答

1

從這篇文章here

它似乎還沒有做到這一點。

哪些事件處理程序被註冊?

當前實現W3C的事件註冊 模型的一個問題是,您無法確定是否有任何事件處理程序已經註冊到元素中了 。在傳統模式中,你可以這樣做:

alert(element.onclick)

,你會看到其註冊到 ,或者不確定如果沒有被註冊的功能。只有在其最近才DOM 3級事件W3C增加了一個

eventListenerList

存儲事件當前註冊的元素 處理程序的列表。 這 功能尚未支持任何瀏覽器,這太新了。 但是,問題已得到解決。

幸運

removeEventListener() 

,如果你要刪除的事件 監聽器還沒有被添加到元素,所以當 疑問,你可以隨時使用removeEventListener不給任何錯誤( )。

+0

行..(儘管我並不真的需要一個監聽器列表)。讓我們看看我能否找到其他方式。 – Grodriguez

1

所以,你可以在某些情況下完成你想要的東西。特別是,如果

  • 您可以加載自己的自定義JavaScript之前的原始
  • 你知道你正在聽的元素爲別人扔在

有效的活動,你要做的就是替換原來的目標元素上的addEventListener方法使用自定義攔截調用的方法,執行一些特殊處理,然後讓其按正常方式繼續。這個「特殊處理」是一個新的函數,它包裝了原始的回調函數,並用一些狀態標記事件參數,讓你知道別人已經處理了事件。這裏是概念證明(有jsFiddle

目標HTML:

<div id='asdf'>asdf</div>​ 

的JavaScript:

var target = document.getElementById('asdf'); 
var original = target.addEventListener; 

var updated = function(){ 
    // Grab the original callback, so we can use it in our wrapper 
    var originalFunc = arguments[1]; 

    // Create new function for the callback, that lets us set a state letting us know it has been handled by someone 
    // Finish the callback by executing the original callback 
    var newFunc = function(e){ 
     console.log('haha, intercepted you'); 
     e.intercepted = true; 
     originalFunc.call(this, e); 
    }; 

    // Set the new function in place in the original arguments 'array' 
    arguments[1] = newFunc; 

    // Perform the standard addEventListener logic with our new wrapper function 
    original.apply(this, arguments); 
}; 

// Set the addEventListener on our target to our modified version 
target.addEventListener = updated; 

// Standard event handling 
target.addEventListener('click', function(e){ 
    console.log('original click'); 
    console.log('intercepted?', e.intercepted); 
}) 
+0

這是一個有趣的想法。我可以確保我的JS將在原始之前運行。但是我無法知道哪些元素將添加事件偵聽器。有沒有辦法做到這一點,但以全球化的方式? (即全局替換addEventListener代碼與修改後的版本) – Grodriguez