2013-07-16 2 views
6

simuliert ich eine Klasse in Java-Skript, es ist Code ist hier:Wie übergibt man eine Variable mit einem Event-Handler in Javascript?

function myclass() 
{ 
    this.count ; 

    this.init = function(){ 
     $("div.mybtn").click({n:this},function(e){ 
      e.data.n.count++; 
     }); 
    } 

    this.getCount = function(){ 
     alert(this.count); 
    } 
} 

Dann habe ich eine Instanz dieser Klasse und ausgeführt, es ist Methode init(), aber wenn ich auf jedem div.mybtn Element klicken, wird es erhöht nicht die Wert von this.count.
Es scheint, dass das Objekt this an den Ereignishandler nach Wert nicht durch Verweis übergeben wurde.
Wie kann ich eine Variable an einen Event-Handler als Referenz übergeben?

Vielen Dank für jede Hilfe

Antwort

2

Javascript verfügt nicht über Parameter für die Übergabe als Referenz. Für das, was Sie wollen, sollten Sie eine Verschluss Variable verwenden:

this.init = function(){ 
    var self = this; 
    $("div.mybtn").click(function(){ 
     self.count++; 
    }); 
} 
1

Sie können eine Bindefunktion schreiben und den Kontext mit dem Ereignishandler verknüpfen.

Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift(); 

    return function(){ 
     fn.apply(object, args.concat(Array.prototype.slice.call(arguments))); 
    } 
} 

function myclass() 
{ 
    this.count ; 

    this.clicked = function(){ 
     this.count++;  
    }; 

    this.init = function(){ 
     $("div.mybtn").click(this.clicked.bind(this)); 
    } 

    this.getCount = function(){ 
     alert(this.count); 
    } 
} 
4

Sie können undefined nicht erhöhen, müssen Sie irgendwo anfangen:

function myclass() { 
    this.count=0; // start counting at zero !!! 

    this.init = function(){ 
     $("div.mybtn").on('click', {n:this},function(e){ 
      e.data.n.count++; 
      e.data.n.getCount(); 
     }); 
    } 

    this.getCount = function(){ 
     console.log(this.count); 
    } 
} 

var c = new myclass(); 

c.init() 

DEMONSTRATION

+0

ich auch getestet und Arbeiten Alles gut. – adeneo