2008-11-20 6 views
6

So che potrei fare questo con chiusure (var auto = questo) se oggetto era una funzione ...È possibile definire il gestore di eventi all'interno dell'accesso letterale dell'oggetto javascript stesso?

<a href="#" id="x">click here</a> 

<script type="text/javascript"> 
    var object = { 
     y : 1, 

     handle_click : function (e) { 
      alert('handling click'); 

      //want to access y here 

      return false; 
     }, 

     load : function() { 
      document.getElementById('x').onclick = this.handle_click; 
     } 
    }; 

    object.load(); 
</script> 

risposta

3

Così, i fili della parte del gestore di eventi più che bene (ho provato io stesso), ma, come il tuo commento indica che non hai accesso alla proprietà "y" dell'oggetto appena definito.

Questo funziona:

var object = { 
    y : 1, 
    handle_click : function (e) { 
    alert('handling click'); 

    //want to access y here 
    alert(this.y); 

    return false; 
    }, 
    load : function() { 
    var that = this; 
    document.getElementById('x').onclick = function(e) { 
     that.handle_click(e); // pass-through the event object 
    }; 
    } 
}; 
object.load(); 

Ci sono altri modi di fare anche questo, ma questo funziona.

+0

Jason, è possibile modificare l'avviso (y); per avvisare (this.y); e i risultati sono gli stessi - stai già chiamando il gestore nel contesto dell'oggetto, non c'è bisogno di passare in y come argomento. – Shog9

+0

Sì, lo vedo. Devo trattenermi dal postare quando sono sotto l'influenza di antidolorifici. : P –

+0

Aggiornato per riflettere che ... –

3

Il modo più semplice per legare la chiamata al handle_click all'oggetto è definito in sarebbe qualcosa di simile:

 var self=this; 
     document.getElementById('x').onclick = 
      function(e) { return self.handle_click(e) }; 

Se è necessario passare nei parametri o vuole fare il pulitore di codice sguardo (per esempio, se si sta impostando un sacco di gestori di eventi simili), si potrebbe utilizzare una tecnica currying per ottenere lo stesso:

bind : function(fn) 
{ 
    var self = this; 
    // copy arguments into local array 
    var args = Array.prototype.slice.call(arguments, 0); 
    // returned function replaces first argument with event arg, 
    // calls fn with composite arguments 
    return function(e) { args[0] = e; return fn.apply(self, args); }; 
}, 

...

 document.getElementById('x').onclick = this.bind(this.handle_click, 
      "this parameter is passed to handle_click()", 
      "as is this one"); 
+0

Il problema non è l'impostazione del gestore onclick, che funziona correttamente. Il problema è che quando viene eseguito handle_click, non è possibile accedere al valore della variabile "y". –

+0

@Jason: cosa c'è di sbagliato in questo? – Shog9

+0

Non funziona: l'ho testato e torna non definito a causa di come funziona il gestore di eventi, "questo" diventa l'elemento che ha generato l'evento click (almeno lo fa in FF3). –

0

Vedo come farlo con l'ultima di Jason. Un modo per farlo senza la funzione anonima?

+0

Sei bloccato con una chiusura o una variabile globale. Perché dovresti girare il naso a una chiusura? Sono una delle migliori caratteristiche di JavaScript ... – Shog9