2011-01-06 12 views
6

Mögliche Duplizieren:
Removing an anonymous event listenerJavascript: Entfernen eines anonymen Ereignis-Listener

Ich habe folgende Cross-Browser-Funktion einen Ereignis-Listener hinzuzufügen:

_SU3.addEventListener = function(elem, eventName, fn) { 
if(elem.addEventListener) { 
    elem.addEventListener(eventName, fn, false); 
    } else if (elem.attachEvent) { 
     elem.attachEvent('on'+eventName, fn); 
    } 
}; 

I‘ m Hinzufügen des Zuhörers wie folgt:

_SU3.addEventListener(_show, "click", function(event) { 
          _SU3.getChildren(_show, uri, element); 
        }); 

Was ist alles in Ordnung. Ich möchte jedoch den Listener entfernen, nachdem er einmal aufgerufen wurde. Das heißt so etwas wie:

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', ANON_FUNCTION); 

}; 

Aber natürlich ist die Listener-Funktion anonym, so gibt es zu Referenz keine Funktion Namen.

Wie kann ich den Listener entfernen?

Danke

+0

Sie müssen irgendwo eine Referenz aufbewahren. Entweder explizit durch Übergabe eines Verweises auf Ihre Funktion oder implizit innerhalb Ihrer Funktion. –

Antwort

8

Sie benötigen einen Verweis auf die Funktion zu halten:

var foo = function(event) { _SU3.getChildren(_show, uri, element); }; 

_SU3.addEventListener(_show, "click", foo); 

...

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', foo); 

}; 

Vergewissern Sie sich, dass die Variable foo im Rahmen ist, wo Sie den Ereignis-Listener entfernen.

+0

Danke. Aber dieser Listener wird zu vielen Elementen auf der Seite hinzugefügt, daher kann ich keine globale Variable haben, da diese überschrieben wird, wenn der Listener für andere Elemente aufgerufen wird. –

+0

@Richard: Ich habe nicht gesagt, dass es global sein muss, ich sagte, dass es im Umfang sein muss. – Matt

4

Sie können nicht. Wenn Sie es entfernen möchten, müssen Sie einen Verweis darauf speichern. Wie sonst könnten Sie es von den anderen unterscheiden?

+1

Nun, ich bin sehr glücklich, alle Klick-Listener, die an ein Element angehängt sind, zu löschen, wenn das möglich ist? –

+2

Nein, es gibt keine solche Funktion. –

3

Statt Entfernen den Ereignis-Listener wird, muss es, um zu verfolgen, ob es genannt:

addOneShotListener = function(elem, eventName, fn) { 
    var triggered = false, handler = function(ev) { 
    if (triggered) return; 
    fn(ev); 
    triggered = true; 
    }; 

    if(elem.addEventListener) { 
    elem.addEventListener(eventName, handler, false); 
    } else if (elem.attachEvent) { 
    elem.attachEvent('on'+eventName, handler); 
    } 
}; 

Diese Variation auf Ihrer ursprünglichen Funktion wickelt nur den ursprünglichen Handler (die „fn“ übergeben) mit einer Funktion, die den Handler nur beim ersten Aufruf aufruft. Danach setzt es ein Flag und ruft die ursprüngliche Handler-Funktion nie wieder auf.

+0

Das ist ein interessanter Vorschlag, danke –

0

Wenn Sie einem Element nur ein Klickereignis zugewiesen haben, legen Sie die Eigenschaft onclick fest. Du kannst es jederzeit mit element.onclick = '';

+0

Da die Seite dynamisch erstellt wird, und ich habe festgestellt, dass tun node.setAttribute ('onclick', 'Funktion') funktioniert nicht in einigen Browsern –

+0

Er sagte Eigenschaft, nicht Attribut. – Neil

+0

object.onclick = Funktion (e) {// etc}; –

Verwandte Themen