<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Lauro Lyra Aguiar</title>
    <description>The latest articles on Forem by Lauro Lyra Aguiar (@laurolyra).</description>
    <link>https://forem.com/laurolyra</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F575810%2Feb70ec6b-4ae3-4491-8f71-0fb93fc91a2e.jpeg</url>
      <title>Forem: Lauro Lyra Aguiar</title>
      <link>https://forem.com/laurolyra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/laurolyra"/>
    <language>en</language>
    <item>
      <title>Adicionando máscaras nos inputs HTML (JS vanilla)</title>
      <dc:creator>Lauro Lyra Aguiar</dc:creator>
      <pubDate>Mon, 01 Mar 2021 23:25:03 +0000</pubDate>
      <link>https://forem.com/laurolyra/adicionando-mascaras-nos-inputs-html-js-vanilla-5f1l</link>
      <guid>https://forem.com/laurolyra/adicionando-mascaras-nos-inputs-html-js-vanilla-5f1l</guid>
      <description>&lt;p&gt;[UPDATE] Na época da publicação, o código possuia um erro de funcionalidade que o &lt;a href="https://dev.to/vitorluizc"&gt;@vitorluizc&lt;/a&gt; apontou. Agradeço demais pela observação, no que corrigi o código.  &lt;/p&gt;

&lt;p&gt;Olá a todos!&lt;br&gt;
Neste post pretendo ensinar a inserir máscaras nos inputs HTML, sem uso de bibliotecas externas e compatível com a maioria dos frameworks javascript - se não com todos eles.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. O que é uma máscara?
&lt;/h2&gt;

&lt;p&gt;Uma máscara consiste na estilização das informações inseridas pelo usuário no input. isso facilita a leitura e, em nosso exemplo, dará a certeza de que os dados foram inseridos no tamanho correto.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Mas se a lib [INSIRA O NOME DE UMA BIBLIOTECA AQUI] faz esse trabalho pra mim, por quê eu deveria criar uma máscara "na mão"?
&lt;/h2&gt;

&lt;p&gt;É uma pergunta muito interessante, a qual comporta várias respostas.&lt;/p&gt;

&lt;p&gt;Em primeiro lugar, vale a pena criar sua própria máscara porque, como veremos abaixo, ela se adapta a diversos tipos de input - e muitas libs comportam somente os campos mais comuns, como CPF ou telefone. É muito difícil achar uma lib que, sozinha, crie as máscaras pra todos os campos desejados.&lt;/p&gt;

&lt;p&gt;Em segundo lugar, há sempre um grande debate sobre o uso de lib pra tudo. Eu sempre levo em consideração que menos é mais, por isso evito ao máximo o uso de bibliotecas externas, usando-as somente em casos muito específicos em que ela facilita minha vida com uma funcionalidade de lógica muito complexa ou quando ela já possui uma construção sólida, caso da &lt;a href="https://www.npmjs.com/package/yup"&gt;Yup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Em terceiro lugar, é uma boa experiência de aprendizado e manipulação de objetos.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Passadas essas considerações, mãos à obra!
&lt;/h2&gt;

&lt;p&gt;Vamos começar criando um HTML dando olá ao mundo (não acredito em maldições, mas é melhor não contrariar). Teremos também um campo de input destinado ao CPF do usuário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="pt-br"&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset="UTF-8"&amp;gt;
  &amp;lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&amp;gt;
  &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
  &amp;lt;title&amp;gt;Mask input&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;
  &amp;lt;div&amp;gt;
      &amp;lt;label&amp;gt;digite o CPF / insert CPF:&amp;lt;/label&amp;gt;
      &amp;lt;input id="CPFInput" maxlength="14"&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atente que o nosso input possui o atributo &lt;code&gt;maxlength&lt;/code&gt;. Ele é o grande responsável por limitar o campo para que sejam inseridos os caracteres que o nosso campo usa, bem como eventuais traços e pontos - que serão exibidos posteriormente.&lt;/p&gt;

&lt;p&gt;Também criamos uma &lt;code&gt;id&lt;/code&gt; para nosso &lt;code&gt;input&lt;/code&gt;. Isso será importante para os passos posteriores.&lt;/p&gt;

&lt;p&gt;Feito isso, vamos criar a tag &lt;code&gt;script&lt;/code&gt; e inserir nossa função dentro do input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;label&amp;gt;digite o CPF / insert CPF:&amp;lt;/label&amp;gt;
    &amp;lt;input id="CPFInput" maxlength="14" oninput="criaMascara()"&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
  function criaMascara(){
    console.log('algo foi digitado!')
  };
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;em&gt;ocultei algumas linhas pra não ficar repetitivo&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;Ao implementarmos a função &lt;code&gt;criaMascara&lt;/code&gt;, note que, sempre que algo for digitado dentro do input, surgirá no console a frase &lt;code&gt;algo foi digitado!&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora vamos apagar esse teste. Nossa manipulação do DOM começa agora.&lt;/p&gt;

&lt;p&gt;Vamos começar passando um parâmetro pra nossa função &lt;code&gt;criaMascara&lt;/code&gt; - neste caso, será a string &lt;code&gt;'CPF'&lt;/code&gt;. Dentro da função, manipularemos o DOM a partir dessa variável. Observe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      &amp;lt;input id="CPFInput" maxlength="14" oninput="criaMascara('CPF')"&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
  function criaMascara(mascaraInput) {
    const tamanhoInput = document.getElementById(`${mascaraInput}Input`).maxLength;
    let valorInput = document.getElementById(`${mascaraInput}Input`).value;
   console.log('tamanho máximo:', tamanhoInput, 'valor do input:', valorInput)
  };
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Graças ao uso das &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Template_literals"&gt;Template literals&lt;/a&gt;, podemos selecionar um elemento do DOM dinamicamente e aplicar esta função para todo o nosso código, bastando dar uma ID com o mesmo padrão da CPFInput - algo como telefoneInput, CNPJInput, CEPInput e etc. E ao digitarmos qualquer coisa, teremos o valor do &lt;code&gt;input&lt;/code&gt; e o atributo &lt;code&gt;maxLength&lt;/code&gt; do nosso input escrito no console.&lt;/p&gt;

&lt;p&gt;Feitos esses passos, vamos criar um objeto que conterá o formato da nossa máscara, a qual será aplicada tão logo o nosso &lt;code&gt;input&lt;/code&gt; tiver o tamanho igual ao atributo &lt;code&gt;maxLength&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  function criaMascara(mascaraInput) {
    const maximoInput = document.getElementById(`${mascaraInput}Input`).maxLength;
    let valorInput = document.getElementById(`${mascaraInput}Input`).value;
    const mascaras = {
      CPF: valorInput.replace(/[^\d]/g, "").replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, "$1.$2.$3-$4")
    };

    if (valorInput.length === maximoInput) {
      (document.getElementById(`${mascaraInput}Input`).value = mascaras[mascaraInput])
    }
  };
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você for familiarizado com ternários, pode utilizar essa sintaxe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  function criaMascara(mascaraInput) {
    const maximoInput = document.getElementById(`${mascaraInput}Input`).maxLength;
    let valorInput = document.getElementById(`${mascaraInput}Input`).value;
    const mascaras = {
      CPF: valorInput.replace(/[^\d]/g, "").replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, "$1.$2.$3-$4")
    };

    valorInput.length === maximoInput &amp;amp;&amp;amp; (document.getElementById(`${mascaraInput}Input`).value = mascaras[mascaraInput]);
  };
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chamamos a função SEMPRE que o &lt;code&gt;input&lt;/code&gt; é alterado, mas, como dissemos acima, ela somente fará algo quando o tamanho do nosso input for igual à propriedade &lt;code&gt;maxLength&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No caso concreto, quando nosso input tiver exatos 11 caracteres, o valor do input será igual à chave CPF da nossa variável &lt;code&gt;mascaras&lt;/code&gt; - ou seja, nosso &lt;code&gt;input&lt;/code&gt; será afetado por duas funções &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/String/replace"&gt;replace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[UPDATE] Todavia, precisamos nos certificar que, quando o tamanho do nosso input sem caracteres especiais for menor que o valor máximo, os pontos e traços deverão ser removidos da string. Por isso, tratei de criar uma nova variável chamada &lt;em&gt;valorSemPonto&lt;/em&gt; e acrescentei uma nova condição ao nosso ternário (equivalente a um &lt;code&gt;else&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  function criaMascara(mascaraInput) {
    const maximoInput = document.getElementById(`${mascaraInput}Input`).maxLength;
    let valorInput = document.getElementById(`${mascaraInput}Input`).value;
    let valorSemPonto = document.getElementById(`${mascaraInput}Input`).value.replace(/([^0-9])+/g, "");
    const mascaras = {
      CPF: valorInput.replace(/[^\d]/g, "").replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, "$1.$2.$3-$4")
    };

    valorInput.length === maximoInput ? document.getElementById(`${mascaraInput}Input`).value = mascaras[mascaraInput] : document.getElementById(`${mascaraInput}Input`).value = valorSemPonto;
  };
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;a variável &lt;code&gt;valorSemPonto&lt;/code&gt; nada mais é do que uma substituição de todos os caracteres não numéricos por nada - na prática, estamos removendo qualquer coisa que não seja um número&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Graças às REGExp que implementamos em cada função, o primeiro &lt;code&gt;replace&lt;/code&gt; removerá todos os caracteres não numéricos. O segundo aplicará os pontos após cada grupo de três números e, em seguida, um traço antes dos dois últimos números.&lt;/p&gt;

&lt;p&gt;E sua máscara está pronta, reaproveitando tudo com apenas uma função e usando um objeto ao invés de um monte de &lt;code&gt;if&lt;/code&gt;, reduzindo sobremaneira a complexidade do código!&lt;/p&gt;

&lt;p&gt;Agora você pode criar quantos inputs quiser, e no formato que quiser, basta atentar pro nome do &lt;code&gt;id&lt;/code&gt; de cada &lt;code&gt;input&lt;/code&gt;, atribuir um número máximo de caracteres com &lt;code&gt;maxLength&lt;/code&gt; e inserir a REGExp adequada. Abaixo temos o código pronto com mais três exemplos (clique em HTML para ver os demais inputs).&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/laurolyra/embed/KKNRaVo?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado desta postagem. Até a próxima!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>ux</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
