Validar formulários hoje em dia usando javascript é o básico do básico no desenvolvimento de páginas web.
Porém, existem formulário e formulários. Então vamos começar pelo básico. Os campos mais comuns e as validações mais usadas, assim como as máscaras dos campos.
Para isso vamos usar um exemplo que eu criei para o torneio de javascript do fórum scriptbrasil. Você pode ver os detalhes do torneio na página: Torneio Javascript Etapa 1 (básico) – ScriptBrasil.
Resolvi disponibilizar o meu exemplo aqui porque o mesmo recebeu a maior nota do torneio, fazendo dele então o código de validação campeão da primeira etapa do torneio.
Como você pode ver na imagem, utilizo o nickname Mestre SAM no fórum.
Vejamos uma tela do resultado final do formulário:
O código fonte:
<!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;>
<html lang=&quot;pt&quot;>
<head><title>Torneio Javascript - ScriptBrasil - por Mestre SAM</title>
<meta name=&quot;copyright&quot; content=&quot;Copyright 2009 by Mario SAM&quot;>
<meta name=&quot;description&quot; content=&quot;Torneio Javascript ScriptBrasil&quot;>
<style type=&quot;text/css&quot;>
<!--
body {
margin: 0px auto;
font: 11px Arial, Verdana;
}
label {
width: 100px;
float: left;
margin-top: 8px;
text-align: right;
}
span {
width: 250px;
float: left;
}
form input, select {
width: 200px;
border: 1px solid #000000;
color: #c0f2a1;
font: 11px Arial, Verdana;
font-weight: bold;
padding: 2px;
margin: 5px;
background-color: #363636;
}
form input:focus, select:focus {
background-color: #000000;
}
fieldset {
border: 0px;
padding: 5px;
margin: 10px;
}
legend {
text-transform: uppercase;
font-weight: bold;
}
#div_central {
width:800px;
margin:0 auto;
}
#div_esquerda {
float: left;
width: 398px;
background-color: #ffffff;
border: 1px solid #999999;
margin: 2px;
}
#div_form {
float: left;
width: 388px;
background-color: #eeeeee;
margin: 5px;
paddgin: 5px;
}
#div_direita {
float: left;
width: 300px;
background-color: #ffffff;
border: 1px solid #ffffff;
margin-left: 10px;
}
#msg_erros {
float: left;
width: 90%;
background-color: #ffcccc;
border: 3px solid #ff0000;
padding: 5px;
}
-->
</style>
<script type=&quot;text/javascript&quot;>
//faz a mudanca dos campos entre pessoa fisica e pessoa juridica.
function tipoPessoa( campo ) {
//limpa as mensagens e os valores dos inputs
document.getElementById('msg_erros').style.display = &quot;none&quot;;
document.getElementById('nome').value = &quot;&quot;;
document.getElementById('cpf').value = &quot;&quot;;
document.getElementById('rg').value = &quot;&quot;;
document.getElementById('razao').value = &quot;&quot;;
document.getElementById('cnpj').value = &quot;&quot;;
document.getElementById('ie').value = &quot;&quot;;
//marca e habilita os campos na tela
if ( campo.value == &quot;fisica&quot; ) {
document.getElementById('bloco_pj').style.display = &quot;none&quot;;
document.getElementById('bloco_pf').style.display = &quot;&quot;;
//tira e inclui campos na validacao dinamica
document.getElementById('nome').alt = &quot;obrigatorio&quot;;
document.getElementById('cpf').alt = &quot;cpf&quot;;
document.getElementById('rg').alt = &quot;obrigatorio&quot;;
document.getElementById('razao').alt = &quot;&quot;;
document.getElementById('cnpj').alt = &quot;&quot;;
document.getElementById('ie').alt = &quot;&quot;;
} else { //senao eh juridica
document.getElementById('bloco_pf').style.display = &quot;none&quot;;
document.getElementById('bloco_pj').style.display = &quot;&quot;;
//tira e inclui campos na validacao dinamica
document.getElementById('nome').alt = &quot;&quot;;
document.getElementById('cpf').alt = &quot;&quot;;
document.getElementById('rg').alt = &quot;&quot;;
document.getElementById('razao').alt = &quot;obrigatorio&quot;;
document.getElementById('cnpj').alt = &quot;cnpj&quot;;
document.getElementById('ie').alt = &quot;obrigatorio&quot;;
}
}
//faz adicao de mascaras para os campos pre formatados.
function put_mask( campo, formato, event ) {
var texto = formato.substring( campo.value.length );
var tecla = window.event ? event.keyCode : event.which;
//(32)espaço (8)backspace (46)delete
if ( tecla!=8 &amp;amp;&amp;amp; tecla!=32 &amp;amp;&amp;amp; tecla!=46 ) {
if ( texto.substring(0,1) != formato.substring(0,1) ) campo.value += texto.substring(0,1);
}
}
//validacao dinamica do formulario.
function validarForm( frm ) {
var msg='';
for ( i=0; i<frm.length; i++ ) {
if ( frm[i].type=='text' ) {
if ( frm[i].alt=='email' ) {
msg += validaFormatos( frm[i], /^[w!#$%&amp;amp;'*+/=?^`{|}~-]+(.[w!#$%&amp;amp;'*+/=?^`{|}~-]+)*@(([w-]+.)+[A-Za-z]{2,6}|[d{1,3}(.d{1,3}){3}])$/ );
}
if ( frm[i].alt=='cep' ) {
msg += validaFormatos( frm[i], /^[0-9]{5}-[0-9]{3}$/ );
}
if ( frm[i].alt=='cnpj' ) {
msg += validaFormatos( frm[i], /^[0-9]{2}.[0-9]{3}.[0-9]{3}/[0-9]{4}-[0-9]{2}$/ );
}
if ( frm[i].alt=='cpf' ) {
msg += validaFormatos( frm[i], /^[0-9]{3}.[0-9]{3}.[0-9]{3}-[0-9]{2}$/ );
}
if ( frm[i].alt=='obrigatorio' ) {
msg += campoObrigatorio( frm[i] );
}
} else if ( frm[i].type=='select-one' ) {
if ( frm[i].value=='' ) {
msg += &quot;<p>- Campo <b>&quot;+ frm[i].name +&quot;</b> obrigatorio</p>&quot;;
}
} else {
//alert ( frm[i].type );
}
}
if ( msg != '' ) {
msg = &quot;<p><b>Erros:</b></p>&quot; + msg;
document.getElementById('msg_erros').innerHTML = msg;
document.getElementById('msg_erros').style.display = &quot;&quot;;
return false;
}
alert( &quot;Formulario OK!&quot; );
return true;
}
//valida os formatos dos campos
function validaFormatos( campo, padrao ) {
var msg = campoObrigatorio( campo );
if ( msg=='' )
if (! padrao.test( campo.value ) )
return '<p>- Campo <b>'+campo.name+'</b> invalido</p>';
return msg;
}
//retira espacos em branco para verifica se o campo foi preenchido.
function campoObrigatorio( campo ) {
var semEspacos = campo.value.replace(/^s+|s+$/, '');
if ( semEspacos.length == 0 )
return '<p>- Campo <b>'+campo.name+'</b> obrigatorio</p>';
return '';
}
</script>
</head>
<body>
<noscript>
Voce deve habilitar seu javascript para que a pagina funcione corretamente.
</noscript>
<div style=&quot;float:left; width:100%; margin-top:20px; margin-bottom:20px; text-align:center;&quot;>
TORNEIO <b>SCRIPTBRASIL</b> - JAVASCRIPT: ETAPA 1
</div>
<div id=&quot;div_central&quot;>
<div id=&quot;div_esquerda&quot;>
<div id=&quot;div_form&quot;>
<form name=&quot;frm&quot; action=&quot;etapa1.html&quot; method=&quot;POST&quot; onsubmit=&quot;return validarForm(this);&quot;>
<fieldset>
<legend>formul&amp;amp;aacute;rio de cadastro</legend>
<p>
<input type=&quot;radio&quot; name=&quot;tipo&quot; value=&quot;fisica&quot; style=&quot;width:60px;&quot; onclick=&quot;javascript:tipoPessoa(this);&quot; checked>Pessoa F&amp;amp;iacute;sica
<input type=&quot;radio&quot; name=&quot;tipo&quot; value=&quot;juridica&quot; style=&quot;width:60px;&quot; onclick=&quot;javascript:tipoPessoa(this);&quot;>Pessoa Jur&amp;amp;iacute;dica
</p>
<hr>
<div id=&quot;bloco_pf&quot;>
<p>
<label>Nome:</label>
<span><input type=&quot;text&quot; name=&quot;nome&quot; id=&quot;nome&quot; value=&quot;&quot; maxlength=&quot;100&quot; alt=&quot;obrigatorio&quot;></span>
</p>
<p>
<label>CPF:</label>
<span><input type=&quot;text&quot; name=&quot;cpf&quot; id=&quot;cpf&quot; value=&quot;&quot; onkeypress=&quot;put_mask(this, '###.###.###-##', event)&quot; maxlength=&quot;14&quot; style=&quot;width:80px;&quot; alt=&quot;cpf&quot;></span>
</p>
<p>
<label>RG.:</label>
<span><input type=&quot;text&quot; name=&quot;rg&quot; id=&quot;rg&quot; value=&quot;&quot; maxlength=&quot;14&quot; style=&quot;width:80px;&quot; alt=&quot;obrigatorio&quot;></span>
</p>
</div>
<div id=&quot;bloco_pj&quot; style=&quot;display:none;&quot;>
<p>
<label>Raz&amp;amp;atilde;o Social:</label>
<span><input type=&quot;text&quot; name=&quot;razao&quot; id=&quot;razao&quot; value=&quot;&quot; maxlength=&quot;150&quot;></span>
</p>
<p>
<label>CNPJ:</label>
<span><input type=&quot;text&quot; name=&quot;cnpj&quot; id=&quot;cnpj&quot; value=&quot;&quot; onkeypress=&quot;put_mask(this, '##.###.###/####-##', event)&quot; maxlength=&quot;18&quot; style=&quot;width:100px;&quot;></span>
</p>
<p>
<label>Inscri&amp;amp;ccedil;&amp;amp;atilde;o Estadual:</label>
<span><input type=&quot;text&quot; name=&quot;ie&quot; id=&quot;ie&quot; value=&quot;&quot; maxlength=&quot;18&quot; style=&quot;width:100px;&quot;></span>
</p>
</div>
<p>
<label>Cep:</label>
<span><input type=&quot;text&quot; name=&quot;cep&quot; id=&quot;cep&quot; value=&quot;&quot; onkeypress=&quot;put_mask(this, '#####-###', event)&quot; maxlength=&quot;9&quot; alt=&quot;cep&quot; style=&quot;width:60px;&quot;></span>
</p>
<p>
<label>Endere&amp;amp;ccedil;o:</label>
<span><input type=&quot;text&quot; name=&quot;endereco&quot; id=&quot;endereco&quot; value=&quot;&quot; maxlength=&quot;150&quot; alt=&quot;obrigatorio&quot;></span>
</p>
<p>
<label>Bairro:</label>
<span><input type=&quot;text&quot; name=&quot;bairro&quot; id=&quot;bairro&quot; value=&quot;&quot; maxlength=&quot;50&quot; alt=&quot;obrigatorio&quot;></span>
</p>
<p>
<label>Cidade:</label>
<span><input type=&quot;text&quot; name=&quot;cidade&quot; id=&quot;cidade&quot; value=&quot;&quot; maxlength=&quot;50&quot; alt=&quot;obrigatorio&quot;></span>
</p>
<p>
<label>Estado:</label>
<span>
<select name=&quot;estado&quot; id=&quot;estado&quot;>
<option value=&quot;&quot;>Selecione o Estado</option>
<option value=&quot;AC&quot;>Acre</option>
<option value=&quot;AL&quot;>Alagoas</option>
<option value=&quot;AM&quot;>Amazonas</option>
<option value=&quot;AP&quot;>Amap&amp;amp;aacute;</option>
<option value=&quot;BA&quot;>Bahia</option>
<option value=&quot;CE&quot;>Cear&amp;amp;aacute;</option>
<option value=&quot;DF&quot;>Distrito Federal</option>
<option value=&quot;ES&quot;>Esp&amp;amp;iacute;rito Santo</option>
<option value=&quot;GO&quot;>Goi&amp;amp;aacute;s</option>
<option value=&quot;MA&quot;>Maranh&amp;amp;atilde;o</option>
<option value=&quot;MT&quot;>Mato Grosso</option>
<option value=&quot;MS&quot;>Mato Grosso do Sul</option>
<option value=&quot;MG&quot;>Minas Gerais</option>
<option value=&quot;PA&quot;>Par&amp;amp;aacute;</option>
<option value=&quot;PB&quot;>Para&amp;amp;iacute;ba</option>
<option value=&quot;PR&quot;>Paran&amp;amp;aacute;</option>
<option value=&quot;PE&quot;>Pernambuco</option>
<option value=&quot;PI&quot;>Piau&amp;amp;iacute;</option>
<option value=&quot;RJ&quot;>Rio de Janeiro</option>
<option value=&quot;RN&quot;>Rio Grande do Norte</option>
<option value=&quot;RO&quot;>Rond&amp;amp;ocirc;nia</option>
<option value=&quot;RS&quot;>Rio Grande do Sul</option>
<option value=&quot;RR&quot;>Roraima</option>
<option value=&quot;SC&quot;>Santa Catarina</option>
<option value=&quot;SE&quot;>Sergipe</option>
<option value=&quot;SP&quot;>S&amp;amp;atilde;o Paulo</option>
<option value=&quot;TO&quot;>Tocantins</option>
</select>
</span>
</p>
<p>
<label>Email:</label>
<span><input type=&quot;text&quot; name=&quot;email&quot; id=&quot;email&quot; value=&quot;&quot; alt=&quot;email&quot; maxlength=&quot;100&quot;></span>
</p>
<p>
<label>&amp;amp;nbsp;</label>
<span><input type=&quot;submit&quot; name=&quot;btn_enviar&quot; value=&quot;enviar&quot; style=&quot;width:100px;&quot;></span>
</p>
</fieldset>
</form>
</div>
</div>
<div id=&quot;div_direita&quot;>
<p><b>DESAFIO:</b></p>
<p>Validação de Campos em Formulário</p>
<p>
Obs.: Existem campos (CPF, RG e CEP) que não necessitam de verificações para verificar se o valor digitado é válido, apenas a verificação de que algo foi digitado
Estes campos devem possuir uma máscara (exemplo de máscara para CPF: xxx.xxx.xxx-dd)
</p>
<p>
Obs.: Do Participante<br>
O codigo foi criado na tentativa de atender apenas as especificacoes do torneio. Ignorando fatores de validacao importantes como
validacao numerica de CPF/CNPJ e existencia de valores para CEP.
</p>
<div id=&quot;msg_erros&quot; style=&quot;display:none;&quot;>&amp;amp;nbsp;</div>
</div>
</div>
<div style=&quot;width:90%; text-align:center; margin-top:10px; float:left;&quot;>
<a href=&quot;http://www.mariosam.com&quot; title=&quot;Blog Desenvolvimento WEB&quot;>www.mariosam.com</a>
</div>
</body>
</html>
Esse plugin do wordpress de apresentação de código fonte as vezes apresenta algumas falhas, por isso vou disponibilizar também para download o arquivo compactado.
Arquivo com código fonte para download.
Bom, não tem muito mais o que falar, no próprio documento, assim como no fórum tem todas as funcionalidades que o código deve contemplar na validação básica de um formulário.
Algumas pessoas podem achar que o código ficou difícil de entender. Pois está usando expressões regulares nas validações. E para evitar amarrar o código ao formulário foi usado uma lógica mais genérica para que possa ser reutilizado em vários formulários. Foi necessário para deixar o código mais elegante e reutilizável.
E como eu sei que não agrado a gregos e troianos, e nem pretendo isso. Ao criticar o código por favor mostre algo melhor, afinal, eu também gosto de aprender.
Sucesso!


Loading...
Graaaaande SAM, esse é o cara
“Antes de imprimir, lembre-se de sua Responsabilidade Social com o Meio Ambiente”
Olá, precisava de um help seu, se possível…
Consegui na internet alguns que depois de algumas correções fiz funcionar, porém estou “empacado” na masca do Endereço fìsico do computador o MAC, que já fiz funcionar com o código abaixo! Ex. de MAC: 00:2A:4F:AA:33:16
Porém ao digitar as letras que eventualmente existem nos endereços MAC a máscara não funciona com caracteres mistos de letras e numeros separados por “:” !?!?
Variantes “0123456789ABCDEF:”
Deixei várias linhas comentadas demonstrando o que já tentei fazer, você poderia me ajudar por favor ???
function MAC(v){
//v=v.replace(/\D/g,”")
//v = v.replace(/^(\d{1,2})\:(\d{1,2})\:(\d{1,2})\:(\d{1,2})\:(\d{1,2})\:(\d{1,2})$/,”")
//v = v.replace(/\s/g, ”);
//v = v.replace(/^[A]|[B]|[C]|[D]|[E]|[F]$/g, ”);
//v=v.replace(/[^0123456789ABCDEF]/g,”")
// v=v.replace(/^(\d{0,1})(\d)/,”[G-Z]*$/”) RUIM
// v=v.replace(/([0-9a-fA-F]{2}:{1}){5}[0-9a-fA-F]{2}/)
// v=v.replace(/^[a-f0-9]{12}$/);
//v=v.replace(/^(([0-9a-f]{2}):){5}([0-9a-f]{2})$/,”")
v=v.replace(/(\d{2})(\d)/,”$1:$2″)
v=v.replace(/(\d{5})(\d)/,”$1:$2″)
v=v.replace(/(\d{8})(\d)/,”$1:$2″)
v=v.replace(/(\d{11})(\d)/,”$1:$2″)
v=v.replace(/(\d{14})(\d)/,”$1:$2″)
return v
}
// Outra dúvida é o que o código abaixo faz? Obs. não coloquei junto d fonte acima.
function leech(v) {
v=v.replace(/o/gi,”0″)
v=v.replace(/i/gi,”1″)
v=v.replace(/z/gi,”2″)
v=v.replace(/e/gi,”3″)
v=v.replace(/a/gi,”4″)
v=v.replace(/s/gi,”5″)
v=v.replace(/t/gi,”7″)
}
Att,
Fabiano Souza de Oliveira
Técnico em Informática &
Bacharelando em Sistemas de Informação
Disco Virtual: https://cid-c99e5f17e0696860.skydrive.live.com/home.aspx
e ae Fabiano,
primeiro eu preciso entender, vc comeca dizendo q conseguiu fazer funcionar usando o codigo abaixo,
mas logo em seguida diz q nao funciona com mistos!!!
preciso entender o q isso significa.
vc quer dizer q se usar entre os dois pontos, 99 ou XX, funciona,
mas se usar X9 ou 9X ele nao funciona, eh isso?
nao funciona em q sentido? o q acontece?
quanto a sua duvida com relacao ao metodo leech,
ele esta fazendo o mesmo q faz na funcao acima, ele faz um replace no conteudo.
no caso, usando expressao regular.
v=v.replace(/o/gi,”0″)
o conteudo de “v” vai receber ele mesmo, soh q alterando tudo q contiver a letra “o” por zero.
gi eh o codigo da expressao regular q significa “altere todas as ocorrencias minusculas e maiusculas”.
blz?! sucesso ai.