2010-09-17 19 views
10

Tengo un formulario que tiene un mapa adjunto. Al hacer clic en el mapa, se agregan entradas ocultas a un div en el formulario.jQuery Validate: cómo validar un elemento que no forma?

Quiero una regla de validación para comprobar si ese div tiene o no elementos ocultos. Hasta ahora, sólo he sido capaz de hacer esto con un elemento ficticio que tengo que quitar manualmente antes de enviar el formulario:

<form action="..." method="post" id="signup"> 
    <!-- ... --> 
    <div id="zones_selected"><input type="hidden" name="dummy"></div> 
    <!-- ... --> 
</form> 

$.validator.methods.zones = function (value, element, param) { return ($zone_holder.find('input[name!=dummy]').length > 0); }; 
$('#signup').validate({ 
    rules: { 
    //... 
    'dummy': 'zones' 
    }, 
    //... 
    submitHandler: function(form) { $(form).find('input[name=dummy]').remove(); form.submit(); } 
}); 

Sin embargo, estas hojas mucho que desear para la colocación de error, ya que mi validador personalizado El método no parece desencadenar la función unhighlight, y me siento sucio por haber ingresado una entrada únicamente para la validación de formularios (no muy discreta).

Lo que me gustaría es submitHandler y una regla para verificar la presencia de entradas ocultas en un div que tendría un activador unhighlight (de forma que si un usuario hace clic en el mapa, lo que crea una nueva entrada oculta --el mensaje que veo diciéndoles que lo haga desaparecerá).

¿Cuál es la mejor manera de lograr esto?

Respuesta

3

He intentado hacer esto en el pasado. No creo que haya una manera de hacerlo sin hacer algunas modificaciones a la base de código de jquery.validator.

Al mirar JQuery.Validator.js, echa un vistazo a la función 'elementos' en ln 423 verá algo como esto

return $([]).add(this.currentForm.elements) 
      .filter(":input") 
      .not(":submit, :reset, :image, [disabled]") 
      .not(this.settings.ignore) 
      .filter(function() { 
       !this.name && validator.settings.debug && window.console && console.error("%o has no name assigned", this); 

       // select only the first element for each name, and only those with rules specified 
       if (this.name in rulesCache || !validator.objectLength($(this).rules())) 
        return false; 

       rulesCache[this.name] = true; 
       return true; 
      }); 

El filtro (": de entrada") es lo que le dará pena .

Cuestiones relacionadas