2016-04-15 144 views
1
function attachEvent(element, event, callbackFunction) { 
    if(element.addEventListener) { 
    element.addEventListener(event, function(){ 
     removeArray(); 
     callbackFunction(this.getAttribute("src")); 
    }, false); 
    } 
} 


function removeEvent(){ 
    var element = document.querySelectorAll('.Dicon'); 
    element.removeEventListener("click", handler); 
    console.log("remove"); 
} 

我有一個高級應召迪康,我用addEventlistner一些圖像給他們點擊的能力,但現在我想刪除eventlistner,但不知何故,我不能使它工作,我得到錯誤。不能使用刪除事件監聽器

錯誤

Uncaught TypeError: element.removeEventListener is not a function 

如何解決這個問題?他們都是形象。

回答

1

document.querySelectorAll()返回的HTMLCollection,所以你需要通過項目環從每個項目中刪除監聽器:

var element = document.querySelectorAll('.Dicon'); 
Array.prototype.forEach.call(element, function(el) { 
    el.removeEventListener("click", handler); 
}); 

還要注意有關完全相同的函數引用刪除處理什麼@T.J. Crowder states in his answer's秒塊。

+0

功能工作,但不知何故onclick不刪除。 – darkness

+0

查看@ T.J.Crowder的解釋! – baao

3

querySelectorAll返回一個集合,而不是一個單一的元素。如果您只想獲得第一個匹配元素,請使用querySelector(否All)。否則,您使用length來索引該集合(例如,第一個匹配元素爲[0],第二個元素爲[1]),以知道其中有多少個元素。您還需要定義handler

請注意,您不能刪除你在你的第一個代碼塊使用addEventListener附處理,因爲刪除處理程序,你必須提供給removeEventListener相同函數引用因爲你給了到addEventListener,並且您沒有該引用,因爲您直接將函數表達式傳遞到addEventListener

您需要在某處保留該引用(例如,變量或屬性)以便稍後使用該引用來刪除處理程序。

+0

@TJ,如果我們不保留引用,那麼無法刪除事件偵聽器? – Rayon

+0

@RayonDabre:沒有。你必須銷燬和替換元素。這是讓我繼續使用jQuery的原因之一:你可以刪除所有處理程序或所有具有給定「名稱空間」的處理程序等等。這可能是因爲jQuery只在給定元素上綁定給定事件**一次** ,然後它使用自己的處理程序列表將該事件分派給我們的代碼。沒有辦法與原生DOM方法做到這一點。 –

+0

@TJ,基本上'jQuery'保持參考?如果我讀你的正確.. – Rayon