Weblosofia com CSS, Jquery, Javascript, Ajax, PHP etc.
por Alexandre Magno
Postado em Julho 23rd, 2008 por Alexandre Magno
Depois de ter mostrado o Ajax Form Plugin, como prometido irei falar neste post sobre o Plugin para jQuery Validate.
O Validate é um plugin para o jQuery que permite que você possa centralizar todas as validações de dados no formulário, tanto no cliente como no servidor. Neste post irei falar sobre a validação no cliente somente.
Este é um dos plugins mais antigos e o mais completo na minha opinião. Você pode controlar todas as validações, mensagens e ainda ter a possibilidade de facilmente criar novos métodos de validação. Além de tudo, ele é integrado com o Ajax Form Plugin para que os dados enviados com sucesso seja enviado por Ajax.
Irei mostrar o funcionamento básico deste plugin na prática:
Neste exemplo, há um formulário com os campos nome, idade, e-mail e país. Esses campos não foram usados por acaso. O campo nome foi usado para mostrar como é simples a validação de campos que precisam ser preenchidos com algum valor. No campo idade irei ilustrar como criar um novo método para o Plugin, neste caso o usuário tem que ter mais de 18 anos. No campo e-mail irei mostrar como pode ser usado os métodos já definidos no plugin. O campo país mostra como validar selects, radios e checkboxes.
As mensagens de erro e como elas irão serem mostradas são totalmente personalizáveis, tanto onde e como elas irão aparecer tanto como no CSS. Por padrão, o plugin irá gerar um label logo depois do campo com a classe error. Isso pode ser modificado em suas configurações facilmente. Além do label, o input do elemento que não foi validado corretamente também irá ter uma classe error.
Vamos ao código HTML do formulário:
<form name="validate" id="validate" action="validate.html" method="post"> <label for="nome">Nome:</label> <input type="text" name="nome" /> <label for="idade">Idade:</label> <input type="text" name="idade" /> <label for="email">E-mail:</label> <input type="text" name="email" /> <label for="pais">País:</label> <select type="text" name="pais"> <option value="">Selecione</option> <option value="brasil">Brasil</option> <option value="canada">Inglaterra</option> </select> <input type="submit" value="Validar" /> </form>
Assim, o estilo da classe de erro ficaria:
label.error {
border: 1px solid red;
color: red;
font-weight: bold;
padding: 3px;
background-color: #99CCFF;
margin: 6px 0;
width: 120px;
text-align: center;
}
Note que foi passado o elemento label para estilizar somente a classe error aplicada a algum label e não o elemento input.
Depois de fazer o download do plugin, você poderá utilizar o seguinte código no head do documento abaixo do arquivo referente ao core do jQuery:
$(function(){
$("#validate").validate({
submitHandler: function(form) {
$(form).submit(function(){
alert('todos os dados foram preenchidos corretamente');
return false
});
},
rules: {
nome: 'required',
idade: {
required: true,
minAge: 18
},
email: {
required: true,
email: true
},
pais: 'required'
},
messages: {
nome: 'Você não preencheu seu nome',
idade: {
required: 'Você não preencheu sua idade',
},
email: {
required: 'Você precisa preencher um e-mail',
email: 'Endereço de e-mail não válido'
},
pais: 'Você precisa escolher um país'
}
});
});
Irei explicar passo a passo o código:
Primeiro, você passa um seletor para referenciar um formulário(neste caso o id do formulário) e executa o método validate, que aceita um objeto de parâmetros:
No caso da regra minAge eu criei um novo método de validação:
jQuery.validator.addMethod("minAge", function(value, element, params) {
return this.optional(element) || value > params;
}, "Você precisa ter mais de 18 anos.");
Esta é a sintaxe para criação de novos métodos para o Validate. Primeiro você atribui um nome para o método (para ser usado dentro do objeto rule) e passa uma função que retorna um valor Booleano para verificar se a validação confere. O primeiro parâmetro é o valor digitado ou escolhido pelo usuário(no caso do input, o valor digitado e do select, o valor escolhido). O segundo parâmetro é o elemento que está sendo validado (Elemento DOM) e o terceiro é o parâmetro passado na regra de validação. No caso da validação de idade, o primeiro parâmetro é a idade que o usuário digitou, o segundo é o input e o terceiro é o valor inserido na regra. Sendo assim ele verifica primeiro se o parâmetro é opcional, por que caso seja, ele não precisa validar e o segundo verifica se o valor digitado é maior que o valor atribuido na regra (você pode, por exemplo, colocar na regra que a idade seja maior que 21).
O ideal é colocar todas as regras de validação personalizadas em um arquivo javascript separado e inserir logo depois do plugin Validate.
Com a validação de selects, checkboxes e radio buttons é possível trabalhar da mesma forma que um input. No caso do select, o value colocado para o option "Selecione um país " é vazio, sendo assim ele não irá passar com sucesso na validação.
Espero que tenha ajudado a todos e não se esqueçam de olharem a documentação, experimentar e colocar em prática para descobrir todas as funcionalidades do Plugin.
Artigos relacionados
André Faria Gomes comentou:
24th Julho, 2008 às 12:55 pm
Ótima dica!
Gostaria de sugerir um post sobre plugins de mascara do jQuery.
Riccardo Benetti comentou:
8th Agosto, 2008 às 2:58 pm
Cara valeu pelo artigo. Me ajudou muito.
Parabéns mesmo.
Abs
xc comentou:
17th Setembro, 2008 às 4:00 pm
bom post se seu site tiver sido feito com essa tecnologia ela deve ser boa mesmo
Alexandre Magno comentou:
24th Setembro, 2008 às 11:23 am
@tiago: Realmente tiago, está ocorrendo um erro de script que está impedindo o funcionamento. Vou dar uma olhada para descobrir o motivo e atualizo aqui quando tiver descobrido a solução.
fabio comentou:
12th Novembro, 2008 às 4:37 pm
cara, estou migrando aos poucos para jquery e esta excelente seu artigo.
ai vai minha duvida… no prototype, tem um plugin de validacao tb, mas nele, assim que o usuário sai do campo o plugin informa logo o erro. Nesse plugin tem isso?
Outra coisa… no prototype, eu posso setar um campo como validação de data, mas não obrigatório. Testei isso no plugin do jquery e nao achei… se eu coloco somente um tipo de validação, sem que ela seja obrigatória, ele continua me obrigando a por algo no campo..
valeu!
Mateus comentou:
5th Dezembro, 2008 às 7:30 pm
O exemplo que passou (link) a validação não funciona
Alexandre Magno comentou:
6th Dezembro, 2008 às 3:55 pm
@Mateus: Testei os links e eles estão funcionando normalmente. Qual link não está funcionando? Abraços
Felipe comentou:
17th Março, 2009 às 7:48 pm
Não funciona em campos tipo file
Coleção de métodos para o plugin validate do jQuery. | TidBits comentou:
27th Março, 2009 às 11:30 am
[…] o plugin, principalmente para desenvolver interface de back end, com diversas validações. Tem um post do Alexandre Magno antigo, porém muito bom, explicando o que é o plugin, o que faz, como utilizá-lo e um exemplo […]
Coleção de métodos para o plugin validate do jQuery. | juliowebdesign.com comentou:
3rd Abril, 2009 às 1:37 pm
[…] o plugin, principalmente para desenvolver interface de back end, com diversas validações. Tem um post do Alexandre Magno antigo, porém muito bom, explicando o que é o plugin, o que faz, como utilizá-lo e um exemplo […]
4th Abril, 2009 às 8:46 pm
[…] práticas, Plugins, jQuery avançado, Jquery Já expliquei em posts anteriores como usar o validade e como usar o Ajax Form. Agora irei mostrar como os dois em conjunto oferece uma solução completa […]
ALexandre Broggio comentou:
11th Abril, 2009 às 10:47 am
O plugin e muito mesmo facilica muito na hora de validar forms ^_^
Alexandre Magno comentou:
14th Abril, 2009 às 1:05 pm
@felipe. A validação em campos file realmente não é possível por padrão. De acordo com o criador do plugin, com um método adicional isto é possível:
jQuery.validator.addMethod(”accept”, function(value, element, param) {
return value.match(new RegExp(”.” + param + “$”));
});
rules: {
fileupload: { accept: “(jpe?g|gif|png)” }
}
Marcelo comentou:
29th Abril, 2009 às 3:15 pm
sou leigo ainda, e estou com uma dúvida esse script vai fazer uma consulta em cada letra que digitar no campo ?
Alexandre Magno comentou:
30th Abril, 2009 às 9:31 am
@Marcelo: Não. Ele fará a consulta ao enviar o formulário ou quando o usuário sair do campo (evento blur) se for especificado nas suas opções. Espero que tenha ajudado e boa sorte.
Fabiane comentou:
29th Maio, 2009 às 1:34 pm
Alexandre,
Parabéns pelo seu exemplo. Excelente mesmo!
Só tenho uma dúvida:
Preciso fazer uma validação de senha de forma que a senha anterior não possa ser igual a nova senha. Além do mais, a senha nova tem que ter um caracter em UPPER e pelo menos 3 números.
Vc tem idéia de como fazer?
Obrigada!
Alexandre Magno comentou:
1st Junho, 2009 às 8:31 pm
@Fabiane: Existe um método incluído no validate chamado ‘equalTo’ que faz o inverso, você pode usá-lo como referência para criar um personalizado, como explicado no post. O link para a sintaxe é http://docs.jquery.com/Plugins/Validation/Methods/equalTo. Eu sugeria que você pudesse criar um método ‘diferentTo’. O código seria basicamente este:
diferentTo: function(value, element, param) {
return value != $(param).val();
}
A sintaxe seria a mesma do equalTo, você passa o elemento que ele deseja verificar se é diferente.
Espero ter ajudado, boa sorte e fico muito feliz que o exemplo tenha sido útil.
Vinicius comentou:
8th Julho, 2009 às 11:58 am
Alexandre,
Tenho uma duvida. Dentro de rules você disse que eu devo passar o name do campo, mas se eu tiver vários formulários para validar, e não puder botar todos os nomes iguais, eu poderia fazer referência a class? pelo id eu sei que funciona, mas não sei como fazer para class.
Obrigado
Alexandre Magno comentou:
8th Julho, 2009 às 12:48 pm
@Vinicius: O validate não aceita referências que não seja classe ou id. Isto geraria várias inconsistências. Talvez tenha outra solução melhor e precise de mais detalhes do seu caso. Vários formulários com names iguais? Na hora de passar o validate você deve especificar apenas um, o ideal é uma regra por campo, mas se terá campos iguais talvez guardando o objeto em variáveis ajudaria no reaproveitamento. Como disse, estou falando sem saber detalhes da necessidade.
Esperto que tenha ajudado e boa sorte.
Geraldo Augusto comentou:
14th Agosto, 2009 às 2:50 pm
Parabéns pelo blog, Alexandre.
Em um post de agosto/2008, você disse que estava ocorrendo algum erro de script para o exemplo, no IE6. Ainda não está funcionando. Houve alguma atualização para corrigir que esteja em outra url?
Obrigado
Alexandre Magno comentou:
17th Agosto, 2009 às 7:24 pm
@Geraldo: Olá geraldo, este erro está relacionado a uma virgula na linha 27 do exemplo acima. Existe uma vírgula que gera um erro de script somente no IE por causa da formatação do JSON. Toda chave de um objeto json não utiliza vírgula no último item. Obrigado…
Rafael Kuvasney comentou:
16th Outubro, 2009 às 6:49 pm
\o/
maldição! os input precisam do “name” além do “id”! Fiquei horas preso a isso!
valeu!
Alexandre Magno comentou:
19th Outubro, 2009 às 2:00 pm
@Rafael: O plugin verifica o name e não o id… além disto o name é extremamente necessário pois é como o valor será obtido no server. Abraços…
Daniel Tenorio comentou:
24th Março, 2010 às 6:11 pm
Alguem poderia informar como posso colocar para funcionar? criei dois arquivos, um para o .html e outro para o .js e só retorna uma tela com o nome false. gostaria de um auxilio.
Alexandre Magno comentou:
25th Março, 2010 às 1:26 pm
@Daniel: provavelmente o evento não está sendo “anexado” no formulário e deve estar fazendo o post sem ajax. Verifique se todos arquivos são carregados, se o seletor está sendo usado no form. Espero ter ajudado e boa sorte.
Vinicius comentou:
12th Abril, 2010 às 7:44 am
Ola Alexandre
Como que eu poderia dar um alert por ex: “Existem campos que devem ser informados!” antes de aparecer os labels de validação dos campos?
Obrigado
Alexandre Magno comentou:
12th Abril, 2010 às 9:35 am
Você pode usar a opção invalidHandler, que seria um callback quando um erro é disparado, e você tem como parâmetros um elemento.
Vinicius comentou:
12th Abril, 2010 às 2:31 pm
Otimo Alexandre, ja consegui aqui.
Outra duvida, as mensagens de erro nao esta aparecendo ao lado do campo qdo tenho mais de um campo de validaçao. Fica todos no mesmo lugar na posicao do primeiro campo e eu gostaria que ficasse no lado direito de cada campo.
O que eu posso estar fazendo de errado?
Alexandre Magno comentou:
12th Abril, 2010 às 7:09 pm
@Vinicius: Você precisa estilizar os campos via css para conseguir este efeito, provavelmente o elemento está inline, basta dar um display block na label que ele gera. Espero ter ajudado, abraços…
Vinicius comentou:
13th Abril, 2010 às 5:47 am
Ola alexandre,
Consegui que aparecesse todos os erros para cada campo, só os campos do tipo SELECT, os combos, a mensagem aparece embaixo do campo ao invés do lado…briquei aqui mas ate agora nao consegui fazer com que aparecessem ao lado. Tem alguma diferença para esse tipo de campo?
Os seguintes campos estão incorretos ou faltando