2012-08-03 16 views
10

agrego haga clic en eventos manejador de ElmentEsperar evento de clic para completar

$(".elem").click(function(){ 
     $.post("page.php".function(){ 
     //code1 
     }) 
}) 

y el disparador de eventos de clic

$(".elem").click(); 
//code2 

Cómo me aseguro de que Código2 ejecuta después Code1 ejecuta

+0

Defina lo que quiere decir con "código 1 se ejecuta". Tu código tiene un método ajax. Entonces, ¿quieres decir cuándo se ejecuta la llamada ajax o se ejecuta también ajax? – Rahatur

Respuesta

12

(Ignorando WebWorkers) JavaScript se ejecuta en un único hilo, por lo que puede estar seguro de que el código2 siempre se ejecutará después del código1.

A menos su Code1 hace algo asíncrona como una llamada Ajax o una setTimeout(), en cuyo caso se completará el controlador de clic disparada, entonces Código2 ejecutará, a continuación, (finalmente) la devolución de llamada de la llamada Ajax (o setTimeout(), o lo que sea) se ejecutará.

EDIT: Por su pregunta actualizada, Código2 siempre se ejecutará antes de Code1, ya que como he dicho anteriormente una devolución de llamada asincrónica Ajax ocurrirá más tarde (incluso si la respuesta Ajax es muy rápido, no va a llamar a la devolución de llamada hasta el JS actual termina).

"Cómo me aseguro de que Código2 ejecuta después Code1 ejecuta"

usando .click() sin params es un acceso directo a .trigger("click"), pero si en realidad se llama .trigger() explícitamente le puede proporcionar parámetros adicionales que se pasa al controlador, lo que le permite hacer esto:

$(".elem").click(function(e, callback) { 
    $.post("page.php".function(){ 
     //code1 

     if (typeof callback === "function") 
     callback(); 
    }); 
}); 

$(".elem").trigger("click", function() { 
    // code 2 here 
}); 

es decir, dentro de la prueba de controlador click si se ha pasado una función en el parámetro callback y, si es así, llámelo. Esto significa que cuando el evento ocurre "naturalmente" no habrá devolución de llamada, pero cuando lo desencadena programáticamente y pasa una función, entonces esa función se ejecutará. (Tenga en cuenta que el parámetro que pase con .trigger() no tiene que ser una función, puede ser cualquier tipo de datos y puede pasar más de un parámetro, pero para ello queremos una función. Consulte el .trigger() doco para obtener más información.)

demostración: http://jsfiddle.net/nnnnnn/ZbRJ7/1/

+2

No creo que sea cierto. No se ejecutarán al mismo tiempo, pero no creo que la API DOM proporcione ninguna garantía sobre el orden en el que se invocarán los controladores de eventos. Incluso si disparan en el orden correcto en una versión de un navegador, eso no es garantía de lo que sucederá en otros casos. –

+0

sí, tengo una llamada ajax [pregunta editada] –

+0

Gente, solo hay un controlador de eventos en la pregunta del OP. code2 simplemente lo desencadena. – JJJ

2

puede intentar escribir de esta manera:

$(".elem").live("click", function(){ 
    //code1 
}) 

Y, su disparo siempre se ejecutará como disparado.

2

Wrap code2 en el método y añadirlo como una devolución de llamada en el interior code1 por lo que siempre se llamará después code1 ejecuta

code2 = function(){/*code2*/}; 
$(".elem").click(function(){ 
    //code1 
    code2(); 
}) 
+0

eso no es una solución; quiero ejecutar el evento click en otros lugares sin el código 2 –

+1

Nunca mencionó que debería ser reutilizable. Lo anterior me parece una buena solución. –

+0

Nunca dijiste nada sobre eso Entonces lo asumí. Probablemente deba rechazar la pregunta por no ser claro, pero no voy a hacer eso porque eres nuevo. @JonasGeiregat: Gracias. – Gautam

-1

la ejecución de Javascript es línea por línea. Entonces, lo que sea que venga, se ejecutará primero. Entonces, agregar el código de clic antes que el otro método funcionará.

Además, si hay una llamada asíncrona, entonces tome una bandera que se establece solo cuando recibe la respuesta.

var clicked = false; $ ('# elem').haga clic en (función() { // haga algún proceso asincrónico clicked = verdadero; });

tiempo (! Hace clic) {// hacer nada}

// otra función que se llamará

O la segunda opción será, si se utiliza el método POST, establecer asíncrono = true en la propiedad.

+2

while (! Clicked) {} ​​hará que el navegador no responda ... –

+0

y creo que la segunda opción hará lo mismo hasta que se complete la solicitud posterior –

Cuestiones relacionadas