3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
我不確定你刪除所有事件的意思。刪除特定類型事件的所有處理程序或一種類型的所有事件處理程序?
刪除所有事件處理程序
如果要?jiǎng)h除所有事件處理程序(任何類型),可以克隆該元素并將其替換為其克?。?/p>
var clone = element.cloneNode(true);
注意:這將保留屬性和子項(xiàng),但不會(huì)保留對DOM屬性的任何更改。
刪除特定類型的“匿名”事件處理程序
另一種方法是使用,removeEventListener()
但我想你已經(jīng)嘗試過這個(gè)并沒有用。這是一個(gè)問題:
調(diào)用
addEventListener
匿名函數(shù)每次都會(huì)創(chuàng)建一個(gè)新的偵聽器。調(diào)用removeEventListener
匿名函數(shù)無效。匿名函數(shù)在每次調(diào)用時(shí)都會(huì)創(chuàng)建一個(gè)唯一的對象,它不是對現(xiàn)有對象的引用,盡管它可以調(diào)用一個(gè)對象。以這種方式添加事件偵聽器時(shí),請確保它只添加一次,它是永久的(無法刪除),直到它被添加到的對象被銷毀。
您實(shí)際上是將一個(gè)匿名函數(shù)傳遞給addEventListener
as eventReturner
返回一個(gè)函數(shù)。
您有兩種可能性來解決這個(gè)問題:
不要使用返回函數(shù)的函數(shù)。直接使用該功能:
function handler() { dosomething();}div.addEventListener('click',handler,false);
創(chuàng)建一個(gè)包裝器,用于
addEventListener
存儲(chǔ)對返回函數(shù)的引用并創(chuàng)建一些奇怪的removeAllEvents
函數(shù):var _eventHandlers = {}; // somewhere globalfunction addListener(node, event, handler, capture) { if(!(node in _eventHandlers)) { // _eventHandlers stores references to nodes _eventHandlers[node] = {}; } if(!(event in _eventHandlers[node])) { // each entry contains another entry for each event type _eventHandlers[node][event] = []; } // capture reference _eventHandlers[node][event].push([handler, capture]); node.addEventListener(event, handler, capture); }function removeAllListeners(node, event) { if(node in _eventHandlers) { var handlers = _eventHandlers[node]; if(event in handlers) { var eventHandlers = handlers[event]; for(var i = eventHandlers.length; i--;) { var handler = eventHandlers[i]; node.removeEventListener(event, handler[0], handler[1]); } } }}
然后你可以用它:
addListener(div, 'click', eventReturner(), false)// and laterremoveListeners(div, 'click')
注意:如果您的代碼運(yùn)行了很長時(shí)間并且您正在創(chuàng)建并刪除大量元素,則必須確保在_eventHandlers
銷毀它們時(shí)刪除其中包含的元素。

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
這將從子節(jié)點(diǎn)中刪除所有偵聽器,但對于大頁面來說會(huì)很慢。寫得非常簡單。
element.outerHTML = element.outerHTML;
添加回答
舉報(bào)