A cerca de 2 anos atrás, cansado de ter de usar diversas funções capengas para validação de CNPJ com JavaScript e ter que ficar remendando as funções por conta dos bugs, decidi eu mesmo estudar e desenvolver uma função mais simples e funcional para tal. Segue a função com algumas explicações simples do processo.
function IsCNPJ(cnpj) {<br />
// Retornando falso para valores inválidos<br />
if (cnpj == undefined || cnpj == null || isNaN(cnpj.replace(/\D/g, ""))<br />
|| cnpj.replace(/\D/g, "").length != 14) {<br />
return false;<br />
}</p>
<p> // Definindo vetores e Dac's<br />
var cnpj = cnpj.replace(/\D/g, "").substring(0, 12).split("");<br />
var contDac1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];<br />
var contDac2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];<br />
var dac1 = 0;<br />
var dac2 = 0;</p>
<p> // Efetuando soma da multiplicação dos valores para o primeiro dígito do Dac<br />
for (var iDac1 = 0; iDac1 < contDac1.length; iDac1++) {<br />
dac1 += cnpj[iDac1] * contDac1[iDac1];<br />
}</p>
<p> // Resgatando resto da divisão para definição do primeiro dígito do Dac<br />
dac1 = dac1 % 11;</p>
<p> // Verificando se o resto da divisão é menor que 2<br />
if (dac1 < 2) {<br />
// Atribuir 0 ao primeiro dígito do Dac se o resto da divisão for 0 ou 1<br />
dac1 = 0;<br />
}<br />
else {<br />
// Atribuir 11 subtraído do resto da divisão para o primeiro dígito do<br />
// Dac<br />
dac1 = 11 - dac1;<br />
}</p>
<p> // Adicionar ao vetor de algarismos do CNPJ o primeiro dígito do Dac<br />
cnpj.push(dac1);</p>
<p> // Efetuando soma da multiplicação dos valores para o segundo dígito do Dac<br />
for (var iDac2 = 0; iDac2 < contDac2.length; iDac2++) {<br />
dac2 += cnpj[iDac2] * contDac2[iDac2];<br />
}</p>
<p> // Resgatando resto da divisão para definição do segundo dígito do Dac<br />
dac2 = dac2 % 11;</p>
<p> // Verificando se o resto da divisão é menor que 2<br />
if (dac2 < 2) {<br />
// Atribuir 0 ao segundo dígito do Dac se o resto da divisão for 0 ou 1<br />
dac2 = 0;<br />
}<br />
else {<br />
// Atribuir 11 subtraído do resto da divisão para o segundo dígito do<br />
// Dac<br />
dac2 = 11 - dac2;<br />
}</p>
<p> // Adicionar ao vetor de algarismos do CNPJ o segundo dígito do Dac<br />
cnpj.push(dac2);</p>
<p> // Verificando se a união do CNPJ obtido se assemelha ao CNPJ fornecido<br />
return (cnpj.join("") == cnpj.replace(/\D/g, ""));<br />
}
See ya!!!