2012-10-04 14 views
6
function Foo(elementId, buttonId) { 
this.element = document.getElementById(elementId); 
this.button = document.getElementById(buttonId); 
this.bar = function() {dosomething}; 
this.button.addEventListener('click', function(e) {this.bar();}, false); 
} 

var myFoo = new Foo('someElement', 'someButton'); 

Chciałbym dodać detektory zdarzeń wewnątrz mojego konstruktora, ale to nie działa. Czy jest to możliwe dzięki poprawnej składni? Zawsze się powiesił na linii:Dodawanie odbiorców zdarzeń w konstruktorze

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

Odpowiedz

5

Twoje this zmian wartości w konstruktorze. Możesz zachować referencję w selektorze i użyć referencji.

function Foo(elementId, buttonId) { 

    /*...*/ 

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

lub bardziej nowoczesne rozwiązanie, które nie wymaga zmienna byłoby użyć Function.prototype.bind.

function Foo(elementId, buttonId) { 

    /*...*/ 

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

.bind Metoda zwraca nowy bar funkcji z wartością this związany cokolwiek go minęła. W tym przypadku jest on powiązany z oryginałem this od konstruktora.

+1

Ważne, aby pamiętać, że wiele często używanych przeglądarek (np. IE 8, Safari <= 5.1, inne) nie obsługuje Function.prototype.bind: http://kangax.github.com/es5-compat-table/ – zachelrath

+0

var self = this; To się udało; Nie sądziłem nawet, że "to" może odwoływać się do elementu przycisku. Dziękuję za pomoc i szybką odpowiedź. Brałabym udział, gdybym mógł, ale nie mam jeszcze przedstawiciela :) –

+1

@Llepwryd: Cieszę się, że mogłem pomóc. –

1

this w obsługi zdarzeń jest elementem, że zdarzenie zostało dodane do.

Aby uzyskać dostęp do zewnętrznego this, należy zapisać go w oddzielnej zmiennej.

0

this w obsługi click nie jest elementem przycisk przedmiot, należy użyć zmiennej odniesienia do obiektu, jak 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); 
} 
Powiązane problemy