Então, vou me aprofundar um pouco mais no motivo pelo qual isso não funciona, porque sou o tipo de pessoa que não consegue dormir à noite sem saber haha. Estou usando o jQuery validate 1.10 e o Microsoft jQuery Unobtrusive Validation 2.0.20710.0, publicado em 29/1/2013.
Comecei pesquisando o método setDefaults no jQuery Validate e o encontrei na linha 261 do arquivo não minificado. Tudo o que essa função realmente faz é mesclar suas configurações de json às existentes, $.validator.defaults
que são inicializadas com a propriedade ignore sendo definida como ": hidden" junto com os outros padrões definidos no jQuery Validate. Então, neste ponto, substituímos o ignorar. Agora vamos ver onde essa propriedade padrão está sendo referenciada.
Quando eu rastreei o código para ver onde $.validator.defaults
está sendo referenciado. Percebi que isso estava sendo usado apenas pelo construtor para um validador de formulário, a linha 170 no jQuery validar arquivo não minificado.
// constructor for validator
$.validator = function( options, form ) {
this.settings = $.extend( true, {}, $.validator.defaults, options );
this.currentForm = form;
this.init();
};
Nesse ponto, um validador mesclará as configurações padrão definidas e anexará ao validador de formulário. Quando você olha para o código que está validando, destacando, destacando etc., todos eles usam o objeto validator.settings para obter a propriedade ignore. Portanto, precisamos ter certeza de que devemos definir o ignorar com o método setDefaults, antes que o $ ("form"). Validate () seja chamado.
Se você estiver usando o Asp.net MVC e o plug-in discreto, perceberá depois de examinar o javascript que validar é chamado em document.ready. Também chamei meus setDefaults no bloco document.ready, que será executado após os scripts, o jquery é validado e discreto, porque defini esses scripts no html antes do que possui a chamada. Portanto, minha ligação obviamente não teve impacto na funcionalidade padrão de ignorar elementos ocultos durante a validação. Há algumas opções aqui.
Opção 1 - Como Juan Mellado apontou, você poderia ter a chamada fora do documento. Já que seria executada assim que o script fosse carregado. Não sei ao certo o momento, pois os navegadores agora são capazes de fazer o carregamento paralelo de scripts. Se eu estou sendo muito cauteloso, por favor, me corrija. Além disso, provavelmente há maneiras de contornar isso, mas para minhas necessidades eu não segui esse caminho.
Opção 2a - A aposta segura em meus olhos é apenas substituir o $.validator.setDefaults({ ignore: '' });
interior do evento document.ready por $("form").data("validator").settings.ignore = "";
. Isso modificará a propriedade ignore que é realmente usada pelo jQuery validate ao fazer cada validação nos seus elementos para o formulário fornecido.
Opções 2b - Depois de examinar um pouco mais o código, você também pode usar $("form").validate().settings.ignore = "";
como forma de definir a propriedade ignore. O motivo é que, ao examinar a função validate, ele verifica se um objeto validador já foi armazenado para o elemento do formulário por meio da $.data()
função. Se ele encontrar um objeto validador armazenado com o elemento de formulário, ele retornará o objeto validador em vez de criar outro.