Resumo : neste tutorial, você aprenderá sobre a validação de formulário JavaScript criando um formulário de inscrição do zero.
O que é validação de formulário
Antes de enviar dados ao servidor , você deve verificar os dados no navegador da web para garantir que os dados enviados estão no formato correto.
Para fornecer feedback rápido, você pode usar JavaScript para validar os dados. Isso é chamado de validação do lado do cliente.
Se você não realizar a validação do lado do cliente, isso poderá causar uma experiência ruim ao usuário. Nesse caso, você pode sentir um atraso perceptível porque leva tempo para que os dados do formulário sejam transferidos entre os navegadores da web e o servidor.
Ao contrário da validação do lado do cliente executada no navegador da web, a validação do lado do servidor é executada no servidor. É fundamental sempre implementar a validação do lado do servidor.
A razão é que a validação do lado do cliente é bastante fácil de ignorar. Usuários maliciosos podem desativar o JavaScript e enviar dados incorretos ao seu servidor.
Neste tutorial, você se concentrará apenas na validação do lado do cliente.
Opções de validação do lado do cliente
Quando se trata de validação do lado do cliente, você terá duas opções:
- Validação JavaScript: você desenvolve a lógica de validação usando JavaScript. Ou você pode usar uma biblioteca para fazer isso.
- Validação de formulário integrada: você pode usar os recursos de validação de formulário HTML5. Esta validação tem um desempenho melhor que a validação JavaScript. No entanto, não é tão personalizável quanto a validação JavaScript.
Validação de JavaScript
Você criará um formulário de inscrição simples com quatro campos de entrada: nome de usuário, e-mail, senha e confirmação de senha.
Ao clicar em cadastrar sem preencher nada ou preencher formato de dados incorreto, o formulário mostrará mensagens de erro:
Você validará o seguinte:
- O nome de usuário não pode ficar em branco e ter pelo menos 3 caracteres e não pode ter mais de 25 caracteres.
- O e-mail é obrigatório e válido.
- A senha tem oito caracteres ou mais. E deve conter 1 caractere minúsculo, 1 caractere maiúsculo, 1 número e pelo menos um caractere especial neste conjunto (
!@#$%^&*
). - A senha de confirmação deve ser igual à senha.
Crie a estrutura do projeto
Primeiro, crie a form-validation
pasta que armazena todos os arquivos de código-fonte do projeto.
Segundo, crie as pastas js
e css
dentro da form-validation
pasta.
Terceiro, crie na style.css
pasta css
, app.js
na js
pasta e index.html
diretamente na form-validation
pasta.
A estrutura final do projeto ficará assim:
Construa o formulário HTML
Primeiro, abra o index.html
arquivo e digite o seguinte código:
<!DOCTYPE html>
<html>
<head>
<title>JavaScript Form Validation Demo</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<script src="js/app.js"></script>
</body>
</html>
Linguagem de código: HTML, XML ( xml )
Neste arquivo HTML, colocamos o style.css
arquivo na head
seção e app.js
o arquivo na seção body antes da </body>
tag de fechamento.
Segundo, adicione a seguinte marcação HTML para criar o formulário de inscrição. O arquivo index.html final terá a seguinte aparência:
<!DOCTYPE html>
<html>
<head>
<title>JavaScript Form Validation Demo</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container">
<form id="signup" class="form">
<h1>Sign Up</h1>
<div class="form-field">
<label for="username">Username:</label>
<input type="text" name="username" id="username" autocomplete="off">
<small></small>
</div>
<div class="form-field">
<label for="email">Email:</label>
<input type="text" name="email" id="email" autocomplete="off">
<small></small>
</div>
<div class="form-field">
<label for="password">Password:</label>
<input type="password" name="password" id="password" autocomplete="off">
<small></small>
</div>
<div class="form-field">
<label for="confirm-password">Confirm Password:</label>
<input type="password" name="confirm-password" id="confirm-password" autocomplete="off">
<small></small>
</div>
<div class="form-field">
<input type="submit" value="Sign Up">
</div>
</form>
</div>
<script src="js/app.js"></script>
</body>
</html>
Linguagem de código: HTML, XML ( xml )
O que é notável sobre o formulário de inscrição é que cada campo é agrupado em um div
com a classe form-field
.
Cada campo de formulário possui três elementos:
- Um rótulo
- Um campo de entrada
- Um
<small>
elemento
Você usará a <small>
tag para mostrar a mensagem de erro aos usuários.
Se um campo de entrada não for válido, tornaremos sua borda vermelha adicionando a error
classe ao form-field
elemento. Será assim:
<div class="form-field error">
<label for="username">Username:</label>
<input type="text" name="username" id="username" autocomplete="off">
<small></small>
</div>
Linguagem de código: JavaScript ( javascript )
Se o valor de um campo de entrada for válido, tornaremos sua borda verde adicionando a success
classe ao form-field
elemento da seguinte maneira:
<div class="form-field success">
<label for="username">Username:</label>
<input type="text" name="username" id="username" autocomplete="off">
<small></small>
</div>
Linguagem de código: JavaScript ( javascript )
Confira style.css para detalhes das classes .error
e .success
.
Selecione os campos do formulário e adicione o ouvinte de evento de envio
No app.js
arquivo, você primeiro usará o document.querySelector()
método para selecionar os campos de entrada e o formulário:
const usernameEl = document.querySelector('#username');
const emailEl = document.querySelector('#email');
const passwordEl = document.querySelector('#password');
const confirmPasswordEl = document.querySelector('#confirm-password');
const form = document.querySelector('#signup');
Linguagem de código: JavaScript ( javascript )
E então você anexa o submit
ouvinte de evento ao formulário usando o método addEventListener() :
form.addEventListener('submit', function (e) {
// prevent the form from submitting
e.preventDefault();
});
Linguagem de código: JavaScript ( javascript )
No ouvinte de evento, você precisa chamar o e.preventDefault()
para evitar que o formulário seja enviado depois que o botão enviar for clicado.
Desenvolva funções utilitárias
Antes de validar o formulário, você pode desenvolver algumas funções utilitárias reutilizáveis para verificar se:
- Um campo é obrigatório.
- O comprimento de um campo está entre mínimo e máximo.
- O e-mail está em um formato válido.
- A senha é forte.
A isRequired()
função a seguir retorna verdadeiro se o argumento de entrada estiver vazio:
const isRequired = value => value === '' ? false : true;
Linguagem de código: JavaScript ( javascript )
A isBetween()
função a seguir retorna falso se o length
argumento não estiver entre o argumento min
e :max
const isBetween = (length, min, max) => length < min || length > max ? false : true;
Linguagem de código: JavaScript ( javascript )
Para verificar se o e-mail é válido, você usará uma expressão regular :
const isEmailValid = (email) => {
const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(email);
};
Linguagem de código: JavaScript ( javascript )
Para verificar se uma senha é forte e corresponde a um padrão especificado, você também usará uma expressão regular:
const isPasswordSecure = (password) => {
const re = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})");
return re.test(password);
};
Linguagem de código: JavaScript ( javascript )
A tabela a seguir ilustra o significado de cada parte da expressão regular usada para validar a senha:
Senha RegEx | Significado |
---|---|
^ | A senha começa |
(?=.*[az]) | A senha deve conter pelo menos um caractere minúsculo |
(?=.*[AZ]) | A senha deve conter pelo menos um caracter maiúsculo |
(?=.*[0-9]) | A senha deve conter pelo menos um número |
(?=.*[!@#$%^&*]) | A senha deve conter pelo menos um caractere especial. |
(?=.{8,}) | A senha deve ter oito caracteres ou mais |
Desenvolva funções que mostrem o erro/sucesso
A showError()
função a seguir destaca a borda do campo de entrada e exibe uma mensagem de erro se o campo de entrada for inválido:
const showError = (input, message) => {
// get the form-field element
const formField = input.parentElement;
// add the error class
formField.classList.remove('success');
formField.classList.add('error');
// show the error message
const error = formField.querySelector('small');
error.textContent = message;
};
Linguagem de código: JavaScript ( javascript )
Como funciona.
Primeiro, obtenha o elemento pai do campo de entrada, que é o <div>
elemento que contém a form-field
classe:
const formField = input.parentElement;
Linguagem de código: JavaScript ( javascript )
Segundo, remova a success
classe e adicione-a error
ao form-field
elemento:
formField.classList.remove('success');
formField.classList.add('error');
Linguagem de código: JavaScript ( javascript )
Terceiro, selecione o <small>
elemento dentro do form-field
elemento:
const error = formField.querySelector('small');
Linguagem de código: JavaScript ( javascript )
Observe que você usa o formField.querySelector()
em vez do document.querySelector()
.
Por fim, defina a mensagem de erro como sua textContent
propriedade do <small>
elemento:
error.textContent = message;
A função que mostra o indicador de sucesso é semelhante à showError()
função:
const showSuccess = (input) => {
// get the form-field element
const formField = input.parentElement;
// remove the error class
formField.classList.remove('error');
formField.classList.add('success');
// hide the error message
const error = formField.querySelector('small');
error.textContent = '';
}
Linguagem de código: JavaScript ( javascript )
Ao contrário da showError()
função, a showSuccess()
função remove a error
classe, adiciona a success
classe e deixa a mensagem de erro em branco.
Agora, você pode usar a função utilitária acima para verificar cada campo.
Desenvolva funções de validação de campo de entrada
Você desenvolverá quatro funções para validar valores dos campos do formulário:
1) Valide o campo de nome de usuário
A seguinte checkUsername()
função usa:
- A
isRequired()
função para verificar se o nome de usuário foi fornecido. - A
isBetween()
função para verificar se o comprimento do nome de usuário está entre 3 e 25 caracteres. - As funções
showError()
eshowSuccess()
para mostrar o indicador de erro e sucesso.
A função retorna true
se o campo passar nas verificações.
const checkUsername = () => {
let valid = false;
const min = 3,
max = 25;
const username = usernameEl.value.trim();
if (!isRequired(username)) {
showError(usernameEl, 'Username cannot be blank.');
} else if (!isBetween(username.length, min, max)) {
showError(usernameEl, `Username must be between ${min} and ${max} characters.`)
} else {
showSuccess(usernameEl);
valid = true;
}
return valid;
}
Linguagem de código: JavaScript ( javascript )
2) Valide o campo de e-mail
A checkEmail()
função retorna true
se o e-mail for fornecido e válido.
Ele usa as funções isRequired()
e isEmailValid()
para verificação. E usa as funções showError()
e showSuccess()
para fornecer feedback em caso de erro e sucesso.
const checkEmail = () => {
let valid = false;
const email = emailEl.value.trim();
if (!isRequired(email)) {
showError(emailEl, 'Email cannot be blank.');
} else if (!isEmailValid(email)) {
showError(emailEl, 'Email is not valid.')
} else {
showSuccess(emailEl);
valid = true;
}
return valid;
}
Linguagem de código: JavaScript ( javascript )
3) Valide o campo de senha
A checkPassword()
função a seguir verifica o campo de senha se ele for fornecido e corresponder ao formato exigido:
const checkPassword = () => {
let valid = false;
const password = passwordEl.value.trim();
if (!isRequired(password)) {
showError(passwordEl, 'Password cannot be blank.');
} else if (!isPasswordSecure(password)) {
showError(passwordEl, 'Password must has at least 8 characters that include at least 1 lowercase character, 1 uppercase characters, 1 number, and 1 special character in (!@#$%^&*)');
} else {
showSuccess(passwordEl);
valid = true;
}
return valid;
};
Linguagem de código: JavaScript ( javascript )
4) Valide o campo de confirmação de senha
A checkConfirmPassword()
função verifica se a senha de confirmação é igual à senha.
const checkConfirmPassword = () => {
let valid = false;
// check confirm password
const confirmPassword = confirmPasswordEl.value.trim();
const password = passwordEl.value.trim();
if (!isRequired(confirmPassword)) {
showError(confirmPasswordEl, 'Please enter the password again');
} else if (password !== confirmPassword) {
showError(confirmPasswordEl, 'Confirm password does not match');
} else {
showSuccess(confirmPasswordEl);
valid = true;
}
return valid;
};
Linguagem de código: JavaScript ( javascript )
Modificando o manipulador de eventos de envio
Agora, você pode usar as funções que validam os campos de entrada no manipulador de eventos submit:
form.addEventListener('submit', function (e) {
// prevent the form from submitting
e.preventDefault();
// validate forms
let isUsernameValid = checkUsername(),
isEmailValid = checkEmail(),
isPasswordValid = checkPassword(),
isConfirmPasswordValid = checkConfirmPassword();
let isFormValid = isUsernameValid &&
isEmailValid &&
isPasswordValid &&
isConfirmPasswordValid;
// submit to the server if the form is valid
if (isFormValid) {
}
});
Linguagem de código: JavaScript ( javascript )
Como funciona:
- Primeiro, chame cada função individual para validar os campos de nome de usuário, e-mail, senha e confirmação de senha.
- Segundo, use o
&&
operador para determinar se o formulário é válido. O formulário será válido somente se todos os campos forem válidos. - Por fim, envie os dados ao servidor se o formulário for válido especificou o
isFormValid
sinalizador. Observe que o envio de dados de formulário ao servidor não é abordado neste tutorial.
Agora você pode abrir o index.html
arquivo, inserir alguns valores e clicar no botão enviar para testá-lo.
Adicionar recurso de feedback instantâneo
O formulário só mostra o erro ou sucesso quando você clica no botão Cadastre-se .
Para fornecer feedback instantâneo, você pode anexar um ouvinte de evento ao input
evento de cada campo e validá-lo.
É ainda melhor usar a delegação de evento para anexar o input
ouvinte de evento ao formulário e validar cada campo com base no ID do campo atual, assim:
form.addEventListener('input', function (e) {
switch (e.target.id) {
case 'username':
checkUsername();
break;
case 'email':
checkEmail();
break;
case 'password':
checkPassword();
break;
case 'confirm-password':
checkConfirmPassword();
break;
}
});
Linguagem de código: JavaScript ( javascript )
Se você abrir index.html
e inserir alguns dados, verá que o formulário mostra o feedback de erro ou sucesso instantaneamente.
Além disso, você melhora o desempenho do formulário usando a técnica de debouncing.
Tecnicamente, você esperará que os usuários pausem a digitação por um pequeno período de tempo ou parem de digitar antes de validar a entrada.
Para detalhes da técnica de debouncing, confira neste tutorial.
O seguinte ilustra a debounce()
função:
const debounce = (fn, delay = 500) => {
let timeoutId;
return (...args) => {
// cancel the previous timer
if (timeoutId) {
clearTimeout(timeoutId);
}
// setup a new timer
timeoutId = setTimeout(() => {
fn.apply(null, args)
}, delay);
};
};
Linguagem de código: JavaScript ( javascript )
Agora, você pode passar o input
manipulador de eventos para a debounce()
função para debounce:
form.addEventListener('input', debounce(function (e) {
switch (e.target.id) {
case 'username':
checkUsername();
break;
case 'email':
checkEmail();
break;
case 'password':
checkPassword();
break;
case 'confirm-password':
checkConfirmPassword();
break;
}
}));
Linguagem de código: JavaScript ( javascript )
Se você inserir dados em um campo de formulário para acionar o input
evento, verá que a mensagem de erro ou sucesso terá um pouco de atraso.
A seguir mostra o app.js
arquivo completo:
const usernameEl = document.querySelector('#username');
const emailEl = document.querySelector('#email');
const passwordEl = document.querySelector('#password');
const confirmPasswordEl = document.querySelector('#confirm-password');
const form = document.querySelector('#signup');
const checkUsername = () => {
let valid = false;
const min = 3,
max = 25;
const username = usernameEl.value.trim();
if (!isRequired(username)) {
showError(usernameEl, 'Username cannot be blank.');
} else if (!isBetween(username.length, min, max)) {
showError(usernameEl, `Username must be between ${min} and ${max} characters.`)
} else {
showSuccess(usernameEl);
valid = true;
}
return valid;
};
const checkEmail = () => {
let valid = false;
const email = emailEl.value.trim();
if (!isRequired(email)) {
showError(emailEl, 'Email cannot be blank.');
} else if (!isEmailValid(email)) {
showError(emailEl, 'Email is not valid.')
} else {
showSuccess(emailEl);
valid = true;
}
return valid;
};
const checkPassword = () => {
let valid = false;
const password = passwordEl.value.trim();
if (!isRequired(password)) {
showError(passwordEl, 'Password cannot be blank.');
} else if (!isPasswordSecure(password)) {
showError(passwordEl, 'Password must has at least 8 characters that include at least 1 lowercase character, 1 uppercase characters, 1 number, and 1 special character in (!@#$%^&*)');
} else {
showSuccess(passwordEl);
valid = true;
}
return valid;
};
const checkConfirmPassword = () => {
let valid = false;
// check confirm password
const confirmPassword = confirmPasswordEl.value.trim();
const password = passwordEl.value.trim();
if (!isRequired(confirmPassword)) {
showError(confirmPasswordEl, 'Please enter the password again');
} else if (password !== confirmPassword) {
showError(confirmPasswordEl, 'The password does not match');
} else {
showSuccess(confirmPasswordEl);
valid = true;
}
return valid;
};
const isEmailValid = (email) => {
const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(email);
};
const isPasswordSecure = (password) => {
const re = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})");
return re.test(password);
};
const isRequired = value => value === '' ? false : true;
const isBetween = (length, min, max) => length < min || length > max ? false : true;
const showError = (input, message) => {
// get the form-field element
const formField = input.parentElement;
// add the error class
formField.classList.remove('success');
formField.classList.add('error');
// show the error message
const error = formField.querySelector('small');
error.textContent = message;
};
const showSuccess = (input) => {
// get the form-field element
const formField = input.parentElement;
// remove the error class
formField.classList.remove('error');
formField.classList.add('success');
// hide the error message
const error = formField.querySelector('small');
error.textContent = '';
}
form.addEventListener('submit', function (e) {
// prevent the form from submitting
e.preventDefault();
// validate fields
let isUsernameValid = checkUsername(),
isEmailValid = checkEmail(),
isPasswordValid = checkPassword(),
isConfirmPasswordValid = checkConfirmPassword();
let isFormValid = isUsernameValid &&
isEmailValid &&
isPasswordValid &&
isConfirmPasswordValid;
// submit to the server if the form is valid
if (isFormValid) {
}
});
const debounce = (fn, delay = 500) => {
let timeoutId;
return (...args) => {
// cancel the previous timer
if (timeoutId) {
clearTimeout(timeoutId);
}
// setup a new timer
timeoutId = setTimeout(() => {
fn.apply(null, args)
}, delay);
};
};
form.addEventListener('input', debounce(function (e) {
switch (e.target.id) {
case 'username':
checkUsername();
break;
case 'email':
checkEmail();
break;
case 'password':
checkPassword();
break;
case 'confirm-password':
checkConfirmPassword();
break;
}
}));
Linguagem de código: JavaScript ( javascript )
Resumo
- O que é validação do lado do cliente e a diferença entre validação do lado do cliente e validação do lado do servidor.
- Como redigir um formulário e combinar JavaScript e CSS para validar campos de entrada.
- Como usar expressões regulares para verificar se os valores dos campos estão no formato correto.
- Como usar a técnica de delegação de eventos .
- Como usar a técnica debouncing para melhorar o desempenho na validação de formulários.