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

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

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+

[quote=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+[/quote]

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?

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)”

[quote=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)”[/quote]

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

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

[quote=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
[/quote]

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