jQuery Validate - Habilite a validação para campos ocultos

186

Na nova versão do plugin de validação jQuery 1.9, por padrão, a validação de campos ocultos é ignorada . Estou usando o CKEditor para o campo de entrada de área de texto e ele oculta o campo e substitui-o por iframe. O campo está lá, mas a validação está desativada para campos ocultos. Com o plugin de validação versão 1.8.1, tudo funciona como esperado.

Então, minha pergunta é como habilitar a validação para campos ocultos com o plugin de validação v1.9.

Essa configuração não funciona:

$.validator.setDefaults({ ignore: '' });
Xamã
fonte
O link para "validação de campos ocultos ignorados" está morto.
Beepye 20/09/16
A validação está funcionando por padrão para mim <input type="text" name="myfield" id="myfield" required="required" style="display: none;">. Não precisei alterar nenhuma configuração ou fazer algo especial.
Squarecandy 02/09/19

Respostas:

329

O autor do plug-in diz que você deve usar "colchetes sem as aspas" ,[]

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

Release: Validation Plugin 1.9.0: "... Outra alteração deve facilitar a configuração de formulários com elementos ocultos, que agora são ignorados por padrão (a opção" ignorar "tem": oculto "agora como padrão). Em teoria, isso pode interromper uma configuração existente. No caso improvável de que ela realmente ocorra, é possível corrigi-la definindo a opção ignorar como “[]” (colchetes sem as aspas). "

Para alterar essa configuração para todos os formulários:

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

(Não é necessário que .setDefaults()esteja dentro da document.readyfunção)

OU para um formulário específico:

$(document).ready(function() {

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

});

EDIT :

Veja esta resposta para saber como habilitar a validação em alguns campos ocultos, mas ainda assim ignorar outros.


EDIT 2 :

Antes de deixar comentários que "isso não funciona" , lembre-se de que o OP está simplesmente perguntando sobre o plug - in jQuery Validate e sua pergunta não tem nada a ver com como o ASP.NET, MVC ou qualquer outra estrutura da Microsoft pode alterar o normal desse plug-in comportamento esperado. Se você estiver usando uma estrutura da Microsoft, o funcionamento padrão do plug-in jQuery Validate será substituído pelo unobtrusive-validationplug-in da Microsoft .

Se você estiver tendo problemas com o unobtrusive-validationplug - in, consulte esta resposta: https://stackoverflow.com/a/11053251/594235

Sparky
fonte
26
Talvez o eleitor de baixa renda possa me dar um feedback construtivo. Caso contrário, a resposta é totalmente independente, de origem adequada, fornece exemplos de código e é tecnicamente correta conforme o autor do plug-in.
Sparky
1
@StijnVanBael, não, isso é falso. Veja: jsfiddle.net/F4w92/1 e também veja meu segundo comentário na resposta de Jerick .
Sparky
4
Bem dito @Sparky. Os down-votos são provavelmente espécie de vingança, eu encontrei o mesmo ..
Omar
1
O JSFiddle não funciona mais porque as bibliotecas são carregadas em HTTP em vez de HTTPS. Versão atualizada: jsfiddle.net/F4w92/31
hotips
1
Também diminuí a votação porque isso não funciona para mim usando a versão mais recente, tive que usar: $ ("form"). Data ("validator"). Settings.ignore = ""; Como outra resposta de @ James abaixo
Mark Homer
73

Isso funcionou para mim, em um site ASP.NET MVC3 onde eu havia deixado a estrutura para configurar a validação discreta etc., caso seja útil para qualquer pessoa:

$("form").data("validator").settings.ignore = "";
James Morcom
fonte
2
Também gosto deste, pois significa que posso fazê-lo em determinadas circunstâncias, em vez de alterar o comportamento padrão.
31512 Steve
5
Eu tive que fazer dessa maneira, porque usar .validate () para alterar as opções não estava funcionando.
Farinha
1
esta é a solução correta para a validação discreta, tentei todas as outras soluções, elas poderiam funcionar caso NÃO usassem discretas. Se você estiver usando discreto aqui é o lugar certo.
Hakan Fıstık
Teve que usar esse método também para validação discreta para trabalhar com o Bootstrap Accordion
bsod_ 09/01
Quando eu mudo para isso, o formulário não é validado. Eu uso o núcleo .net discreto
Offir Pe'er
64

Certifique-se de colocar

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

NÃO dentro$(document).ready

Jerick
fonte
2
Excelente resposta. Um link para a documentação é bom para as pessoas aprenderem, mas uma resposta direta é mais valiosa. O OP estava no caminho certo, mas colocá-lo fora de $ (document). Já é o truque.
precisa saber é o seguinte
3
@KevinZych, aparentemente, não faz absolutamente nenhuma diferença se ele $.validator.setDefaults()é colocado dentro ou fora do manipulador pronto para DOM. Compare este jsFiddle com este jsFiddle .
Sparky
Interessante @Sparky, seus violinos são uma excelente prova. Eu teria que voltar e olhar o código que corrigi usando esta solução e descobrir por que cheguei à conclusão de que ela precisava estar dentro do manipulador pronto para DOM. Deve ter sido outro motivo.
precisa saber é o seguinte
Justin explica por que rodar dentro do doc ready causa problemas. No entanto, essa resposta não é uma boa opção, pois é difícil garantir que algo fora do documento pronto seja executado ANTES do documento estar pronto. O Doc.ready não aguardará a execução de scripts fora dele. Nada pessoal, mas esta não é uma resposta confiável.
AaronLS
Finalmente eu tenho uma resposta .. Muito obrigado
sp9
29

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.defaultsque 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.defaultsestá 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.

JustinMichaels
fonte
Obrigado pela resposta detalhada!
Davidallyoung
O bom trabalho como a resposta OP não funcionou para mim em MVC 5
Mark Homer
sua análise me ajudou muito a corrigir um dos meus problemas de validação. +1
pgcan
15

Isso funcionou para mim em um site ASP.NET. Para habilitar a validação em alguns campos ocultos, use este código

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

Para ativar a validação para todos os elementos do formulário, use este $("form").data("validator").settings.ignore = "";

Observe que use-os dentro de $(document).ready(function() { })

angela.mirjalili
fonte
8

Apenas adicionada ignore: []na página específica para o formulário específico, esta solução funcionou para mim.

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

Isso está funcionando para mim.

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

A validação estava funcionando para mim no envio de formulários, mas não estava executando a validação orientada a eventos reativos na entrada das listas de seleção escolhidas.

Para corrigir isso, adicionei o seguinte para acionar manualmente o evento de validação de jquery adicionado pela biblioteca:

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

jquery.validate agora adicionará a .validclasse à lista de seleção subjacente.

Advertência: Isso requer um padrão html consistente para as entradas do formulário. No meu caso, cada entrada arquivada é envolvida em um div.form-groupe cada entrada possui .form-control.

Zze
fonte
-15

Apenas encontre o texto ignore: ": hidden" no seu arquivo de validação de jquery e comente-o. Após comentar isso, nunca perderá nenhum elemento oculto para validar ...

obrigado

user835525
fonte
5
Nunca é uma boa idéia comentar apenas aleatoriamente o código em uma biblioteca de terceiros.
Jacques