JavaScript

Formulários em JavaScript: Validação, Submissão e FormData: Do Básico ao Avançado

7 min de leitura

Formulários em JavaScript: Validação, Submissão e FormData: Do Básico ao Avançado

Validação de Formulários com JavaScript A validação de formulários é a primeira barreira entre dados inválidos e seu banco de dados. Existem duas abordagens: validação HTML5 nativa e validação JavaScript customizada. A validação HTML5 oferece feedback instantâneo com atributos como , e , mas é limitada. A validação em JavaScript oferece controle total e mensagens personalizadas. Comece sempre com HTML5 para criar a camada inicial de proteção, depois reforce com JavaScript no lado do cliente: Agora, implemente validações customizadas em JavaScript: ${e} Submissão de Formulários A submissão adequada envolve mais que apenas disparar um evento — requer feedback ao usuário, prevenção de duplo envio e tratamento de respostas do servidor. O método tradicional é usar ou , mas é mais moderno e limpo. O fluxo ideal é: validar → desabilitar botão → enviar → aguardar resposta → restaurar estado: FormData: Manipulação Avançada é uma API nativa que captura dados de formulários incluindo arquivos. É especialmente útil para uploads e envios

<h2>Validação de Formulários com JavaScript</h2>

<p>A validação de formulários é a primeira barreira entre dados inválidos e seu banco de dados. Existem duas abordagens: validação HTML5 nativa e validação JavaScript customizada. A validação HTML5 oferece feedback instantâneo com atributos como <code>required</code>, <code>type=&quot;email&quot;</code> e <code>pattern</code>, mas é limitada. A validação em JavaScript oferece controle total e mensagens personalizadas.</p>

<p>Comece sempre com HTML5 para criar a camada inicial de proteção, depois reforce com JavaScript no lado do cliente:</p>

<pre><code class="language-html">&lt;form id=&quot;formulario&quot;&gt;

&lt;input type=&quot;text&quot; id=&quot;nome&quot; name=&quot;nome&quot; required minlength=&quot;3&quot;&gt;

&lt;input type=&quot;email&quot; id=&quot;email&quot; name=&quot;email&quot; required&gt;

&lt;input type=&quot;password&quot; id=&quot;senha&quot; name=&quot;senha&quot; required minlength=&quot;8&quot;&gt;

&lt;button type=&quot;submit&quot;&gt;Enviar&lt;/button&gt;

&lt;/form&gt;</code></pre>

<p>Agora, implemente validações customizadas em JavaScript:</p>

<pre><code class="language-javascript">const form = document.getElementById(&#039;formulario&#039;);

form.addEventListener(&#039;submit&#039;, (e) =&gt; {

e.preventDefault();

const nome = document.getElementById(&#039;nome&#039;).value.trim();

const email = document.getElementById(&#039;email&#039;).value.trim();

const senha = document.getElementById(&#039;senha&#039;).value;

let erros = [];

if (nome.length &lt; 3) {

erros.push(&#039;Nome deve ter pelo menos 3 caracteres&#039;);

}

if (!validarEmail(email)) {

erros.push(&#039;Email inválido&#039;);

}

if (senha.length &lt; 8) {

erros.push(&#039;Senha deve ter no mínimo 8 caracteres&#039;);

}

if (erros.length &gt; 0) {

mostrarErros(erros);

return;

}

console.log(&#039;Formulário válido!&#039;);

});

function validarEmail(email) {

const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

return regex.test(email);

}

function mostrarErros(erros) {

const div = document.getElementById(&#039;erros&#039;) ||

document.createElement(&#039;div&#039;);

div.id = &#039;erros&#039;;

div.style.color = &#039;red&#039;;

div.innerHTML = &#039;&lt;ul&gt;&#039; +

erros.map(e =&gt; &lt;li&gt;${e}&lt;/li&gt;).join(&#039;&#039;) +

&#039;&lt;/ul&gt;&#039;;

form.parentNode.insertBefore(div, form);

}</code></pre>

<h2>Submissão de Formulários</h2>

<p>A submissão adequada envolve mais que apenas disparar um evento — requer feedback ao usuário, prevenção de duplo envio e tratamento de respostas do servidor. O método tradicional é usar <code>fetch()</code> ou <code>XMLHttpRequest</code>, mas <code>fetch()</code> é mais moderno e limpo.</p>

<p>O fluxo ideal é: validar → desabilitar botão → enviar → aguardar resposta → restaurar estado:</p>

<pre><code class="language-javascript">const form = document.getElementById(&#039;formulario&#039;);

const botao = form.querySelector(&#039;button[type=&quot;submit&quot;]&#039;);

form.addEventListener(&#039;submit&#039;, async (e) =&gt; {

e.preventDefault();

if (!validarFormulario(form)) {

return;

}

botao.disabled = true;

botao.textContent = &#039;Enviando...&#039;;

try {

const formData = new FormData(form);

const resposta = await fetch(&#039;/api/usuario&#039;, {

method: &#039;POST&#039;,

body: formData

});

if (resposta.ok) {

const dados = await resposta.json();

alert(&#039;Enviado com sucesso!&#039;);

form.reset();

} else {

alert(&#039;Erro na submissão. Tente novamente.&#039;);

}

} catch (erro) {

console.error(&#039;Erro:&#039;, erro);

alert(&#039;Erro de conexão&#039;);

} finally {

botao.disabled = false;

botao.textContent = &#039;Enviar&#039;;

}

});

function validarFormulario(form) {

return form.checkValidity() === true;

}</code></pre>

<h2>FormData: Manipulação Avançada</h2>

<p><code>FormData</code> é uma API nativa que captura dados de formulários incluindo arquivos. É especialmente útil para uploads e envios complexos. Em vez de construir manualmente strings de dados, <code>FormData</code> manipula automaticamente serialização e encoding.</p>

<pre><code class="language-html">&lt;form id=&quot;formulario&quot; enctype=&quot;multipart/form-data&quot;&gt;

&lt;input type=&quot;text&quot; name=&quot;nome&quot; required&gt;

&lt;input type=&quot;email&quot; name=&quot;email&quot; required&gt;

&lt;input type=&quot;file&quot; name=&quot;avatar&quot;&gt;

&lt;textarea name=&quot;bio&quot;&gt;&lt;/textarea&gt;

&lt;button type=&quot;submit&quot;&gt;Enviar&lt;/button&gt;

&lt;/form&gt;</code></pre>

<pre><code class="language-javascript">const form = document.getElementById(&#039;formulario&#039;);

form.addEventListener(&#039;submit&#039;, async (e) =&gt; {

e.preventDefault();

// FormData captura todos os campos automaticamente

const formData = new FormData(form);

// Adicione dados extras se necessário

formData.append(&#039;timestamp&#039;, new Date().toISOString());

// Verifique os dados antes de enviar (útil para debug)

for (let [chave, valor] of formData.entries()) {

console.log(${chave}: ${valor});

}

try {

const resposta = await fetch(&#039;/api/perfil&#039;, {

method: &#039;POST&#039;,

body: formData

// Não defina Content-Type — o navegador faz automaticamente

});

const resultado = await resposta.json();

console.log(&#039;Sucesso:&#039;, resultado);

} catch (erro) {

console.error(&#039;Erro:&#039;, erro);

}

});</code></pre>

<h3>Validação com FormData</h3>

<p>Para validações complexas, combine <code>FormData</code> com regras customizadas:</p>

<pre><code class="language-javascript">function validarComFormData(formData) {

const erros = [];

// Validar nome

const nome = formData.get(&#039;nome&#039;);

if (!nome || nome.trim().length &lt; 3) {

erros.push(&#039;Nome inválido&#039;);

}

// Validar arquivo (se existir)

const arquivo = formData.get(&#039;avatar&#039;);

if (arquivo &amp;&amp; arquivo.size &gt; 5242880) { // 5MB

erros.push(&#039;Arquivo muito grande&#039;);

}

return erros.length === 0 ? true : erros;

}

// No evento submit:

const validacao = validarComFormData(formData);

if (validacao !== true) {

console.log(&#039;Erros:&#039;, validacao);

return;

}</code></pre>

<h2>Conclusão</h2>

<p>Dominar validação de formulários em JavaScript envolve três pilares: <strong>validação robuusta no cliente</strong> (HTML5 + JavaScript customizado), <strong>submissão controlada</strong> com feedback ao usuário e prevenção de duplo envio, e <strong>FormData como ferramenta moderna</strong> para capturar e enviar dados complexos incluindo arquivos. Sempre valide também no servidor — nunca confie apenas em validações do cliente. A combinação dessas técnicas resulta em formulários seguros, responsivos e profissionais.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/FormData" target="_blank" rel="noopener noreferrer">MDN Web Docs - FormData API</a></li>

<li><a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation" target="_blank" rel="noopener noreferrer">MDN Web Docs - Form Validation</a></li>

<li><a href="https://javascript.info/fetch" target="_blank" rel="noopener noreferrer">JavaScript.info - Fetch API</a></li>

<li><a href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html" target="_blank" rel="noopener noreferrer">W3C - HTML Form Submission</a></li>

<li><a href="https://web.dev/sign-up-form-best-practices/" target="_blank" rel="noopener noreferrer">Web.dev - Sign-up Form Best Practices</a></li>

</ul>

Comentários

Mais em JavaScript

Dominando Async e Await em JavaScript: Código Assíncrono com Aparência Síncrona em Projetos Reais
Dominando Async e Await em JavaScript: Código Assíncrono com Aparência Síncrona em Projetos Reais

O Problema das Callbacks e Promises Antes de entender async/await, você preci...

Generators e Iteradores em JavaScript na Prática
Generators e Iteradores em JavaScript na Prática

Iteradores: A Base de Tudo Um iterador é um objeto JavaScript que implementa...

Callbacks em JavaScript: O Padrão Original de Assincronismo: Do Básico ao Avançado
Callbacks em JavaScript: O Padrão Original de Assincronismo: Do Básico ao Avançado

Callbacks em JavaScript: O Padrão Original de Assincronismo O que é um Callba...