2011-02-28 22 views
14

Tengo un campo de entrada, que tiene dos controladores de eventos vinculados a él.Orden de controlador de eventos de Javascript

Validar & guardado automático

Obviamente quiero validar antes de guardar. Si la validación falla, la clase "inválida" se agrega a la entrada y el autoguardado verificará esa clase antes de que continúe.

Esto funciona bastante bien, pero ¿hay alguna manera de garantizar la ejecución de la validación antes de guardar automáticamente en todos los casos?

Respuesta

12

Si usa JQuery para enlazar sus eventos, garantiza que los manipuladores se disparen en el mismo orden en que estaban vinculados. De lo contrario, el orden no está definido oficialmente.

Si no puede usar JQuery o un marco similar, puede simular fácilmente esto utilizando su propio enlace personalizado, donde su controlador genérico es una función que mantiene una serie de funciones y las llama en orden.

2

¿Por qué no adjuntar solo un manejador - Validate - y llamar al AutoSave desde adentro?

Para una respuesta a su pregunta que tampoco es una pregunta, vea this post o this one o this one.

+4

porque representan módulos separados, que pueden aparecer o no juntos. Escribirlos como una función única (lo cual es obvio) tiene el efecto de sobreencolar el código. –

+2

No estoy de acuerdo. Ellos * están * acoplados, como lo demuestra el hecho de que usted quiere que ocurra uno solo después de que el otro se ejecute. Ponerlos juntos en una función no * crea * ese acoplamiento. Lo reconoce. (En segundo lugar, solo porque los llame a ambos dentro de una función no significa que tengan que * siempre * ser llamados de esa manera. Pueden escribirse cada uno de una manera que preserve su independencia.) –

+0

Sé que esto es para siempre Hace tiempo, pero para agregar a esto, puede renombrar Validar para Validar y Guardar Automáticamente para implicar mejor su uso previsto porque parece que la validación implica el autoguardado, pero el autoguardado puede ocurrir de manera independiente sin asociación implícita. –

8

Normalmente, tendrá el controlador de eventos Save llamado Validate() que devolverá true si todo está bien y listo para ser guardado.

function onSaved() { 
    if (!validate()) { 
    // set class 
    return; 
    } 

    // do the save 
} 
0

Ya se ha respondido, pero para agregar este conocimiento, no se puede confiar en el orden de los controladores de eventos. Puede ser predecible en cualquier implementación dada, pero esto puede cambiar de una implementación (Javascript) a la siguiente y/o en el transcurso del tiempo. Lo único cierto es que todos serán ejecutados, pero no en qué orden.

Tenga en cuenta que la situación es similar cuando hay un controlador de eventos para un objeto DOM y otro para el mismo evento para un niño o padre - cuál de los ejecutada en primer lugar no siempre es clara también. Ver http://www.quirksmode.org/js/events_order.html

Cuestiones relacionadas