jQuery Validate - Habilita la validación para campos ocultos

186

En la nueva versión de jQuery, el plugin de validación 1.9 por defecto ignora la validación de los campos ocultos . Estoy usando CKEditor para el campo de entrada de área de texto y oculta el campo y lo reemplaza con iframe. El campo está allí, pero la validación está deshabilitada para los campos ocultos. Con el complemento de validación versión 1.8.1 todo funciona como se esperaba.

Entonces mi pregunta es cómo habilitar la validación para campos ocultos con el complemento de validación v1.9.

Esta configuración no funciona:

$.validator.setDefaults({ ignore: '' });
Chamán
fuente
El enlace para "validación de campos ocultos ignorados" está inactivo.
Beepye
La validación funciona de manera predeterminada para mí con <input type="text" name="myfield" id="myfield" required="required" style="display: none;">. No tuve que cambiar ninguna configuración ni hacer nada especial.
squarecandy

Respuestas:

329

El autor del complemento dice que debe usar "corchetes sin las comillas" ,[]

http://bassistance.de/2011/10/07/release-validation-plugin-1-9-0/

Versión: Validation Plugin 1.9.0: "... Otro cambio debería facilitar la configuración de formularios con elementos ocultos, estos ahora se ignoran por defecto (la opción" ignorar "tiene": oculto "ahora por defecto). En teoría, esto podría romper una configuración existente. En el improbable caso de que realmente lo haga, puede solucionarlo configurando la opción ignorar en "[]" (corchetes sin las comillas) ".

Para cambiar esta configuración para todos los formularios:

$.validator.setDefaults({ 
    ignore: [],
    // any other default options and/or rules
});

(No se requiere que .setDefaults()esté dentro de la document.readyfunción)

O para una forma específica:

$(document).ready(function() {

    $('#myform').validate({
        ignore: [],
        // any other options and/or rules
    });

});

EDITAR :

Vea esta respuesta para saber cómo habilitar la validación en algunos campos ocultos pero ignorar otros.


EDITAR 2 :

Antes de dejar comentarios de que "esto no funciona" , tenga en cuenta que el OP simplemente pregunta sobre el complemento jQuery Validate y su pregunta no tiene nada que ver con cómo ASP.NET, MVC o cualquier otro marco de Microsoft puede alterar la normalidad de este complemento comportamiento esperado. Si está utilizando un marco de Microsoft, el funcionamiento predeterminado del complemento jQuery Validate se sobrescribe con el unobtrusive-validationcomplemento de Microsoft .

Si tiene problemas con el unobtrusive-validationcomplemento, consulte esta respuesta: https://stackoverflow.com/a/11053251/594235

Chispeante
fuente
26
Tal vez el votante negativo me puede dar algunos comentarios constructivos. De lo contrario, la respuesta es totalmente autónoma, de origen adecuado, proporciona ejemplos de código y es técnicamente correcta según el autor del complemento.
Sparky
1
@StijnVanBael, no, eso es falso. Ver: jsfiddle.net/F4w92/1 y también ver mi segundo comentario sobre la respuesta de Jerick .
Sparky
44
Bien dicho @Sparky. Los votos negativos son probablemente una especie de venganza, he encontrado lo mismo ...
Omar
1
El JSFiddle ya no funciona porque las bibliotecas se cargan en HTTP en lugar de HTTPS. Versión actualizada: jsfiddle.net/F4w92/31
hotips
1
También voté en contra ya que esto no funciona para mí usando la última versión, tuve que usar: $ ("formulario"). Data ("validador"). Settings.ignore = ""; como otra respuesta de @James abajo
Mark Homer
73

Esto funcionó para mí, dentro de un sitio ASP.NET MVC3 donde había dejado el marco para configurar una validación discreta, etc., en caso de que sea útil para alguien:

$("form").data("validator").settings.ignore = "";
James Morcom
fuente
2
También me gusta este, ya que significa que puedo hacerlo en ciertas circunstancias, en lugar de cambiar el comportamiento predeterminado.
Steve Owen
55
Tenía que hacerlo de esta manera, porque usar .validate () para cambiar las opciones no funcionaba.
Farinha
1
esta es la solución correcta para la validación discreta, probé todas las otras soluciones, podrían funcionar en caso de que NO se utilicen discretamente. Si está utilizando discreto aquí es el lugar correcto.
Hakan Fıstık
Tuve que usar este método también para una validación discreta para trabajar con Bootstrap Accordion
bsod_
Cuando lo cambio a esto, el formulario no está validado. Uso el discreto .net core
Offir Pe'er
64

Asegúrate de poner

 $.validator.setDefaults({ ignore: '' });

NO adentro$(document).ready

jerick
fuente
2
Excelente respuesta Un enlace a la documentación es bueno para que las personas lo aprendan, pero una respuesta directa es más valiosa. El OP estaba en el camino correcto, pero ponerlo fuera de $ (documento). Listo es el truco.
Kevin Zych
3
@KevinZych, Aparentemente, no hace absolutamente ninguna diferencia si $.validator.setDefaults()se coloca dentro o fuera del manipulador listo para DOM. Compare este jsFiddle con este jsFiddle .
Sparky
Interesante @Sparky, tus violines son una excelente prueba. Tendría que volver y mirar el código que arreglé usando esta solución y descubrir por qué llegué a la conclusión de que tenía que estar dentro del controlador listo para DOM. Debe haber sido alguna otra razón.
Kevin Zych
Justin explica por qué ejecutar dentro de doc ready causa problemas. Sin embargo, esta respuesta no es una buena opción porque es difícil garantizar que algo fuera del documento listo se ejecutará ANTES de que el documento esté listo. Doc.ready no esperará a que se ejecuten scripts fuera de él. Nada personal, pero esta no es una respuesta confiable.
AaronLS
Finalmente tengo una respuesta
Muchas gracias
29

Así que voy a profundizar un poco más sobre por qué esto no funciona porque soy el tipo de persona que no puede dormir por la noche sin saber jaja. Estoy usando jQuery validate 1.10 y Microsoft jQuery Nobtrusive Validation 2.0.20710.0 que se publicó el 29/01/2013.

Comencé buscando el método setDefaults en jQuery Validate y lo encontré en la línea 261 del archivo sin minificar. Todo lo que esta función realmente hace es fusionar su configuración json con la existente, $.validator.defaultsque se inicializa con la propiedad ignorar configurada en ": oculto" junto con los otros valores predeterminados definidos en jQuery Validate. Entonces, en este punto, hemos ignorado ignorar. Ahora veamos dónde se hace referencia a esta propiedad predeterminada.

Cuando rastreé el código para ver dónde $.validator.defaultsse hace referencia. Me di cuenta de que solo estaba siendo utilizado por el constructor para un validador de formularios, la línea 170 en jQuery validate unminmin file.

// constructor for validator
$.validator = function( options, form ) {
    this.settings = $.extend( true, {}, $.validator.defaults, options );
    this.currentForm = form;
    this.init();
};

En este punto, un validador fusionará cualquier configuración predeterminada que se haya establecido y la adjuntará al validador de formularios. Cuando miras el código que está validando, resaltando, resaltando, etc., todos usan el objeto validator.settings para extraer la propiedad ignorar. Por lo tanto, debemos asegurarnos de que si establecemos el ignorar con el método setDefaults, debe ocurrir antes de que se invoque $ ("form"). Validate ().

Si está utilizando Asp.net MVC y el complemento discreto, se dará cuenta después de mirar el javascript que valida se llama en document.ready. También llamé a mi setDefaults en el bloque document.ready que se ejecutará después de los scripts, jquery validate y discreto porque he definido esos scripts en el html antes del que tiene la llamada. Entonces, mi llamada obviamente no tuvo impacto en la funcionalidad predeterminada de omitir elementos ocultos durante la validación. Hay un par de opciones aquí.

Opción 1 : podría, como Juan Mellado señaló, tener la llamada fuera del documento lista, que se ejecutará tan pronto como se haya cargado el script. No estoy seguro sobre el momento de esto ya que los navegadores ahora son capaces de cargar secuencias de comandos paralelas. Si solo soy demasiado cauteloso, corrígeme. Además, probablemente hay formas de evitar esto, pero para mis necesidades no seguí este camino.

Opción 2a : la apuesta segura en mis ojos es simplemente reemplazar el $.validator.setDefaults({ ignore: '' });interior del evento document.ready con $("form").data("validator").settings.ignore = "";. Esto modificará la propiedad de ignorar que realmente utiliza jQuery validate cuando realiza cada validación en sus elementos para el formulario dado.

Opciones 2b : después de examinar el código un poco más, también podría usarlo $("form").validate().settings.ignore = "";como una forma de establecer la propiedad ignorar. La razón es que, al observar la función de validación, verifica si un objeto de validación ya se ha almacenado para el elemento de formulario a través de la $.data()función. Si encuentra un objeto de validación almacenado con el elemento de formulario, simplemente devuelve el objeto de validación en lugar de crear otro.

JustinMichaels
fuente
¡Gracias por la respuesta detallada!
davidallyoung
Buen trabajo ya que la respuesta OP no funcionó para mí en MVC 5
Mark Homer
Su análisis me ayudó mucho a solucionar uno de mis problemas de validación. +1
pgcan
15

Esto funcionó para mí dentro de un sitio ASP.NET. Para habilitar la validación en algunos campos ocultos, use este código

$("form").data("validator").settings.ignore = ":hidden:not(#myitem)";

Para habilitar la validación de todos los elementos del formulario, use este $("form").data("validator").settings.ignore = "";

Tenga en cuenta que los use dentro de $(document).ready(function() { })

angela.mirjalili
fuente
8

Recién agregado ignore: []en la página específica para el formulario específico, esta solución funcionó para mí.

$("#form_name").validate({
        ignore: [],
        onkeyup: false,
        rules: {            
        },      
        highlight:false,
    });
Kiran
fuente
1

Esto es trabajo para mí.

jQuery("#form_name").validate().settings.ignore = "";
Waqas Bukhary
fuente
0

La validación estaba funcionando para mí en el envío del formulario, pero no estaba haciendo la validación impulsada por evento reactivo en la entrada a las listas de selección elegidas.

Para solucionar esto, agregué lo siguiente para activar manualmente el evento de validación jquery que la biblioteca agrega:

$(".chosen-select").each(function() {
  $(this).chosen().on("change", function() {
    $(this).parents(".form-group").find("select.form-control").trigger("focusout.validate");
  });
});

jquery.validate ahora agregará la .validclase a la lista de selección subyacente.

Advertencia: Esto requiere un patrón html consistente para sus entradas de formulario. En mi caso, cada entrada archivada está envuelta en un div.form-group, y cada entrada tiene .form-control.

Zze
fuente
-15

Simplemente encuentre el texto ignore: ": hidden" en su archivo de validación jquery y coméntelo. Después de comentar esto, nunca perderá ningún elemento oculto para validar ...

Gracias

usuario835525
fuente
55
Nunca es una buena idea comentar al azar el código en una biblioteca de terceros.
Jacques