2011-04-30 20 views
5

Pongo mi código de prueba en jsfiddle. Por favor compruébelo hereValidación de formulario jQuery: ¿por qué valida dos veces?

Cuando presiono el botón de enviar ¿por qué recibo dos veces el mensaje de alerta?

+0

No me parece un problema. No debe hacer nada en la función requerida que no sea simplemente verificar que los datos necesarios estén ingresados ​​y sean válidos. No sabes cuántas veces se llamará. – AndrewR

+0

@AndrewR Estoy haciendo mucha validación condicional, por lo que REQUIERE preocuparse de cómo debe llamarse la función requerida ... – Vikas

+0

¿Está realmente cambiando datos u otra cosa que podría causar que falle la segunda validación en caso de que se llame más de una vez? ? – AndrewR

Respuesta

0

Por lo que puedo decir, es porque tiene un botón del tipo "enviar". Por lo tanto, la validación jQuery se ejecuta dos veces; una vez cuando la entrada de texto pierde el foco, y nuevamente cuando la página se vuelve a cargar. Si me equivoco, espero que alguien me corrija, pero cuando cambié el botón para escribir "botón", la alerta doble parece desaparecer.

HTH.

EDIT: Bueno, parece que estaba equivocado, así que ignore los consejos anteriores. Debe haber sido una peculiaridad temporal del navegador que estaba usando.

+1

no funcionó al cambiar el tipo enviar al botón –

+0

¿Borró su caché? Puede estar trabajando con una versión almacenada en caché de su JavaScript. –

+0

@mahesh es correcto, si llamo al método form.valid(), de nuevo alerta dos veces. – Vikas

4

Está malutilizando la función de validar y como aludió AndrewR. Hay muchas cosas que cambiarán la cantidad de veces que se llama a la función de validación. En su ejemplo, la "regla" (que es una función en su caso) está siendo llamado en:

  • texto1 deja de estar seleccionado (si el valor ha cambiado)
  • botón de envío clic
  • formulario presentado
  • forma cargada

Esto es correcto tan bueno validación se mostrará errores en el campo que acaba de editar cuando se mueve fuera de él, así como una serie de otros eventos.

Si desea realizar funciones en la validación de un campo específico, es una buena práctica agregar una devolución de llamada OnValidating para ejecutar sus métodos personalizados en el campo. Las reglas deben ser simplemente reglas y no métodos, para eso están las devoluciones de llamadas (y sí, la devolución de llamada también se ejecutará varias veces porque muchos eventos activan el método de validación).

Si realmente necesita esto para disparar una sola vez y sólo en forma de presentar, a continuación, deshabilitar el comportamiento de validación por defecto y añadir una validación manual() llamar como la siguiente:

$("#test1").submit(function() { 
    $("#test1").validate(); 
}); 

plana a cabo en estos momentos, pero puedo regresar y proporcionar un ejemplo de esto si lo necesita.

PD: Otra forma famosa de activar dos eventos es unir un evento dos veces. Si no está seguro de cómo se inicializarán las páginas, a menudo es más seguro "desvincular" un evento antes de vincularlo. Definitivamente este no es el problema en su caso, pero puede surgir cuando intenta solucionar su problema y puede causar confusión - lo he hecho en el pasado :)

1

Esto no es una respuesta, es una solución .

Como este es el primer resultado que apareció en Google, voy a publicarlo aunque probablemente ya no le importe la respuesta.

También estoy usando jQuery y el complemento jQuery validate. Estaba ejecutando un poco de código ajax en una de mis reglas y, siendo el novato ajax, lo pongo en alerta para poder ver lo que sucedía debajo del capó.

La alerta se disparó dos veces, lo cual era un problema porque eso es el doble del tráfico que realmente necesitaba. Entonces comencé a hurgar en internet por una razón/solución. Sabía que quería mantener la validación en foco, así que evité inhabilitarlo el mayor tiempo posible.

Cuando finalmente cedí y lo deshabilité, esto es lo que aprendí. Desactivar onfocusout en realidad no parece deshabilitar la función, pero evita que se active dos veces. A partir de mi código de validación con esto ...

$("#FORMNAME").validate({ 
    onkeyup: false, 
    onfocusout: false, 

... en realidad no detiene la validación se dispare después de haber hecho clic en el botón de la primera vez que presento, que es realista lo que quería; haga clic en, vea los problemas, solucione los problemas y véalos actualizar cuando las pestañas de los usuarios o clics de distancia. ESO todavía funcionaba maravillosamente, y las alertas adicionales desaparecieron.

Me encantaría saber qué estaba pasando allí, pero estoy feliz de ver que funcione. Presumiblemente, algo en la validación onfocusout entraba en conflicto con el comportamiento habitual de jQuery validate post-submit-button y provocaba que la validación se activara dos veces.

(Sí, esta información es, probablemente, en la documentación, pero se sienten libres para dirigir sus comentarios RTFM en otro lugar, por favor.)

tldr: Desactivar onkeyup y onfocusout, y cualquier alerta sólo se disparará una vez. No perderá tanta funcionalidad como cabría esperar.

Cuestiones relacionadas