Ao fazer desenvolvimento web, costumamos usar o evento de fechamento de página onbeforeunload, que pode dar aos usuários a oportunidade de desistir do fechamento, como este editor de blog. Se o usuário optar por sair, o evento onunload será acionado naturalmente, mas se o usuário optar por cancelar, como detectá-lo?
Assumimos que uma página deixa um evento de cancelamento chamado onunloadcancel. Obviamente, este evento deve ser acionado depois que o usuário pressionar o botão Cancelar da caixa de diálogo. Mas o processo de acionamento para fechar a caixa de diálogo de prompt não é tão simples. Vamos primeiro revisar o processo:
Copie o código do código da seguinte forma:
janela.onbeforeunload=função()
{
return "Vai mesmo?";
}
Quando o usuário está pronto para sair da página (como pressionar o botão Fechar ou atualizar a página, etc.), o evento onbeforeunload é acionado. Nosso script não pode decidir se deseja impedir o fechamento da página neste evento. A única coisa que ele pode fazer é retornar uma string. Essa string aparece apenas como texto explicativo na caixa de diálogo de seleção de fechamento. . Mas qual escolher, não temos como saber.
No entanto, se analisarmos esta questão com cuidado, na verdade não é esse o caso. Se o usuário realmente decidir fechar a página, todo o código em execução desaparecerá e se o usuário continuar na página, será tratado como se nada tivesse acontecido, exceto o evento onbeforeunload; Portanto, fazemos um pequeno truque no evento onbeforeunload e registramos aqui um cronômetro que iniciará após alguns milissegundos. Se a página estiver realmente fechada, é claro que o cronômetro será inválido, então a página ainda estará lá e o atraso; de alguns milissegundos não haverá erro neste evento de interação de interface inerentemente assíncrona.
Copie o código do código da seguinte forma:
<linguagem script="JavaScript">
janela.onbeforeunload=função()
{
setTimeout(onunloadcancel, 10);
return "Vai mesmo?";
}
janela.onunloadcancel=função()
{
alert("cancelar saída");
}
</script>
Usamos setTimeout e atrasamos 10ms para executar onunloadcancel. Se a página estiver realmente fechada, os cronômetros serão destruídos, caso contrário, continue; Mas durante os testes, descobriu-se que o FireFox tinha dois bugs:
Às vezes, quando o botão Fechar é pressionado, onunloadcancel também será executado e uma caixa de diálogo piscará. Se você mudar para while(1); o navegador permanecerá travado, o que significa que onunloadcancel é realmente executado, mas apenas destrói a interface, mas não pausa a execução do script.
Se você sair atualizando a página, o onbeforeunload será executado apenas uma vez, mas se você clicar no botão X para fechar a página, o onbeforeunload será executado duas vezes. Portanto, ainda precisamos melhorá-lo para ser compatível com o FF.
Copie o código do código da seguinte forma:
<linguagem script="JavaScript">
var_t;
janela.onbeforeunload=função()
{
setTimeout(function(){_t = setTimeout(onunloadcancel, 0)}, 0);
return "Vai mesmo?";
}
janela.onunloadcancel=função()
{
clearTimeout(_t);
alert("cancelar saída");
}
</script>
Um método é usado aqui e não consigo explicar o motivo. Deve ser considerado um hack para resolver o bug no FF.