InputMask de Primefaces para CPF e CNPJ que muda dinamicamente conforme a quantidade de caracteres

Senhores, boa tarde!

Antes de mais nada, desculpem pela falta de tags apropriadas a este tópico: não me foram sugeridas as que sempre uso para estes casos (Primefaces e JSF). Algumas coisas mudaram desde a última vez que postei alguma dúvida.

Estou tentando de todo jeito fazer algo que um cliente me pediu e não estou conseguindo, mas é algo com cara de problema que alguém já resolveu: preciso fazer um inputMask com uma máscara dinâmica que, se a String estiver vazia ou for até do tamanho de um CPF, a máscara é de CPF. Se passar do 12o caracter, então a máscara precisa mudar para a de CNPJ. Não posso usar um Radio Button ou algo do gênero para trocar a renderização de input: o mecanismo precisa ser de acordo com quantidade

O que eu tentei primeiro foi isso aqui:

<p:inputMask value="#{meuMB.entidade.cpfCnpj}" mask="#{meuMB.mascara}"> <p:ajax listener="#{meuMB.updateMascara}" event="keypress" update="@this" />

O método que atualiza a máscara não tem nada de mais:
public void doUpdateInputCpfCnpj(AjaxBehaviorEvent event) { if (filtroVO == null || filtroVO.getCpfCnpj().length() < 12) { this.cpfCnpjMascara = "9?99.999.999-999"; } else { this.cpfCnpjMascara = "9?9.999.999/9999-99"; } }

Bem, isto não funciona porque o keypress faz o input ser atualizado a cada tecla que eu digito, ou seja: eu digito o primeiro caractere e ele apaga o que foi digitado.

Alguém tem alguma boa solução para isso?

Preciso exatamente disso… Alguma solução?

Nada? preciso disso tb…

Pessoal, esse tópico é muito antigo e eu solucionei a questão na época de um jeito que não era bem o que eu queria mas serviu. Basicamente eu defini como padrão uma máscara de CPF com três dígitos a mais sem serem obrigatórios (9?99.999.999-99999). Adicionei um listener com evento change para o campo com um método e verifica se foram digitados todos os dígitos da máscara, caso tenham sido ele altera a String com a máscara do campo para 9?9.999.999/9999-99.

Não fica do jeito que eu queria (acho que teria que ser feito com javascript mesmo… ou então fazer com keypress, mas acho loucura torrar chamada ao servidor para isso)… de qualquer forma, na época eu fiz isso e ninguém por aqui reclamou. rs

Desculpe ressuscitar o Tópico, mas vc poderia ter usado JS

<p:inputText value="#{meuMB.entidade.cpfCnpj}" mask="#{meuMB.mascara}" onkeypress="mascara(this, cpfCnpj);" />

e dentro de um arquivo .js
ex.: mascara.js

//<![CDATA[

function mascara(o, f) {
	v_obj = o;
	v_fun = f;
	setTimeout("execmascara()", 1);
}
function execmascara() {
	v_obj.value = v_fun(v_obj.value);
}
function valor(v) {
	v = v.replace(/\D/g, "");
	v = v.replace(/[0-9]{15}/, "Inválido");
	v = v.replace(/(\d{1})(\d{11})$/, "$1.$2"); // coloca ponto antes dos
	// últimos 11 digitos
	v = v.replace(/(\d{1})(\d{8})$/, "$1.$2"); // coloca ponto antes dos
	// últimos 8 digitos
	v = v.replace(/(\d{1})(\d{5})$/, "$1.$2"); // coloca ponto antes dos
	// últimos 5 digitos
	v = v.replace(/(\d{1})(\d{1,2})$/, "$1,$2"); // coloca virgula antes dos
	// últimos 2 digitos
	return v;
}

function cpfCnpj(v) {

	    // Remove tudo o que não é dígito
    	v = v.replace(/\D/g, "");
    	v = v.replace(/[0-9]{15}/, "Inválido");
	if (v.length == 11) { // CPF

		// Coloca um ponto entre o terceiro e o quarto dígitos
		v = v.replace(/(\d{3})(\d)/, "$1.$2");

		// Coloca um ponto entre o terceiro e o quarto dígitos
		// de novo (para o segundo bloco de números)
		v = v.replace(/(\d{3})(\d)/, "$1.$2");

		// Coloca um hífen entre o terceiro e o quarto dígitos
		v = v.replace(/(\d{3})(\d{1,2})$/, "$1-$2");

	} else { // CNPJ

		// Coloca ponto entre o segundo e o terceiro dígitos
		v = v.replace(/^(\d{2})(\d)/, "$1.$2");

		// Coloca ponto entre o quinto e o sexto dígitos
		v = v.replace(/^(\d{2})\.(\d{3})(\d)/, "$1.$2.$3");

		// Coloca uma barra entre o oitavo e o nono dígitos
		v = v.replace(/\.(\d{3})(\d)/, ".$1/$2");

		// Coloca um hífen depois do bloco de quatro dígitos
		v = v.replace(/(\d{4})(\d)/, "$1-$2");

	}
	return v
}
// ]]>