2008-11-20 16 views
6

Sé que podría hacer esto con cierres (auto var = presente) si el objeto era una función ...¿Se puede definir el controlador de eventos en el acceso literal al objeto javascript?

<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> 

Respuesta

3

Por lo tanto, la parte de control de eventos cables hasta bien (he comprobado yo mismo) pero, como su comentario indica que no tiene acceso a la propiedad "y" del objeto que acaba de definir.

Esto funciona:

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(); 

Hay otras formas de hacer esto también, pero esto funciona.

+0

Jason, puede cambiar la alerta (y); alertar (this.y) ;, y los resultados son los mismos: ya está llamando al controlador en el contexto del objeto, no es necesario pasar el argumento y como argumento. – Shog9

+0

Sí, veo eso. Debo abstenerme de publicar cuando estoy bajo la influencia de analgésicos. : P –

+0

Actualizado para reflejar que ... –

3

La forma más sencilla de obligar a la llamada a handle_click al objeto que se define en el que sería algo como esto:

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

Si tiene que pasar en los parámetros o si desea hacer la limpia mirada de código (por ejemplo, si se está configurando una gran cantidad de controladores de eventos similares), podría utilizar una técnica currying para lograr el mismo:

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

El problema no es la configuración del controlador onclick, que funciona bien. El problema es que cuando se ejecuta handle_click, no hay acceso al valor de la variable "y". –

+0

@Jason: ¿qué pasa con esto.y? – Shog9

+0

No funciona, lo probé y se devuelve indefinido debido a cómo funciona el controlador de eventos, "esto" se convierte en el elemento que desencadenó el evento click (al menos lo hace en FF3). –

0

Veo cómo hacerlo con la última de Jason. ¿Alguna forma de hacerlo sin la función anónima?

+0

Estás atascado con un cierre o una variable global. ¿Por qué levantarías la nariz en un cierre? Son una de las mejores características de JavaScript ... – Shog9

Cuestiones relacionadas