Olá pessoal,
“O presidente da Anatel (Agência Nacional de Telecomunicações), João Rezende, informou nesta sexta-feira que o acréscimo do nono dígito aos números de celulares da região metropolitana de São Paulo vai garantir 53 milhões de novas combinações numéricas.”
http://www1.folha.uol.com.br/mercado/1040493-nono-digito-garante-53-mi-de-novos-numeros-de-celular-em-sp.shtml
(\___/)
( ͡ ͡° ͜ ʖ ͡ ͡°)
\╭☞ \╭☞ Follow me on Twitter!
Sabendo disso, é importante começarmos a pensar em soluções para atender as mascaras de telefone de todo o Brasil e também para região metropolitana de São Paulo.
Já faz uns meses que falei sobre o jQuery Mask Plugin. E desta vez, também vamos resolver este mesmo problema com o ele. Criei um exemplo no jsFiddle de como resolver da mascara javascript com o novo nono dígito nos telefones celulares de São Paulo. Você pode ver o exemplo funcionando aqui: http://jsfiddle.net/d29m6enx/2/
E o código é este:
[javascript] // using jQuery Mask Plugin v1.7.5 // http://jsfiddle.net/d29m6enx/2/ var maskBehavior = function (val) { return val.replace(/\D/g, '').length === 11 ? '(00) 00000-0000' : '(00) 0000-00009'; }, options = {onKeyPress: function(val, e, field, options) { field.mask(maskBehavior.apply({}, arguments), options); } }; $('.phone').mask(maskBehavior, options); [/javascript]
Desta forma, atendemos todos os números de telefone do Brasil e também atendemos a nova forma da Anatel para os telefones da região metropolitana de São Paulo, simples, certo? Ainda bem que tive a ideia de implementar estes eventos nas mascaras antes mesmo desta norma da Anatel 🙂
É isso, simples e objetivo!
UPDATE 10/10/2014
Eu e o @dgmike fizemos uma versão um pouco mais otimizada da solução apresentada pelo Bruno Porto em comentário:
http://jsfiddle.net/d29m6enx/2/
Também precisa dar um jeito de também encaixar telefones fixos. Mesmo com DDD 11, eles continuam com 8 dígitos.
Eu *forqueei* o seu fiddle e dei um jeitinho nisso: http://jsfiddle.net/xZSF2/1/
LikeLike
É verdade, a resolução serve somente para telefones celulares, porém, o seu fork só resolve para telefones celulares que começam com 9. Telefones celulares começam com 7,8 e 9.
LikeLike
Mas agora todos os celulares começam com 9, não? O meu, por exemplo, começava com 7 (7999-…); agora começa com 9 (97999-…).
LikeLike
A expressão ficou assim:
\(11\) 9(9|8|7)).+/i
Ou seja, se você digitar o celular já com o novo digito, ele vai considerar a regra somente a partir do segundo digito após o nono dígito. Celulares que começam com 9, 8 e 7 também vai aderir a nova mascara. Alterei o link do fiddle no post e da para você ver funcionando. 🙂
LikeLike
Só não está funcionando com mais de um elemento, tem como ver isso??
LikeLike
@diego Foi só um exemplo 🙂
Para funcionar com mais de um campo o exemplo tem que ser mais elaborado:
var options = {onKeyPress: function(phone, e){
$target = “.” + $(e.target).closest(‘input’).attr(‘class’);
if(/(\(11\) 9(9|8|7)).+/i.test(phone)){
$($target).mask(‘(00) 00000-0000’, options);
} else {
$($target).mask(‘(00) 0000-0000’, options);
}
}};
$(‘.sao_paulo_phone_number’).mask(‘(00) 0000-0000’, options);
$(‘.sao_paulo_phone_number2’).mask(‘(00) 0000-0000’, options);
LikeLike
Beleza cara, é que voce estava usando um seletor de classe, mas di boa, ótimo trabalho voce fez com esse plugin, está sendo muito útil, parabéns!
LikeLike
Só pra tirar uma dúvida mesmo, no de voces funcionou no IE 8? Aqui não.
LikeLike
Só para agregar ai, existem celulares de são paulo da tim que começavam com 5 tambem.
LikeLike
Trabalhei em algumas melhorias no plugin esta noite, já deu pra ver que o código já ficou diferente e agora vocês não teram mais problemas com seletores de classes etc.
Tive que usar o target no exemplo anterior para “driblar” uma limitação que encontrei decorrente destas necessidades no callback. Agora ficou show 😉
LikeLike
Igor,
Para nosso desespero parece que não são só os 7|8|9. Os 5|6 também entram, sendo que tem 5 que não entra, e ainda tem o 77 e 78 que não entram na nova regra. Ô ANATEL sacana =/
http://blog.thiagorodrigo.com.br/index.php/prefixos_das_operadoras_de_celular_em_sp
LikeLike
@Dentxinho
Fiz uma alteração no código do post e no jsfiddle, pode estar que eu acho que agora ficou redondo 😉
LikeLike
como que eu faco para usar essa mascara chamando a funcao no onkeypress?!?!? como ficaria a funcao no arquivo js?!?!?! obrigado…
LikeLike
Você pode ver um exemplo no link que está dentro do artigo, Adam.
http://jsfiddle.net/NJMSj/30/
LikeLike
Eu vi o exemplo, mas no exemplo vc trata como uma classe… Eu nao sei como alterar isso para chamar a funcao no onkeypress e colocar essa funcao no meu arquivo junto com outras mascaras…
LikeLike
cara deixei minha funcao assim… mas ainda sim nao funciona… voce sabe me dizer o que esta errado?!?!?
function MascaraCel(cel){
if(/(\(11\) 9(9|8|7)).+/i.test(cel))
return formataCampo(cel, ‘(00) 00000-0000’, event);
else
return formataCampo(cel, ‘(00) 0000-0000’, event);
}
LikeLike
Adam,
Todo o código que você precisa para implementar é o que está no post, nada mais.
Basta trocar o seletor jquery $(‘.sao_paulo_phone_number’) para o elemento que você quer aplicar a mascara, não tem segredo.
LikeLike
ja fiz todas as mudancas possiveis que veio a minha cabeca e nada funcionou… relamente nao sei o que eu estou fazendo de errado…
LikeLike
consegui… valeu…
LikeLike
excelente!
LikeLike
Boa Tarde,
Está me retornando a seguinte mensagem de erro no Firefox através do Firebug:
too much recursion
…unction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})})…
Alguém poderia me dar um help?
Está funcionando normalmente mas está lento o processamento na hora que está sendo digitado o número do telefone.
LikeLike
@Rodrigo
Qual versão do jquery mask plugin você está utilizando?
LikeLike
Olá!
Vocês sabem que Telefones Nextel não entram na regra do nono dígito?
Como deverá ser o tratamento para esse caso nessa máscara?
[]s
LikeLike
Estamos usando em um projeto seu plugin, diga-se de passagem muito bacana. Mas estamos com um pequeno problema para telefones de SP.
Quando o valor do telefone vem do servidor, o plugin deixa o campo de texto formatado inicialmente com: (99) 9999-9999 e o valor mesmo sendo com um dígito a mais acaba sendo limitado pela máscara que está no campo.
LikeLike
Verifica se o código que vocês estão usando é o mesmo que está sendo mencionado aqui no POST. O código passou por várias atualizações.
LikeLike
É o mesmo código cara, funciona perfeito quando o usuário está digitando. Nosso único problema é quando vamos carregar um registro do bd. Exemplo: vou alterar um cliente, mesmo no banco de dados estando o telefone com os dígitos 11999999999, acaba saindo nesse formato (11)9999-9999.
Vou tentar alterar o JQuery que seta a máscara, para verificar o tamanho da string e aí sim setar a máscara, pois ela só está sendo alterada no keyPress.
Olha como está hoje:
“$(‘.sao_paulo_phone_number’).mask(‘(00) 0000-0000’,…..”
Se eu conseguir condicionar o momento em que a máscara está sendo setada, acredito que consigo solucionar meu problema.
LikeLike
Eu tive o mesmo problema que você e foi assim que eu resolvi:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
phonemask.js
hosted with ❤ by GitHub
LikeLike
No meu caso o dado já vem formatado pelo sistema (00) 00000-0000 então talvez você precise adaptar a linha 12:
mask = phone_field.val().match(phone_mask) ? ‘(00) 00000-0000’ : ‘(00) 0000-0000’;
LikeLike
Só tive que tirar o scope daqui: phone_fields = $(“.phone”, scope);
E funcionou perfeitamente! Muitíssimo Obrigado Sr. Igor Escobar!
LikeLike
De nada 🙂
LikeLike
Pessoal, na versão v.0.5.0 do jQuery Mask Plugin vocês já podem passar uma função como mascara e implementar a logica de inicialização da mascara. Desta forma fica mais elegante a forma como resolvemos o problema das mascaras para celulares de SP.
Antes era assim: https://gist.github.com/3724610/a645335f693b1b7cf00838ab87aded5b58033beb
Com a versão nova fica assim:
https://gist.github.com/3724610/5003f97804ea1e62a3182e21c3b0d3ae3b657dd9
[]’s
Igor.
LikeLike
Olha eu “quase” não entendo nada de programação rsss
Sou apenas curiosa, mas consegui usar tudo direitinho, inclusive tenho três campos de telefones, como não sabia como fazer rsss, usei três class diferentes.
Obrigada pela dica, ajudou e muito!
LikeLike
Boa tarde Igor teria como fazer uma alteração para verificar o numero na hora da digitacao e inserir automaticamente o numero 9 ? Tentei de varias formas e nao consegui. Na sua mascara só funciona se a pessoa digitar o numero 9.
Obrigado
LikeLike
@Abner
Com a última versão do jQuery Mask Plugin você consegue fazer desta forma:
https://gist.github.com/3724610/5003f97804ea1e62a3182e21c3b0d3ae3b657dd9
Com a VERSÃO ANTIGA é assim:
https://gist.github.com/3724610/a645335f693b1b7cf00838ab87aded5b58033beb
LikeLike
Igor, bom dia!
Teria como fazer alguma validaçao para saber se os campos foram digitados corretamente, antes de salvar?
LikeLike
O objetivo do plugin é só fazer a mascara mesmo, Isabela. Mas você pode usar o evento onComplete ou o OnKeyUp da mascara para chamar algum plugin de validação que você esteja usando e fazer as devidas validações no campo.
– Igor
LikeLike
Perfeito!! Obrigado!
LikeLike
Sensacional seu plugin Igor, parabéns.
Mas tenho uma dúvida, se eu preencher o campo com um número: 11 7150-0521
e depois voltar no campo e quiser incluir o 9o dígito a máscara não permite, eu preciso limpar o campo e inserir novamente. Existe alguma maneira de contornar isso?
Att.
LikeLike
Olá @Aclébson.
Não entendi o seu problema. O código que consta no post avalia a mascara que deve ser preenchida a cada número imputado. É importante entender como o código funcionda. Não é qualquer telefone que deve ter o digito a mais. Somente os telefones celulares que iniciam com 9 + 5[0-9]|6[0-9]|7[01234569]|8[0-9]|9[0-9] deve ter o digito à mais. Caso contrário a máscara não se aplica. O caso que você mencionou é realmente necessário pois o plugin precisa avaliar o numero de telefone inputado antes de decidir se deve ou não aplicar o dígito adicional.
– Igor
LikeLike
O único problema aqui, para que a coisa ficasse mesmo boa, é que o 9º dígito não será apenas para São Paulo, mas será implantado aos poucos para todo o Brasil. Veja que a Vivo já me mandou um SMS próximo de Araraquara, informando que a partir de agosto, meu celular terá 9 dígitos, com um 9 adicionado antes do meu número atual.
Então, expressões regulares que não formatem qualquer número de telefone iniciado por 9 com 9 dígitos, estão fadadas a ficarem desatualizadas muito rapidamente.
Obrigado.
LikeLike
Igor, parabens pela ideia do plugin.
Seguindo a duvida do colega sobre remoção da mascara, comitou essa funcionalidade?
Nao consegui remover e nem setar letras e numeros como solução de contorno
$(‘meu_textbox’).???
Obrigado pela ajuda, caso tenha como me ajudar.
LikeLike
Obrigadão ai em, deu certo aqui pra mim, estava a dias procurando uma solução dessa!!!
LikeLike
Olá Igor,
Como eu posso usar o callback de um campo como no exemplo dado no campo CEP , porém com o método .live do jquery?
Obrigado
LikeLike
A máscara funcionou bacana aqui mas não consigo deixar genérica para todo o Brasil, só consigo fazer funcionar para um DDD específico.
LikeLike
@Nil e @Heber utilize a ultima solução que consta no artigo. Recomendo ler até o final.
LikeLike
Igor, muito bom esse código, ajudou bastante a gente aqui na empresa.
Porém, alguns usuários reclamaram que não funcionou no IE <= 8.
Refiz o código e ficou assim:
var SPphoneMask = function(phone, e, currentField, options) {
return /^(\(1[1-9]\)? ?9)/g.test(phone) ? '(00) 00000-0000' : '(00) 0000-0000';
};
Desse modo, funciona tanto no Chrome, FF e IEca
LikeLike
Igor.. parabéns!.
Porém $(‘.sp_celphones’).mask(“(00) 0{4,5}-0000”); não deu certo aqui. quando digito o 2º digito após o espaço ele preenche com a string ‘{4,5}’ em vez de usar esta regra.
Tou usando a ver. 1.1.2 … chrome e ff.
LikeLike
Editei o código no tutorial, da um olhada 😉
LikeLike
Oi Igor, primeiramente parabéns por este plugin que é um grande facilitador.
Estou tendo um “problema” com a resolução para o novo digito que passou a vigorar em outros estados além de São Paulo.
Implementei o código que vc deixou “.mask(‘(00) 00009-0000’)”. Porém acredito que o 9 (‘que indica opcional’) pode não estar executando corretamente pois:
quando coloco 8 digitos: (11) 75368-022, quando coloco 9 digitos: (11) 93358-0022.
Alterei um exemplo seu para este exemplo http://jsfiddle.net/NJMSj/289/
É este mesmo o comportamento esperado ?
Abs
LikeLike
O 9 indica que se eu digitar um – no lugar dele, também será valido. ele coloca um digito nesta posição SE o usuário quiser, pois é opcional.
LikeLike
Fiz uma atualização no post e no jsfiddle:
http://jsfiddle.net/NJMSj/291/
LikeLike
valeu amiguinho
tava precisando de algo assim para validar pra mim meus form
mt melhor que o SpryAssets do dreamweaver
abraço
LikeLike
como que faz pra usar isso em situações em que é carregado por AJAX, após o carregamento do DOM utilizando o on()?
Tentei algumas coisas aqui mas nada que funcione corretamente.
LikeLike
Estou trabalhando nesta feature @Bruno, o tempo que está complicado! 😀
LikeLike
Prezado estou a procura de uma solução para o caso, notei que para o input sua solução é ótima, ela funciona quando o usuário estiver apenas percorrendo os registros? ou seja a mascara será aplicada de forma dinâmica quando o usuário percorrer os registros existentes no cadastro? ou somente na hora de digitar os dados?
LikeLike
@Robson O ideal é que no banco de dados fique sempre sem os caracteres de mascara. Você só aplica as mascaras campos de formulário e em elementos HTML como DIVs, SPANs etc. jQuery Mask Plugin aplica mascaras em elementos HTML também, não somente inputs.
LikeLike
Olá Igor boa tarde!
Meu componente é do tipo text, e sim eu não gravo formatação no banco, minha unica duvida era se quando o formulário estivesse no modo de navegação a mascara também atuaria.
LikeLike
Prezado vou tentar implementar a solução com o plugin agora, deixe-me fazer uma pergunta de leigo ( que realmente sou porque desenvolvo em web/java mais não sou expert no dialeto )
o que é callback ?
LikeLike
Sim Robson, funciona como você espera. O callback é uma função anônima que irá ser chamada quando um evento específico ocorrer.
LikeLike
Ei gostei muito do plugin, facilita para caramba a vida, mas, percebi que a máscara não é reaplicada quando o backspace é pressionado. Eu estava testando pressionando 99999999999 e ele colocou a máscara (99)99999-9999 até aí beleza, porém quando você pressiona backspace, ao invés de ele aplicar a máscara (99)9999-9999 ele fica (99)99999-999. Como posso contornar isso, estou usando o seu exemplo do fiddle, tentei usar regex para que quando ficasse daquele jeito, ele mudasse a máscara, mas, nada acontecia. Usei console.info e vi que realmente não estava disparando o evento.
LikeLike
@vinicius Atualiza a sua versão. Have fun!.
LikeLike
Boa noite Igor, como posso ajustar a máscara em um campo que pode receber tanto um cpf como um cnpj?
LikeLike
@Alexandre
Da uma olhada nesta thread:
https://github.com/igorescobar/jQuery-Mask-Plugin/issues/74
LikeLike
Igor, Foi bem simples. Estava faltando apenas o 9, na máscara do CPF. Toda a lógica já estava implementada. Obrigado pela dica. Observei que, quando utilizo a função unmask() para remover as máscaras de edição, eu perco um caractere do CNPJ. Isso só acontece com o CNPJ. No mais seu projeto é excelente. Parabéns!
LikeLike
@Alexandre, atualiza para versão 1.5.0, este problema foi corrigido, abs.
LikeLike