Trabalhando com formulários
Nesta aula, você aprenderá a interagir com formulários HTML usando JavaScript, incluindo leitura de valores, validação, manipulação do evento submit e uso do objeto FormData para coleta e envio de dados.
Formulários são a principal forma de coleta de dados do usuário na web. Com JavaScript, podemos ler, validar e enviar esses dados de forma dinâmica, melhorando a experiência do usuário e garantindo a integridade das informações. Nesta aula, abordaremos as técnicas essenciais para trabalhar com formulários: desde a leitura de valores de campos até o uso moderno do objeto FormData.
Dominar essas habilidades é fundamental para criar aplicações web interativas e responsivas. Você verá como prevenir o envio padrão, validar entradas e enviar dados assincronamente via AJAX.
Lendo valores
Para ler valores de campos de formulário, podemos acessar o elemento do campo e sua propriedade value. Isso funciona para inputs de texto, textarea, selects e outros. É importante considerar o momento da leitura: geralmente, queremos ler os valores quando um evento ocorre, como um clique ou mudança.
Exemplo: suponha um formulário com campos de nome e email. Podemos ler seus valores assim:
const nomeInput = document.getElementById('nome');
const emailInput = document.getElementById('email');
function lerValores() {
const nome = nomeInput.value;
const email = emailInput.value;
console.log('Nome:', nome, 'Email:', email);
}Para selects, a propriedade value retorna o valor da opção selecionada. Para checkboxes e radios, usamos checked para saber se estão marcados e value para obter o valor associado. Exemplo com checkbox:
const aceitoInput = document.getElementById('aceito');
if (aceitoInput.checked) {
console.log('Aceito:', aceitoInput.value);
}Validação
A validação de formulários pode ser feita de dois modos: validação nativa do HTML5 (atributos como required, pattern, minlength) e validação customizada com JavaScript. A validação nativa é exibida automaticamente pelo navegador, mas pode ser personalizada ou complementada com JavaScript.
Com JavaScript, podemos verificar campos antes do envio, exibir mensagens de erro personalizadas e impedir o envio se houver erros. Exemplo de validação de email:
function validarEmail(email) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return regex.test(email);
}
const emailInput = document.getElementById('email');
emailInput.addEventListener('blur', function() {
if (!validarEmail(this.value)) {
this.classList.add('is-invalid');
// exibir mensagem de erro
} else {
this.classList.remove('is-invalid');
}
});Podemos também utilizar a API de Validação de Restrições (HTMLFormElement.elements e checkValidity()). Exemplo:
const form = document.getElementById('meuForm');
if (form.checkValidity() === false) {
// exibir erros
} else {
// enviar
}Evento submit
O evento submit é disparado quando o formulário é enviado. Para controlar o envio, adicionamos um listener e chamamos event.preventDefault() para evitar o recarregamento da página. Isso permite que enviemos os dados via AJAX ou realizemos validações antes do envio.
Exemplo básico:
const form = document.getElementById('meuForm');
form.addEventListener('submit', function(event) {
event.preventDefault();
// ler dados e enviar
const formData = new FormData(form);
// enviar com fetch
});É importante lembrar que o evento submit também pode ser acionado por JavaScript (form.submit()), mas nesse caso o evento não é disparado. Portanto, sempre use o listener para capturar envios.
FormData
O objeto FormData é uma interface que permite construir facilmente um conjunto de pares chave/valor representando campos de formulário e seus valores. Ele é especialmente útil para enviar dados via AJAX, pois pode ser passado diretamente para o método fetch ou XMLHttpRequest.
Criando um FormData a partir de um formulário existente:
const form = document.getElementById('meuForm');
const formData = new FormData(form);
// Acessar valores
const nome = formData.get('nome');
const email = formData.get('email');
// Iterar sobre todos os campos
for (let [key, value] of formData.entries()) {
console.log(key, value);
}Também podemos adicionar dados manualmente:
formData.append('chave', 'valor');
formData.set('chave', 'novo valor'); // substitui se existir
formData.delete('chave');Para enviar com fetch:
fetch('/api/enviar', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => console.log(data));Note que o FormData define automaticamente o cabeçalho Content-Type como multipart/form-data.
Boas Práticas
- Sempre valide tanto no cliente quanto no servidor.
- Use
typeadequado nos inputs (email, number, etc.) para aproveitar validação nativa. - Forneça feedback visual imediato ao usuário.
- Evite enviar formulários com campos vazios ou inválidos.
- Prefira o uso de
FormDatapara envio de formulários complexos ou com arquivos.
Referências
- MDN: Validação de formulários
- MDN: FormData
- MDN: Evento submit
- MDN: Validação de dados de formulário
- MDN: HTMLFormElement.elements
- MDN: Usando Fetch API
Exercícios
Crie um formulário com campos de nome e email. Ao clicar em um botão, leia os valores e exiba em um alerta.
✓ Resposta: HTML: <form id="form1"> Nome: <input type="text" id="nome1"> Email: <input type="email" id="email1"> <button type="button" id="btn1">Mostrar</button> </form> JavaScript: const btn = document.getElementById('btn1'); btn.addEventListener('click', function() { const nome = document.getElementById('nome1').value; const email = document.getElementById('email1').value; alert(`Nome: ${nome}, Email: ${email}`); });Adicione validação customizada ao campo de email: deve conter '@' e um domínio. Exiba uma mensagem de erro se inválido.
✓ Resposta: const emailInput = document.getElementById('email1'); const errorSpan = document.createElement('span'); errorSpan.style.color = 'red'; emailInput.parentNode.appendChild(errorSpan); emailInput.addEventListener('blur', function() { const value = this.value; if (!value.includes('@') || !value.includes('.')) { errorSpan.textContent = 'Email inválido'; } else { errorSpan.textContent = ''; } });Capture o evento submit de um formulário e evite o envio padrão. Exiba no console os dados do formulário usando FormData.
✓ Resposta: const form = document.getElementById('form1'); form.addEventListener('submit', function(event) { event.preventDefault(); const formData = new FormData(form); for (let [key, value] of formData.entries()) { console.log(key, value); } });Utilizando FormData, envie os dados de um formulário para uma URL fictícia via fetch. Simule uma resposta de sucesso.
✓ Resposta: form.addEventListener('submit', function(event) { event.preventDefault(); const formData = new FormData(form); fetch('https://httpbin.org/post', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => console.log('Sucesso:', data)) .catch(error => console.error('Erro:', error)); });Crie um formulário que inclua um campo de arquivo (input type file). Ao enviar, use FormData e exiba o nome do arquivo no console.
✓ Resposta: HTML: <form id="formFile"> <input type="file" id="arquivo" name="arquivo"> <button type="submit">Enviar</button> </form> JavaScript: const formFile = document.getElementById('formFile'); formFile.addEventListener('submit', function(event) { event.preventDefault(); const formData = new FormData(formFile); const file = formData.get('arquivo'); console.log('Nome do arquivo:', file.name); });