2017-06-15 11 views
0

Ich habe Schwierigkeiten, das Ereignis aus dem Fenster zu entfernen, und ich kann nicht herausfinden, warum es nicht funktioniert. Ich habe eine Funktion, in der ich ein Ereignis zum Fenster hinzufüge.Das Ereignis wird nicht aus dem Fenster entfernt

Test.prototype.func1 = function(){ 
    this.func2 = function(){ 
     // do something 
    }; 

    window.addEventListener("event1", this.func2, true); 
}; 

Jetzt habe ich eine exit Funktion (die, wenn ich diese bestimmte Register verlassen genannt wird), von wo aus ich detachEvent() nenne, in dem ich meine Veranstaltung aus dem Fenster bin zu entfernen.

Test.prototype.exit = function(){ 
    this.detachEvent(); 
} 

Und meine detachEvent Funktion ist

Test.prototype.detachEvent() = function(){ 
    window.removeEventListener("event1", this.func2, true); 
} 

Nun ist das Problem entsteht, weil mein Code ist Teil eines größeren Projekts ist und irgendwie ist func1 zweimal aufgerufen wird. So wird event1 zweimal zum Fenster hinzugefügt. also keine doppelten Ereignis habe ich sogar versucht, detachEvent() Aufruf vor Ereignis Fenster wie

Test.prototype.func1 = function(){ 
    this.func2 = function(){ 
     // do something 
    } 
    this.detachEvent(); 
    window.addEventListener("event1", this.func2, true); 
} 

Aber das Ereignis nicht entfernt wurden, wenn detachEvent() von innen func1() Zugabe genannt wird immer, aber es ist zu arbeiten, wenn detachEvent() heißt immer von Ausgang().

Mein Code funktioniert in Fällen, in denen Ereignis nicht zweimal hinzugefügt wird, aber hier funktioniert es nicht. Ich bin nicht in der Lage, den Grund herauszufinden, und jede Hilfe wird sehr geschätzt.

Antwort

0

Wenn das Ereignis nur einmal hinzugefügt werden soll, müssen Sie ein Flag setzen, um zu verhindern, dass es erneut hinzugefügt wird. Etwas wie.

Test.prototype.func1 = function(){ 
    if (this._func2added) return; 
    this._func2added = true; 

    this.func2 = function(){ 
    // do something 
    } 

    window.addEventListener("event1", this.func2, true); 
} 

Und auf Ihrem Detaché die Flagge darauf.

+0

Hallo @Austio, Das macht die Sache funktioniert. Danke für den Vorschlag. Aber das ist eine Art Arbeit für das Problem. Aber ich habe mich gefragt, warum genau beim ersten Aufruf von detachEvent() das Ereignis nicht entfernt wird. Das ist die Krankheit. Aber danke für den Vorschlag. – Max

1

auf den Code der Suche kann ich sehen das Problem ist ‚this.func2‘ innerhalb zugewiesen ‚Test.prototype.func1‘ so, wenn Sie anrufen Funktion ‚func1‘ immer wieder es nur re- Zuweisen 'func2' immer wieder.Der beste Weg, um dieses Problem zu beheben ist,

func1

Test.prototype.func1 = function(){ 
    this.detachEvent(); 
    window.addEventListener("event1", this.func2, true); 
} 

Ausfahrt

Test.prototype.exit = function(){ 
     this.detachEvent(); 
} 

detachEvent

Test.prototype.detachEvent = function(){ 
    window.removeEventListener("event1", this.func2, true); 
} 

func2

Test.prototype.func2 = function(){ 
    // do something 
} 
0

Änderung der Zuhörer Sie Aktion:

alt:

youobject.addeventListener('something',unknownfunction); 

Verwendung dieses ist besser:

youobject.event1 = function { 
    //you code here 
} 

diese automatisch klar und legen Sie den Hörer .

1

Sie müssen den alten func2 Handler entfernen. Sie haben es bereits überschrieben, als Sie detachEvent von func1 aufrufen, also versucht es, eine Funktion zu entfernen, die nie installiert wurde, ohne den Ereignishandler zu beeinträchtigen.

Test.prototype.func1 = function() { 
    this.detachEvent(); // move here! 
    this.func2 = function(){ … }; 
    window.addEventListener("event1", this.func2, true); 
} 

Alternativ vergeben func2 innerhalb func1, aber die Eigenschaft einmal im Konstruktor initialisieren (oder sogar eine Prototyp-Methode machen). Auf diese Weise addEventListener wird sogar die gleiche Funktion zweimal registrieren.

Verwandte Themen