API de Validação: Validando Elementos de Formulário - JavaScript
Validação HTML5
O HTML5 suporta a validação nativa de formulários e seus elementos. Para isso, diversos atributos são utilizados nos campos de entrada para configurar a validação. Especificamente, podemos aplicar os seguintes atributos:
: exige que o campo de entrada contenha algum valor.required
: define o valor numérico máximo (para entrada de dados numéricos).max
: define o valor numérico mínimo (para entrada de dados numéricos).min
: define o comprimento máximo da string.maxlength
: define o comprimento mínimo da string.minlength
Por exemplo, consideremos a seguinte página:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
<style>
input {width: 150px;}
input:invalid {border-color: red; }
input:valid { border-color: green;}
</style>
</head>
<body>
<form id="registerForm" name="registerForm" method="post" action="register">
<p>
<label for="username">Username:</label><br>
<input id="username" name="username" maxlength="20" minlength="3" required>
</p>
<p>
<label for="email">Email:</label><br>
<input type="email" id="email" name="email" required>
</p>
<p>
<label for="age">Age:</label><br>
<input type="number" id="age" name="age" min="1" max="110" value="18">
</p>
<button type="submit" id="submit" name="submit">Register</button>
</form>
</body>
</html>
Aqui, o campo username
required
age
Vale destacar que, por meio do seletor input:invalid
input:valid
Se inserirmos um valor que não corresponda aos atributos de validação, ou se não inserirmos nenhum valor nos campos requeridos, ao tentarmos enviar o formulário, o navegador exibirá uma mensagem de erro de validação para o campo correspondente:
A mensagem específica de validação depende do navegador utilizado; o exemplo fornecido é para o Google Chrome. No entanto, o que nos interessa aqui é como podemos interagir com a validação nativa do HTML5 no código JavaScript.
Obtendo Informações sobre Validação em JavaScript
Os navegadores modernos permitem interagir com o mecanismo de validação nativa do HTML5 através do JavaScript, utilizando para isso o Constraint Validation API. Esta API define uma série de propriedades aplicáveis a formulários ou elementos de formulário, permitindo verificar o estado de validação dos elementos:
: retorna um valor booleano indicando se a validação está disponível para o elemento do formulário. RetornawillValidate
se disponível etrue
se indisponível. Por exemplo, se o atributofalse
for aplicado a um elemento de formulário, tornando-o inacessível para interação, a validação para esse elemento não estará disponível. Em relação a outros elementos que não fazem parte do formulário, o valor retornado serádisabled
.undefined
: retorna um objeto do tipovalidity
, que contém informações sobre a validação do elemento do formulário. As propriedades doValidityState
incluem:ValidityState
: indica se o elemento passou pela validação (valid
) ou não (true
).false
: retornavalueMissing
se um valor obrigatório está ausente.true
: retornatypeMismatch
se o valor inserido não corresponde ao tipo do elemento do formulário.true
: retornapatternMismatch
se o valor inserido não corresponde ao padrão especificado.true
: indica se o valor inserido excede o limite máximo permitido.tooLong
: indica se o valor inserido é menor que o mínimo permitido.tooShort
: retornarangeUnderflow
se o valor inserido é menor que o intervalo permitido.true
: retornarangeOverflow
se o valor inserido excede o intervalo permitido.true
: retornastepMismatch
se o valor inserido não corresponde ao valor do atributo step.true
: indica se o valor inserido é incorreto.badInput
: retornacustomError
se um erro personalizado foi lançado durante a entrada.true
: contém a mensagem de erro de validação para o elemento atual do formulário. A mensagem é definida pelo navegador e pode variar de acordo com o tipo de erro.validationMessage
Vamos aplicar algumas dessas propriedades para verificar a entrada em um elemento do formulário:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
<style>
input {width: 150px;}
input:invalid {border-color: red;}
input:valid { border-color: green;}
</style>
</head>
<body>
<form id="registerForm" name="registerForm" method="post" action="register">
<p>
<label for="email">E-mail:</label><br>
<input type="email" id="email" name="email" required>
</p>
<button type="submit" id="submit" name="submit">Register</button>
</form>
<script>
const emailField = document.getElementById("email");
emailField.addEventListener("change", validateEmail);
function validateEmail() {
console.log("Pode ser validado:", emailField.willValidate);
console.log("Valor ausente:", emailField.validity.valueMissing);
console.log("Valor válido:", emailField.validity.valid);
console.log("Correspondência de tipo:", emailField.validity.typeMismatch);
console.log(emailField.validationMessage);
}
</script>
</body>
</html>
Veja o exemplo a seguir:
Graças a isso, podemos realizar um processamento adicional das informações de validação, por exemplo, exibir mensagens de erro de validação na página:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
<style>
input {width: 150px;}
input:invalid {border-color: red;}
input:valid {border-color: green;}
#emailErrors {padding:5px;background-color: #ffcccc; color:#b33939; display:none;}
</style>
</head>
<body>
<form id="registerForm" name="registerForm" method="post" action="register">
<p>
<label for="email">E-mail:</label><br>
<input type="email" id="email" name="email" required>
<div id="emailErrors"></div>
</p>
<button type="submit" id="submit" name="submit">Register</button>
</form>
<script>
const emailField = document.getElementById("email");
const emailErrors = document.getElementById("emailErrors");
emailField.addEventListener("change", validateEmail);
function validateEmail() {
if(!emailField.validity.valid) {
emailErrors.textContent = emailField.validationMessage;
emailErrors.style.display = "block";
} else {
emailErrors.textContent = "";
emailErrors.style.display = "none";
}
}
</script>
</body>
</html>
Aqui, se houver um erro de validação, a mensagem será exibida no bloco emailErrors
function validateEmail() {
if(!emailField.validity.valueMissing) {
emailErrors.textContent = "Email ausente!";
emailErrors.style.display = "block";
} else {
emailErrors.textContent = "";
emailErrors.style.display = "none";
}
}