2009-05-27 13 views
5

Estoy usando jQuery y tengo una función que sirve como devolución de eventos de eventos, y en esa función "this" representa el objeto que capturó el evento. Sin embargo, hay una instancia en la que deseo llamar a la función explícitamente desde otra función: ¿cómo puedo establecer qué "esto" será igual dentro de la función en este caso?Al llamar a una función de Javascript, ¿cómo configuro un valor personalizado de "esto"?

Por ejemplo:

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

Respuesta

12

Uso applycall.

handleEvent.call(this, e); 
+3

Alternativa: use call(), que es exactamente lo mismo que apply() excepto que pasa una serie de argumentos en lugar de una matriz de argumentos. (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/call) –

+1

apply() y call() son exactamente lo que estaba buscando (aunque en el código de la respuesta anterior, debería ser [ e] porque, como dijo Daniel, apply() toma una matriz de argumentos). – Charles

+0

Gracias por la corrección. Actualicé la respuesta. –

4

Sólo parametrizar la función que le interesa:

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 ... me gustó. Buen trabajo. – simplyharsh

+2

No puedo creer que las personas voten por la respuesta de Patrick, que es exactamente lo que se necesita para la pregunta original. Así es como jQuery asigna la palabra clave 'this' en el código al que llama, y ​​debería ser la forma en que se hace esto. Cambiar los parámetros de una función para acomodar algo que se realiza fácilmente mediante funciones incorporadas y comúnmente entendidas es una situación en la que la cola mueve al perro ... –

+2

Supongo que esto solo demuestra que hay mucha gente que No crees en JavaScript y tal vez el uso de bibliotecas como jQuery ha asegurado su ignorancia, ya que no se toman el tiempo para entender realmente el lenguaje en sí. –

1

Uso

e.target 
1

Te recomiendo que vuelvas a factorizar tu función como un complemento de jQuery.

Pero aquí es una solución rápida:

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

+1 aplicar parece apropiado – annakata

+0

¿Por qué la refactorización como un complemento jQuery sería una mejor opción que usar call()? – Charles

+0

Charles porque entonces se puede usar universalmente en todos los objetos jquery, como $ ("div"). HandleEvent() o $ (this) .handleEvent(), además obtendrás el beneficio adicional de poder encadenar funciones también . – duckyflip

0

Si usted está buscando simplemente llamar a un solo controlador de eventos como si estuviera siendo activado normalmente, apply/call no tendrán ningún problema. Sin embargo, dependiendo de sus necesidades, puede ser más robusto para utilizar la versión sin argumentos de la función de jQuery click(), lo que dará lugar todos clic manipuladores de ese elemento:

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