[RESOLVIDO] JSF 2 + Primefaces - Foco após update

6 respostas
R

Boa tarde pessoal…

Preciso setar o foco no componente da tela que o foco estava antes de um update, por exemplo:

Supondo que eu tenho um cadastro com 10 campos… Lá no campo 5, no evento “blur” ele precisa executar alguma chamada no Bean e um update @form depois disso… Quando isso acontece, o foco se perde. Gostaria de tratar isso de alguma maneira.

Como vocês lidam com isto?

Abraços

6 Respostas

A

Provavelmente,

seu componente tenha o metodo onComplete, entao vc pode fazer uma funcao javascript que depois de fazer o update, ele execute essa funcao de foco.

T+

R

alissonvla:
Provavelmente,

seu componente tenha o metodo onComplete, entao vc pode fazer uma funcao javascript que depois de fazer o update, ele execute essa funcao de foco.

T+

Obrigado por responder!

E como eu poderia gravar o componente que tinha o foco anteriormente? Eu gostaria de algo que toda vez que o foco mudasse de componente, ou então toda vez que ocorresse um submit, uma função JS provavelmente gravasse qual o ultimo componente com foco. Depois, como vc sugeriu, alguma função que pegasse esse ID e setasse o foco (essa função eu já tenho)

Alguma idéia?

A

vc ai fazer um funcao generica passando o id do seu componente, tipo isso

function setfocus(id){
document.getElementById(id).focus()
}

e no seus componentes algo assim
p:inputtext oncomplete="setfocus(idComponente1)"
p:inputtext oncomplete="setfocus(idComponente2)"
p:inputtext oncomplete=“setfocus(idComponente3)”

R

alissonvla:
vc ai fazer um funcao generica passando o id do seu componente, tipo isso

function setfocus(id){
document.getElementById(id).focus()
}

e no seus componentes algo assim
p:inputtext oncomplete="setfocus(idComponente1)"
p:inputtext oncomplete="setfocus(idComponente2)"
p:inputtext oncomplete=“setfocus(idComponente3)”

e como vou saber o id do componente? não sei onde ele clicou…

A

vc quer q execute uma regra no onblur e o foco volte para o mesmo componente, correto? se sim, entao vc sabe qual componente chamou o onblur

R

alissonvla:
vc quer q execute uma regra no onblur e o foco volte para o mesmo componente, correto? se sim, entao vc sabe qual componente chamou o onblur

Obrigado pela atenção Alisson, consegui resolver de outra maneira.

Eu queria algo mais automático, e consegui fazendo uns testes aki… acho que ficou excelente…

O método que criei funciona assim.

Adiciono um EventListener ao document:

document.addEventListener("focus", getFocusedId, true);

Então criei este método “getFocusedId”, que grava numa variável do navegador o id do componente que recebeu o foco:

function getFocusedId() {

				var obj = document.activeElement;

				if (obj.id != '') {
					localStorage.setItem('compFoco', obj.id);
				}
				
  }

Ou seja, toda vez que algum componente receber o foco, uma variável é setada com seu ID.

Em seguida, fiz uma função simples que envia pelo ID que esta na variável:

function setFocus() {
				try {
					document.getElementById(localStorage.getItem('compFoco')).focus();					
				  } catch(err) {
				  
				  }									
}

E para disparar isto, utilizei um phaseListener do JSF 2… e RequestContext do Primefaces:

@Override
public void afterPhase(PhaseEvent arg0) {

	RequestContext.getCurrentInstance().execute("setFocus()");

}

Ou seja… um EventListener no document que grava em “tempo real” numa variavel os componentes que recebem o foco… e outro método que manda o foco, disparado por um phaseListener…

Ou seja, nunca mais preciso me preocupar com foco na vida… rááá!!!

Vlw aeee… espero que isso ajude alguém…

Abraços

Criado 19 de julho de 2013
Ultima resposta 19 de jul. de 2013
Respostas 6
Participantes 2