2009-07-25 11 views
12

Estoy tratando de ejecutar una función externa al hacer clic en un elemento DOM sin envolverlo en otra función.¿Cómo puedo ejecutar una función externa cuando se hace clic en un elemento?

Digamos que tiene una función llamada sayHello(), de la siguiente manera:

function sayHello(){ 
    alert("hello"); 
}; 

para ejecutarlo en el clic, actualmente tengo que hacer esto:

$("#myelement").click(function(){ 
    sayHello(); 
}); 

Aviso Me veo obligado a envolver el único llamada de función en otra función más. Lo que estoy tratando de hacer es algo como esto

$("#myelement").click(sayHello()); 

Excepto que simplemente no funciona. ¿Puedo evitar envolver la llamada de función única en otra función de alguna manera? Gracias!

.

Información adicional: ¿Cómo puedo lograr lo mismo cuando necesito pasar parámetros a la función?

..

Información adicional: Al igual que Chris Brandsma y Jani Hartikainen señalaron, uno debe ser capaz de utilizar la función se unen para pasar parámetros a la función sin envolverlo en otra función anónima como tal:

$("#myelement").bind("click", "john", sayHello); 

con sayHello() ahora aceptar un nuevo parámetro, como tal:

function sayHello(name){ 
    alert("Hello, "+name); 
} 

Esto, lamentablemente, no parece funcionar ... ¿Alguna idea? La documentación de Eventos/enlace se encuentra here ¡Gracias!

+0

¿Cuál es su carne con funciones de envolver? No es un golpe de rendimiento (bueno, nanosegundos tal vez). Es un poco detallado, pero me parece útil hacer esto y mantener todo consistente. En el momento en que necesites agregar un parámetro o llamar a más de una función, necesitarás agregar el contenedor nuevamente en ... – DisgruntledGoat

+1

, supongo que solo quiero tenerlo en una línea y soy OCD así ... :) –

Respuesta

19

Para recoger de una pregunta que tenía allí.

Obviamente, es necesario llamar a esta forma de trabajar:

$("#myelement").click(sayHello); 

llamadas de la manera que lo tenía realmente ejecuta el método en lugar de enviar el método para el controlador de clic.

Si necesita pasar datos también se puede llamar al método de esta manera:

$("#myelement").click(function(){ sayHello("tom");}); 

O puede pasar datos a través de la función

function sayHello(event){ alert("Hello, "+event.data); } 

$("#myelement").bind("click", "tom", sayHello); 

bind() O bien, puede recuperar los datos desde el elemento que se hizo clic en

$("#myelement").click(function(){sayHello($(this).attr("hasData");});. 

Espero que ayude.

+0

se deduce de la documentación "Eventos/encuadernación" en el sitio web jQuery que este $ ("# myelement") bind ("click", "tom", sayHello); debería hacer lo que estoy buscando ... al intentarlo, parece que no funciona. Voy a publicar información adicional en la pregunta original en un segundo –

+0

enviado información adicional! –

+1

@yuval: ¡lee los documentos con más cuidado!El valor pasado a 'bind()' en el parámetro 'data' se pasa a su manejador a través de' event.data' - necesita interpretar el primer parámetro a su función como un objeto 'event', y mira los' datos 'propiedad! – Shog9

8

que está llamando la sayHello-función, puede pasarlo por referencia mediante la eliminación de los paréntesis:

$("#myelement").click(sayHello); 

Editar: Si necesita pasar parámetros a la sayHello-función, se necesitarán envuélvalo en otra función. Esto define una nueva función sin parámetros que llama a su función con los parámetros previstos en la creación de tiempo:.

$("#myelement").click(function() { 
    sayHello('name'); 
    // Creates an anonymous function that is called when #myelement is clicked. 
    // The anonymous function invokes the sayHello-function 
}); 
+0

Esto realmente funciona, pero ¿qué hago en una situación en la que tengo parámetros para pasar a la función? es decir, $ ("# myelement"), haga clic en (digaHello ("john")); ? gracias! –

+1

En ese caso, se verá obligado a envolverlo. Alternativamente, algunas bibliotecas como Prototype proporcionan un método bind() que funciona algo así como sayHello.bind (this, param1, param2). Sin embargo, hace exactamente lo mismo que envolverlo. –

+0

hey jani, parece que esto debería funcionar también con la función bind de jQuery, pero no es así. Por favor, consulte la información adicional a la pregunta. ¡Gracias! –

4

$ ("# MyElement") y haga clic (sayHello());

Esto realmente llama al sayHello() antes de configurar el controlador click. ¡Está intentando establecer el valor de retorno de sayHello() como la función de devolución de llamada!

su lugar, tratar:

$("#myelement").click(sayHello); 

Y con respecto a su edición, si necesita pasar parámetros sólo se puede utilizar la técnica de cierre ya está usando, pero si usted está buscando algo más limpio entonces cheque How can I pass a reference to a function, with parameters?

0

Sí, en lugar de pasar sayHello(), simplemente pase el nombre de la función.

$("#myelement").click(sayHello); 
1

¿qué parámetros estarías pasando en el momento del clic? si sabe de antemano cuáles son, puede configurarlos antes de que el usuario haga clic.

no se puede pasar parámetros, pero se puede falsificar el parámetro cosa por miembros simplemente añadiendo al objeto que está disparando el evento, por lo ..

myObject.onClick = sayHello; 
myObject.param1 = "foo"; 

entonces, cuando se está llamando a este

function sayHello(){ 
    alert(this.param1); 
} 
+0

No es una respuesta directa a la pregunta (ya que está usando jQuery), pero votó a favor porque es una gran sugerencia de JavaScript, no obstante. – DisgruntledGoat

+0

idea interesante, pero no exactamente lo que estoy buscando ... –

+0

En mi humilde opinión, esto es mucho menos limpio que un simple cierre ... en el mejor de los casos, tiene el trabajo adicional de establecer propiedades de expansión en el objeto DOM, y en el peor ¡podrías encontrar colisiones de nombres con propiedades integradas! – Shog9

Cuestiones relacionadas