2012-10-04 7 views
6

Ich möchte Ereignis-Listener in meinem Konstruktor hinzufügen, aber es scheint nicht zu funktionieren. Ist das mit der richtigen Syntax möglich? Ich bekomme immer auf der Linie aufgehängt:Hinzufügen von Ereignis-Listenern im Konstruktor

this.button.addEventListener('click', function(e) {this.bar();}, false); 

Antwort

5

Ihre this Wertänderungen im Konstruktor. Sie können eine Referenz im Selektor beibehalten und die Referenz verwenden.

function Foo(elementId, buttonId) { 

    /*...*/ 

    var self = this; 
    this.button.addEventListener('click', function(e) {self.bar();}, false); 
} 

Oder eine modernere Lösung, die keine Variable Function.prototype.bind wäre die Verwendung erfordert.

function Foo(elementId, buttonId) { 

    /*...*/ 

    this.button.addEventListener('click', this.bar.bind(this), false); 
} 

Die .bind Methode gibt eine neue bar Funktion mit dem Wert this gebunden, was auch immer Sie es übergeben. In diesem Fall ist es vom Konstruktor an das Original this gebunden.

+1

Wichtig zu beachten, dass viele noch immer häufig verwendete Browser (zB IE 8, Safari <= 5.1, andere) Function.prototype.bind nicht unterstützen: http://kangax.github.com/es5-compat-table/ – zachelrath

+0

var selbst = das; Das hat es getan; Ich habe nicht einmal gedacht, dass "das" auf das Button-Element verweist. Danke für Ihre Hilfe und die schnelle Antwort. Ich würde upvote, wenn ich könnte, aber ich habe noch nicht die rep :) –

+1

@Llepwryd: Froh, dass ich helfen konnte. –

1

this im Ereignishandler ist das Element, dass das Ereignis hinzugefügt wurde.

Um auf die äußere this zuzugreifen, müssen Sie sie in einer separaten Variablen speichern.

0

this in dem Klick-Handler die Schaltfläche Element ist nicht das Objekt, verwenden Sie eine Variable, das Objekt zu verweisen, wie var self = this;

function Foo(elementId, buttonId) { 
    var self = this; 
    this.element = document.getElementById(elementId); 
    this.button = document.getElementById(buttonId); 
    this.bar = function() {dosomething}; 
    this.button.addEventListener('click', function(e) {self.bar();}, false); 
} 
Verwandte Themen