2017-05-10 71 views
0

在一個簡單的遊戲應用中,我試圖通過匿名事件回調函數的一些參數。我只能使用匿名函數來完成它,因爲它適合上下文(它的範圍標識參數)。問題是遊戲有重新啓動的選項。重新啓動後,它將添加到相同節點的新事件監聽器,在這裏您可能會猜到舊的事件監聽器仍然存在,這會導致不正確的功能和應用程序重載。我能想到的解決方案是在添加新事件之前通過刪除舊的eventListeners來「刷新」。但我無法找到任何方式考慮事件回調函數是匿名的!在使用內聯匿名函數時刪除事件監聽器

那麼,有什麼可能的替代解決方案?

var adder = function(colorBox, num){ 
    colorBox.addEventListener('click', function(){ 
     eventCall(this, num); 
    }); 
} 

var eventCall = function(t, num){ 
     var clickedBox = t.style.backgroundColor; 
.... 
+0

看看這個解決方法,從彩盒刪除事件監聽器 - http://stackoverflow.com/questions/19469881/remove-all-特定類型的事件偵聽器 – vabii

+0

我嘗試過..,我猜測它有一些缺點..,這使得它根本沒有幫助。 –

回答

2

您可以將該功能存儲在某處,以便以後在刪除時參考。使用數組 ,可以存儲多個事件處理程序,沒有他們通過多次打電話給加法器功能被覆蓋,然後有一個功能,消除所有的人等等,類似的:

function eventCall(t, num) { 
    var clickedBox = t.style.backgroundColor; 
} 

var fns = []; 

function adder(colorBox, num) { 
    function fn() { 
    eventCall(this, num); 
    } 

    colorBox.addEventListener('click', fn); 

    fns.push(fn); 
} 

function remover(colorBox) { 
    fns.forEach(function(fn) { 
    colorBox.removeEventListener('click', fn); 
    }); 
} 
+0

謝謝你幫助我。 –

0

您可以通過使用off功能(http://api.jquery.com/off/)刪除通過jQuery的事件處理程序。例如

$("p").off(); 

刪除所有段落中的所有事件處理程序。所以如果你把所有的dom元素用一個特定的類來分類的話,它仍然是可能的。

0

您可以刪除所有事件通過使用outerHTML屬性來監視元素上的偵聽器。

colorBox.outerHTML = colorBox.outerHTML; 

設置outerHTML屬性本身將消除任何附加事件監聽器,讓你重新開始與您要附加任何新的聽衆。

這種方法的詳細信息可以在這裏找到:

https://stackoverflow.com/a/32809957/5463636