2009-10-13 7 views
6

Cuando intento para unir las funciones de controlador de eventos con parámetros como:caso el acceso a objetos en el controlador de eventos

myhandle.onclick = myfunction(param1,param2); 

function myfunction(param1,param2){ 
} 

Ahora quiero para acceder al objeto de evento en mi función de controlador. Hay un enfoque mencionado en la web de envío de objeto de evento, como:

myhandle.onclick = myfunction(event,param1,param2); 

Pero su objeto suceso en el que no definido cuando me probarlo.

Sé que las bibliotecas facilitan esto pero estoy buscando una opción JS nativa.

Respuesta

4

No estoy del todo seguro de lo que estás tratando de hacer, pero tal vez algo así es lo que estás buscando?

function myfunction(param1, param2){ 
    return function(event) { 
     // For compatibility with IE. 
     if (!event) { 
      event = window.event; 
     } 

     alert("event = " + event + ", param1 = " + param1 + ", param2 = " + param2); 
    }; 
} 

myhandle.onclick = myfunction(param1, param2); 

El resultado final de esto es que la función anónima interior de myfunction será llamado como el controlador de onclick, lo que resulta en el caso más los dos parámetros que se está imprimiendo. Los dos parámetros se corrigen en el momento en que se agrega el controlador de eventos, mientras que event cambiará cada vez que el usuario haga clic en myhandle.

0

Prueba esto:

if (!event) { event = window.event; } 

interior de mifuncion().

7

myhandle.onclick = myfunction (param1, param2);

Este es un error de principiante común a nivel de JavaScript, y no es algo que las bibliotecas realmente puedan arreglar para usted.

No está asignando myfunction como un controlador de clic, que son llamandomyfunction, con param1 y param2 como argumentos, y asignar el valor de retorno de la función a onclick. myfunction no devuelve nada, por lo que estaría asignando undefined a onclick, que no tendría ningún efecto ..

Lo que quiere decir es asignar una referencia a sí mismo myfunction:

myhandle.onclick= myfunction; 

Para superar la función algunos argumentos adicionales que tiene que hacer un cierre que contiene sus valores, que normalmente se realiza con una función en línea anónima. Puede hacerse cargo de transmitir el evento en demasiado si es necesario (aunque en cualquier caso se necesita un plan de copia de seguridad para IE en el que el objeto de evento no se pasa como argumento):

myhandle.onclick= function(event) { 
    myfunction(param1, param2, event); 
}; 

En ECMAScript quinta edición, la cual será la futura versión de JavaScript, puede escribir esto aún más fácil: (. window con ser un valor ficticio para this que no se necesita en este caso)

myhandle.onclick= myfunction.bind(window, param1, param2); 

sin embargo, desde muchos de los navegadores de hoy no Para admitir la Quinta Edición, si desea utilizar este método, debe proporcionar una implementación para navegadores más antiguos.Algunas bibliotecas ya incluyen una; aquí hay otro independiente.

if (!('bind' in Function.prototype)) { 
    Function.prototype.bind= function(owner) { 
     var that= this; 
     var args= Array.prototype.slice.call(arguments, 1); 
     return function() { 
      return that.apply(owner, 
       args.length===0? arguments : arguments.length===0? args : 
       args.concat(Array.prototype.slice.call(arguments, 0)) 
      ); 
     }; 
    }; 
} 
+0

muchas gracias! esto explica maravillosamente. – Rajat

Cuestiones relacionadas