2017-05-10 4 views
0

In einer einfachen Spiel-App versuche ich, der anonymen Ereignis-Rückruf-Funktion einige Argumente zu übergeben. Ich konnte es nur mit einer anonymen Funktion tun, da es in den Kontext passt (sein Bereich identifiziert die Argumente). Das Problem ist, dass das Spiel eine Option zum Neustart hat. Nach dem Neustart fügt es den gleichen Knoten neue Ereignis-Listener hinzu, und hier können Sie, wie Sie vielleicht vermuten, die alten Ereignis-Listener immer noch da sein, was zu einer ungeeigneten Funktionalität und überladenen App führt. Die Lösung, die mir einfällt, ist das "Auffrischen", indem die alten eventListener entfernt werden, bevor die neuen hinzugefügt werden. Aber ich konnte keine Möglichkeit finden, die Ereignis-Callback-Funktion ist anonym!Ereignis-Listener entfernen, wenn die Inline-Funktion anonym verwendet wird

Also, was könnte eine alternative Lösung sein?

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

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

Schauen Sie sich diese Problemumgehung den Ereignis-Listener von ColorBox entfernen - http://stackoverflow.com/questions/19469881/remove-all- Event-Listeners-spezifischen Typ – vabii

+0

Ich habe es versucht .., ich denke, es hat einige Nachteile .., die es überhaupt nicht hilfreich macht. –

Antwort

2

Sie können die Funktion irgendwo speichern, sodass Sie später beim Entfernen darauf zugreifen können. ein Array verwenden, können Sie mehrere Event-Handler speichern, ohne sie durch mehrere Anrufe an die Addiererfunktion überschrieben werden, und dann eine Funktion haben, die etc alle von ihnen entfernt, so etwas wie:

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

Danke, dass Sie mir geholfen haben. –

0

Sie können Ihre Event-Handler über jQuery mithilfe der off Funktion (http://api.jquery.com/off/) entfernen. Zum Beispiel

$("p").off(); 

entfernt alle Event-Handler aus allen Absätzen. Wenn Sie also alle Ihre dom-Elemente mit einer bestimmten Klasse klassifizieren, ist dies immer noch möglich.

0

Sie können alle Ereignis entfernen Listener auf einem Element mithilfe der outerHTML-Eigenschaft.

colorBox.outerHTML = colorBox.outerHTML; 

Einstellung der outerHTML Eigenschaft selbst wird alle angeschlossenen Ereignis-Listener entfernen und ermöglicht es Ihnen, mit neuen Hörern neu beginnen Sie anhängen möchten.

Weitere Informationen zu diesem Verfahren finden Sie hier:

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

Verwandte Themen