2010-12-22 11 views
5

Tengo controladores de eventos adjuntos a un formulario. El primero que dispara debe detener el otro evento si no se cumple una condición.Dos enviar controladores de eventos en un formulario. Uno debe detener el otro

El siguiente código no funciona, ya que ambos eventos se activarán. ¿Me puedes ayudar?

Gracias!

//fires first 
$("#myform").submit(function(){ 
    if (some validation) { 
    alert("You need to make the form valid"); 
    return false; 
    } 
}); 
//fires second 
$("#myform").submit(function(){ 
    //ajax stuff 
    return false; 
}); 

p.s. Tengo que hacer esto ya que las cosas de Ajax están en un complemento que no es modificable. No puedo evitar dos controladores de eventos

Respuesta

7

Eche un vistazo a event.stopImmediatePropagation():

queda con el resto de los manipuladores de ser ejecutado e impide el evento desde burbujeando el árbol DOM.

$("#myform").submit(function(event){ 
    if (some validation) { 
    event.stopImmediatePropagation(); 
    alert("You need to make the form valid"); 
    return false; 
    } 
}); 

También puede ser que desee utilizar event.preventDefault().

Actualización: Solo para aclarar: puede confiar en el orden en que se llaman los controladores de eventos. De bind método de jQuery:

Cuando un evento llega a un elemento, todos los manipuladores enlazada a ese tipo de evento para el elemento se disparan. Si hay varios controladores registrados, siempre se ejecutarán en el orden en que estaban vinculados. Después de que se hayan ejecutado todos los controladores, el evento continúa a lo largo de la ruta de propagación de eventos normales.

El orden puede no estar definido en la definición original del W3C, pero funciona con jQuery. De lo contrario, la función nombrada anteriormente no sería necesaria de todos modos;)

+0

¿cómo se asegura que se llamará primero a este controlador de eventos? – jrharshath

+0

@Here Be Wolves: se llamará a los controladores de eventos en el orden en que están adjuntos al elemento. –

+0

IMO, dependiendo del * orden * de los controladores de eventos es una * muy * mala idea. – jrharshath

2

En resumen, no. Si tiene dos controladores de eventos, entonces tiene dos controladores de eventos. Dicho esto, sin embargo, hay formas de evitarlo.

Primero, recuerde que la ejecución de javascript es de subproceso único. Si define una variable global, digamos var haveCalledSubmit=0;, puede usarla para sincronizar sus manejadores. Por ejemplo, si inicia cada función de controlador con esto:

if(haveCalledSubmit == 1)return haveCalledSubmit = 0; 
else haveCalledSubmit = 1; 

Entonces solo se llamará a uno de los dos controladores. Puede modificarlo fácilmente para que coincida con alguna condición, o para tratar con más de dos funciones.

Una alternativa es observar los modelos de propagación de eventos. This page le dará toda la información que necesita, aunque Felix ya ha mencionado un comando ajax que puede hacer lo que quiera.

Cuestiones relacionadas