2012-04-25 10 views
7

cómo pasar un parámetro al controlador de un evento?cómo pasar un parámetro al controlador de un evento

aquí es lo que estoy tratando de hacer, no funciona:

for (var i = 0; i < myobj.length; i++) { 
myobj[i].onmouseover = myfun(myobj[i]); 
} 

el siguiente no funciona ninguno.

myobj[i].onmouseover = myfun.call(myobj[i]); 
myobj[i].onmouseover = function() {myfun(myobj[i]);}; 
myobj[i].onmouseover = function() {myfun.call(myobj[i]);}; 

Estoy principalmente interesado en por qué no funciona, y solución en el mismo estilo.

Gracias.

Respuesta

9

Simplemente use una función de creador para que sus manejadores encapsulen el parámetro para transmitir.

function createHandler(param) { 
    return function() { 
    myfun(param); 
    } 
} 

for (var i = 0; i < myobj.length; i++) { 
    myobj[i].onmouseover = createHandler(myobj[i]); 
} 

La razón por la que su enfoque no funciona es porque no pasa en una referencia de función, sino el resultado de una llamada de función. Por lo tanto, en su primer ejemplo, se evalúa myfun(myobj[i]) y el resultado se transfiere como el controlador de eventos.

Creo que lo que realmente quiere decir es que, en caso de que se dispare el evento, se evaluará la función. Para hacerlo, debe pasar el parámetro a través de var global o como dataset property.

La solución de limpieza, sin embargo, es tener una función de generador como se muestra arriba.

+0

muchas gracias. Exactamente lo que necesitaba –

+0

Pregunta de seguimiento de PS. Soy lo que estoy haciendo bien, ¿hay una manera idiomática de hacer esto? básicamente tengo un montón de elementos span.xyz, quiero que todos ellos tengan un comportamiento mouseover. (pero no usa JQuery ni ningún otro) –

+1

@ XahLee Siempre que no esté utilizando ninguna biblioteca, creo que es la mejor aplicación. – Sirko

3

Otro enfoque es usar el hecho de que onmouseover se invocará como un método (no una función) en el elemento DOM que dispara el evento.

En otras palabras, escribir el código como si esperaba a alguien para hacer esto:

obj = xahlees(); 
obj.onmouseover(); 

he aquí una solución:

for (var i = 0; i < myobj.length; i++) { 
    myobj[i].onmouseover = function() { myFun(this) }; 
} 

He subido un more complete example.

+0

un poco tarde, pero esa también es una gran solución. Gracias Leonel. –

Cuestiones relacionadas