• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

hbarquero

Evento onUnload

1 mensagem neste tópico

Bom dia pessoal,

Este é mais um tópico de esclarecimento do que de dúvida :), visto que apos montes de testes e pesquisas até tenho uma solução, mas não a ideal ;), mas se alguem tiver ideias sejam bem vindas

Imaginando que tem um formulario (grande, para terem uma idea, engloba 4 secçoes/janelas/tabs, e várias tabelas) o que eu pretendo é que apareça uma mensagem a avisar o utilizador que vai sair da página (quando ele clica numa outra pagina) de que o formulario foi alterado e ainda não guardou os dados, aqui é que esta o problema, o que eu quero é que apareça uma janela com as 2 opçoes:

1ª - Sair da página sem guardar

2ª - Ficar na página

Eu resolvi a questão com o window.onbeforeunload, a questão é que este evento não funciona no Opera.

Funciona no Internet Explorer, Firefox,  Chrome e Safari, onde aparece uma mensagem do proprio sistema, e onde podemos colocar tambem um texto personalizado.

Aqui esta a função:


var check_changes="";

/* detecta se há alterações */
$(document).ready(function(){
/* check if form has changes */
$("#my_form input, select, textarea, radio").bind("change", function(e){
	check_changes="1";
});
)};

/* variaveis de browsers */
var b='';
   $.each($.browser, function(i, val) {
if (i=='safari' && val==true){b='safari';}
   	if (i=='opera' && val==true){b='opera';}
   	if (i=='msie' && val==true){b='msie';}
   	if (i=='mozilla' && val==true){b='mozilla';}
});	

/* verifica o sair */
if ( b=='opera') {
$(window).unload(function() {
	if (check_changes!="") {
                                  /*aqui mostra a mensagem e sai */
		alert("Houve alterações no formulário e os dados vão ser perdidos!");
	}
});

} else {
window.onbeforeunload = function() {
	if (check_changes!="") {
                                  /* Aqui mostra a pergunta sim/não com esta mensagem*/
                              	return 'Houve alterações no formulário.';
	}
}
}

Para o Opera apenas consigo saber que a pessoa vai sair, mas não lhe consigo cancelar o evento.

Já agora, no meio disto tudo sei que há uma forma de dar a volta e que funciona para todos, que é no evento que o Opera detecta, com Jquery (por exemplo)

$(window).unload(function() {

//verificações

}

Aqui eu posso controlar uma situação, que é, atraves de uma variavel que muda caso o formulario seja alterado em algum campo, quando a pessoa vair sair, colocar uma mensagem a fazer a tal pergunta, "pretende sair sem guardar" sim/não, e no evento não, que seria ficar na propria pagina, forçar um Post ao formulario, acrescentando antes uma variavel para não guardar os dados nas tabelas, e carregando os dados do formulario de novo com os dados que estavam no momento do click, desta forma ficaria na mesma página. A questão é que em formularios grandes como o que estou a fazer é uma carga de trabalhos fazer mais essa verificação.

Se alguem tiver alguma sugestão de como contornar o Opera nesta situação que avise.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora