2010-04-14 18 views
11

Mi formulario HTML tiene una serie de div que son los pasos de un asistente. Al hacer clic en el botón "siguiente", quiero validar solo el div activo. Estoy usando el complemento jQuery.Validate.js.Validar subconjunto de un formulario utilizando jQuery Validar complemento

Cada div tiene una identificación, por lo que quiero una manera de decir algo como:

wizardForm.validate().element('#first-step :input') 

pero esto sólo valida la primera entrada, no todos ellos. ¿Cómo puedo validar todas las entradas dentro de un div?

+0

Hay un ejemplo en jqueryvalidation.org/files/demo/multipart (actualmente roto debido a contenido mixto). Sin embargo, es específico de los campos obligatorios. – TrueWill

Respuesta

24

Tomando lo que sugiere Jandy, creé esta función auxiliar:

jQuery.validator.prototype.subset = function(container) { 
    var ok = true; 
    var self = this; 
    $(container).find(':input').each(function() { 
     if (!self.element($(this))) ok = false; 
    }); 
    return ok; 
} 

uso:

if (wizardForm.validate().subset('#first-step')) { 
    // go to next step 
} 
+0

Nice answer. Creo que esta funcionalidad debería ser nativa del complemento. [Este] (http://stackoverflow.com/questions/4625078/validate-different-fields-on-click-of-different-buttons-in-the-same-html-form-thr/5794770#5794770) es un solución que utilicé en mi proyecto (antes de ver esto) usando la opción de ignorar y jquery: not selector –

+0

Esto funciona muy bien, pero si no quiero usarlo, entonces no valida. Lo que quiero decir: si utilizo el método form.validate(). Subconjunto ('.contenedor') envuelto en un IF, funciona. Si solo intento validar el formulario form.validate(); - Envuelto en el mismo IF, ya no funciona. ¿Alguna idea de por qué? ¡Gracias! – lehel

1

Probé esta solución y no funcionó para mí. Así que aquí es cómo logré el mismo comportamiento, usando el complemento jquery.validation.

El validador:

var form = $('#form'); 

    // init validator obj and set the rules 
    form.validate({ 
     errorElement: 'span', //default input error message container 
     errorClass: 'help-inline', // default input error message class 
     focusInvalid: false, // do not focus the last invalid input 
     ignore: "", 
     rules: { 
      // the rules, as usual 
     }, 

     highlight: function (element) { // hightlight error inputs 
      $(element).closest('.control-group').addClass('error'); // set error class to the control group 
     }, 

     unhighlight: function (element) { // revert the change dony by hightlight 
      $(element) 
       .closest('.control-group').removeClass('error'); // set error class to the control group 
     } 
    }); 

Usando bootstrap form wizard.

Éste es cómo validar cada paso:

$('#step :input').valid() 

funciona como un encanto.

+0

¿Cómo valida esto una parte del formulario? – Dementic

0

Si nos fijamos en la options for the validate() function una de las opciones es ignore, que por defecto será evitar que el validador de intentar validar aquellos campos que coinciden con el CSS pseudo-clase :hidden. Solía ​​esto en combinación con la FuelUX Wizard y fue capaz de prevenir el asistente de progresar a la siguiente etapa con el siguiente:

$('#wizard').wizard().on('change', function(event, info) { 
    if (! $('#wizard_form').valid()) event.preventDefault(); 
});