2012-05-18 19 views
9

Bir sınıf (veya işlev içeren bir nesne var; bir Javascript sınıfı diye bir şey olmadığını duydum) Foo adlı bir olay işleyicisine eklendim bir tıklama etkinliğine. Olay işleyici çağrıldığında, sınıfımın bir özelliğini değiştirmek istiyorum. Normalde, this anahtar sözcüğünü kullanırdım, ancak olay işleyicisinde, this başvurusu html öğesine yapılan referansa ayarlanır. İşte benim kodudur:Javascript olay işleyicisinden ana nesne/sınıf başvurusu alma

function Foo() { 

    this.num=0; 
    $('element').click(this.eventHandler);// jQuery to attach an onclick event to my element. 

    this.eventHandler=function() { 
     this.num++;// This doesn't work. 
     // Normally, "this" would refer to my instance of Foo, 
     // but as an event handler, "this" refers to the html element. 
    } 
} 

Benim soru: Ben özelliklerini (num benzeri) modiiye nasıl benim olay işleyicisi içine Foo benim örneği başvurusu alabilirim?

cevap

13
function Foo() { 
    var _self = this; 
    this.num=0; 

    $('element').click(this.eventHandler);// jQuery to attach an onclick event to my element. 

    this.eventHandler=function() { 
     _self.num++; 
    } 
} 

kullanım dış kapsam

+1

Nesnenin serbest bırakılması gerekirse bu çözüm bellek sızıntısına neden olmaz mı? –

1

Size olay işleyicisi erişebileceği yapıcı içinde this bir başvuru saklayabilirsiniz tanımlanan referans _self = this.

function Foo() { 

    this.num=0; 
    $('element').click(this.eventHandler);// jQuery to attach an onclick event to my element. 

    var that = this; 
    this.eventHandler=function() { 
     that.num++;// This doesn't work. 
    } 
} 
13

İşlevin bağlamını bağlamanız gerekir; Ayrıca Function.prototype.bind kullanabilirsiniz modern tarayıcıda

$('element').click($.proxy(this.eventHandler, this)); 

:

$('element').click(this.eventHandler.bind(this)) 
+0

Bu gerçekten kabul edilen cevap olmalıdır. Kapatma her zaman bir seçenek olmadığı için daha sağlamdır. –

2
function Foo() { 
    this.num=0; 
    $(document).on('click', 'element', this, this.eventHandler); 
    this.eventHandler=function(e) { 
     var _this = e.data; 
     _this.num++; 
    } 
} 

1) olay dinleyicileri eklemek için() yöntemine JQuery kullanın aksi this küresel nesne olacak. 2) Ebeveyn sınıfına erişmek için bir referans kullanın.

İlgili konular