我正在編寫一個腳本,我只想處理鼠標事件,只要它們沒有被任何其他元素處理過。處理未被其他元素處理的Javascript事件
我可以將一個事件偵聽器附加到文檔對象,但它將接收所有事件,而不管它們是否已被處理。
我無法控制HTML頁面中的元素,因此無法在處理事件時手動停止傳播()。
任何想法?
我正在編寫一個腳本,我只想處理鼠標事件,只要它們沒有被任何其他元素處理過。處理未被其他元素處理的Javascript事件
我可以將一個事件偵聽器附加到文檔對象,但它將接收所有事件,而不管它們是否已被處理。
我無法控制HTML頁面中的元素,因此無法在處理事件時手動停止傳播()。
任何想法?
從這篇文章here。
它似乎還沒有做到這一點。
哪些事件處理程序被註冊?
當前實現W3C的事件註冊 模型的一個問題是,您無法確定是否有任何事件處理程序已經註冊到元素中了 。在傳統模式中,你可以這樣做:
alert(element.onclick)
,你會看到其註冊到 ,或者不確定如果沒有被註冊的功能。只有在其最近才DOM 3級事件W3C增加了一個
eventListenerList
存儲事件當前註冊的元素 處理程序的列表。 這 功能尚未支持任何瀏覽器,這太新了。 但是,問題已得到解決。
幸運
removeEventListener()
,如果你要刪除的事件 監聽器還沒有被添加到元素,所以當 疑問,你可以隨時使用removeEventListener不給任何錯誤( )。
行..(儘管我並不真的需要一個監聽器列表)。讓我們看看我能否找到其他方式。 – Grodriguez
所以,你可以在某些情況下完成你想要的東西。特別是,如果
有效的活動,你要做的就是替換原來的目標元素上的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);
})
這是一個有趣的想法。我可以確保我的JS將在原始之前運行。但是我無法知道哪些元素將添加事件偵聽器。有沒有辦法做到這一點,但以全球化的方式? (即全局替換addEventListener代碼與修改後的版本) – Grodriguez
你不控制的點擊事件是如何被綁定的? –
我真的不知道,因爲這是可能與不同種類的頁面一起使用的庫的一部分。可以是addEventListener或onXXX。 – Grodriguez
是的,'addEventListener'使它更難。對於on [event]類型,您可以擁有它,以便綁定到文檔的處理程序以'e.target'開始,並測試它和其祖先以查看哪個處理程序具有該處理程序,然後使用調用它的函數'stopPropagation'。但'addEventListener'不會讓你這樣做。 –