2012-04-25 21 views
7

come passare un parametro al gestore di un evento?come passare un parametro al gestore di un evento

ecco cosa sto cercando di fare, non funziona:

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

seguente non funziona nessuno dei due.

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

Sono interessato principalmente al motivo per cui non funziona e alla soluzione nello stesso stile.

Grazie.

risposta

9

Basta usare una funzione di creazione per i gestori per incapsulare il parametro da trasmettere.

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

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

Il motivo per il vostro approccio non funziona è perché non si passa su un riferimento alla funzione, ma il risultato di una chiamata di funzione. Quindi nel tuo primo esempio viene valutato myfun(myobj[i]) e il risultato viene passato come gestore di eventi.

Penso che ciò che intendete veramente sia che, nel caso in cui l'evento venga attivato, la funzione deve essere valutata. Per fare ciò, è necessario passare il parametro tramite qualche variabile globale o come dataset property.

La soluzione di pulizia, tuttavia, deve avere una funzione di generatore come mostrato sopra.

+0

grazie mille. Esattamente quello di cui avevo bisogno. –

+0

Domanda di follow up PS. Sono quello che sto facendo ok, c'è un modo idiomatico per fare questo? fondamentalmente ho un sacco di elementi span.xyz, voglio che tutti abbiano un comportamento mouseover. (ma non usando JQuery o qualsiasi altro) –

+1

@XahLee Finché non utilizzi alcuna libreria, penso, questo è il miglior appraoch. – Sirko

3

Un altro approccio è quello di utilizzare il fatto che onmouseover sarà richiamata come metodo (non una funzione) sull'elemento DOM che genera l'evento.

In altre parole, scrivere il codice, come se vi aspettavate qualcuno per fare questo:

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

Ecco una soluzione:

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

Ho caricato un more complete example.

+0

in ritardo, ma è anche un'ottima soluzione. Grazie Leonel. –

Problemi correlati