2009-05-27 12 views
5

Sto usando jQuery e ho una funzione che funge da callback di un evento, quindi in tale funzione "this" rappresenta l'oggetto che ha catturato l'evento. Tuttavia, c'è un'istanza in cui voglio chiamare la funzione esplicitamente da un'altra funzione: come posso impostare cosa "questo" sarà uguale nella funzione in questo caso?Quando si chiama una funzione Javascript, come si imposta un valore personalizzato di "this"?

Ad esempio:

function handleEvent(event) { 
    $(this).removeClass("sad").addClass("happy"); 
} 

$("a.sad").click(handleEvent); // in this case, "this" is the anchor clicked 

function differentEvent(event) { 
    $("input.sad").keydown(e) { 
     doSomeOtherProcessing(); 
     handleEvent(e); // in this case, "this" will be the window object 
         // but I'd like to set it to be, say, the input in question 
    } 
} 

risposta

12

Usa applycall.

handleEvent.call(this, e); 
+3

Alternativa: usa la chiamata(), che è esattamente la stessa di apply() eccetto che passi una serie di argomenti invece di una matrice di argomenti. (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/call) –

+1

apply() e call() sono esattamente ciò che stavo cercando (sebbene nel codice della risposta sopra, dovrebbe essere [ e] perché, come ha detto Daniel, apply() prende una serie di argomenti). – Charles

+0

Grazie per la correzione. Ho aggiornato la risposta. –

4

Proprio parametrizzare la funzione che ti interessa:

function doStuff(el) { 
    $(el).removeClass("sad").addClass("happy"); 
} 

function handleEvent(event) { 
    doStuff(this); 
} 

$("a.sad").click(handleEvent); // in this case, "this" is the anchor clicked 

function differentEvent(event) { 
    $("input.sad").keydown(e) { 
     doSomeOtherProcessing(); 
     doStuff(this); 
    } 
} 
+0

lolz ... mi è piaciuto. Bel lavoro. – simplyharsh

+2

Non riesco a credere che la gente stia rivalutando la risposta di Patrick, che è esattamente ciò che è necessario per la domanda originale. Ecco come jQuery assegna la parola chiave "this" nel codice che chiama e dovrebbe essere il modo in cui viene eseguita. Cambiare i parametri di una funzione per adattarsi a qualcosa che viene facilmente eseguito da funzioni incorporate e comunemente capite è un caso della coda che scuote il cane ... –

+2

Immagino che questo dimostri solo che ci sono molte persone che non batti JavaScript e forse l'uso di librerie come jQuery ha assicurato la loro ignoranza, dal momento che non si prendono il tempo per capire veramente il linguaggio stesso. –

1

Usa

e.target 
1

Mi piacerebbe consigliare di ri-factoring la funzione come un plugin jQuery.

ma qui è una soluzione rapida:

handleEvent.apply(this,e) //transfers this from one scope, to another 
+0

+1 sembra appropriato – annakata

+0

Perché il refactoring come plug-in jQuery può essere un'opzione migliore rispetto all'utilizzo di call()? – Charles

+0

Charles perché quindi può essere utilizzato universalmente su tutti gli oggetti jQuery, come $ ("div"). HandleEvent() o $ (this) .handleEvent(), in più si otterrà il vantaggio in più di essere in grado di concatenare anche le funzioni . – duckyflip

0

Se si sta semplicemente cercando di chiamare un singolo gestore di eventi, come se venisse attivato normalmente, apply/call funzionerà benissimo. Tuttavia, a seconda delle esigenze, può essere più robusto per utilizzare la versione zero argomento della funzione di jQuery click(), che attiverà tutti i click gestori per quell'elemento:

function differentEvent(event) { 
    $("input.sad").keydown(e) { 
     doSomeOtherProcessing(); 
     $(this).click(); // simulate a click 
    } 
} 
Problemi correlati