Como evitar que o usuário saia da tela sem confirmar alterações?
8 respostas
bonfarj
Estou desenvolvendo um sistema (Struts + Hibernate) onde as modificações de uma entidade só fazem sentido quando feitas em conjunto. Todas as mudanças na entidade são armazenadas na sessão (HttpSession), sendo persistidas apenas quando o usuário clica no botão “Salvar”. O problema é que muitas vezes o usuário esquece disso e acaba saindo da tela sem apertar o botão e com isso as alterações são perdidas.
Já reparei que alguns sites cuidam disso, detectando quando o usuário tenta entrar em alguma outra tela, digita algum endereço no browser ou tenta fechá-lo. Alguém sabe como isso é feito?
Coloque uma função no body no evento onUnload, quando o usuário tentar fechar você valida do jeito que quiser:
<bodyonUnload="fechar();">functionfechar(){..}
M
marcelux
Cara, pelo que eu entendi isso é um evento que tratamos em javascript
e por ai vai!
[]
maquiavelbona
Vale lembrar que isso nem sempre funciona, depende do browser e do nível de segurança do mesmo.
Parte dos sites maliciosos usam esse artifício, que alguns browsers já retiram por padrão.
Até!
danieldestro
Já que guarda os dados na sessão e vc não deseja problemas com Javascript, crie um Servlet Filter, que verifica se existe uma edição de dados em andamento (via uma flag na sessão), e que ele mesmo valida se você foi pra outra página sem salvar o conteúdo, redirecionando para uma tela com os dados e a confirmação das alterações.
É uma idéia.
C
carneiro
Acho que o mais fácil é escrever no cantinho da página q as alteracoes só serao persistidas caso ele clique em salvar
danieldestro
Mais fácil para o desenvolvedor ou para o usuário?
Mas quem paga o salário do desenv? heheheehhe
bonfarj
Eu não conhecia esse evento “onunload”, muito interessante! Mas ele não resolve o problema, pois ele permite que o usuário mude de tela, o evento é disparado após a mudança.
O que eu gostaria de fazer é parecido com o que o Gmail faz. Quando um usuário começa a escrever um e-mail e clica em algum outro link, o sistema avisa que sua mensagem ainda não foi e se você deseja descartá-la. Como ele faz isso?
valeu pessoal, obrigado pela atenção!!
bonfarj
Resolvido, pessoal! Alguns browsers possuem o evento onbeforeunload, que possibilita “cortar” o fluxo, mantendo o usuário na página atual! Meu amigo falou que o Firefox suporta desde a 0.9 e o IE tb há tempos. Como são os browsers que dominam o mercado, vou dar como suficiente.
PS: o jeito que o Google faz me pareceu sutiltmente diferente, se alguém souber algo a respeito não deixe de nos contar!