Aqui no stackoverflow, se você começou a fazer alterações e tenta sair da página, um botão de confirmação de javascript é exibido e pergunta: "Tem certeza de que deseja sair desta página?" blee blá bloo ...
Alguém já implementou isso antes, como faço para rastrear que as alterações foram confirmadas? Acredito que eu poderia fazer isso sozinho, estou tentando aprender as boas práticas de vocês, especialistas.
Eu tentei o seguinte, mas ainda não funciona:
<html>
<body>
<p>Close the page to trigger the onunload event.</p>
<script type="text/javascript">
var changes = false;
window.onbeforeunload = function() {
if (changes)
{
var message = "Are you sure you want to navigate away from this page?\n\nYou have started writing or editing a post.\n\nPress OK to continue or Cancel to stay on the current page.";
if (confirm(message)) return true;
else return false;
}
}
</script>
<input type='text' onchange='changes=true;'> </input>
</body>
</html>
Alguém pode postar um exemplo?
javascript
html
message
onbeforeunload
confirm
Shimmy Weitzhandler
fonte
fonte
Respostas:
Atualização (2017)
Agora, os navegadores modernos consideram a exibição de uma mensagem personalizada um risco à segurança e, portanto, foi removida de todos eles. Os navegadores agora exibem apenas mensagens genéricas. Como não precisamos mais nos preocupar em definir a mensagem, é tão simples quanto:
Leia abaixo para obter suporte ao navegador herdado.
Atualização (2013)
A resposta original é adequada para IE6-8 e FX1-3.5 (que é o nosso objetivo em 2009 quando foi escrita), mas está desatualizada agora e não funcionará nos navegadores mais atuais - deixei abaixo para referência.
O
window.onbeforeunload
não é tratado de forma consistente por todos os navegadores. Deve ser uma referência de função e não uma string (como a resposta original afirmou), mas funcionará em navegadores mais antigos, porque a verificação para a maioria deles parece ser se alguma coisa está atribuídaonbeforeunload
(incluindo uma função que retornanull
).Você define
window.onbeforeunload
uma referência de função, mas em navegadores antigos, você deve definirreturnValue
o evento em vez de retornar uma string:Você não pode
confirmOnPageExit
fazer isso , verifique e retorne nulo se desejar que o usuário continue sem a mensagem. Você ainda precisa remover o evento para ativá-lo e desativá-lo com segurança:Resposta original (trabalhada em 2009)
Para ligar:
Para desativá-lo:
Lembre-se de que este não é um evento normal - você não pode se vincular a ele da maneira padrão.
Para verificar valores? Isso depende da sua estrutura de validação.
No jQuery, isso pode ser algo como (exemplo muito básico):
fonte
$("#submit_button").click(function() { window.onbeforeunload = null; });
. Originalmente, usei o evento onclick do botão, mas, além de não ser tão bom, também não funcionou com o IE8.window.onbeforeunload
evento.O
onbeforeunload
Microsoft-ism é a coisa mais próxima que temos de uma solução padrão, mas esteja ciente de que o suporte ao navegador é desigual; por exemplo, para o Opera, ele funciona apenas na versão 12 e posterior (ainda em beta no momento em que este artigo foi escrito).Além disso, para obter compatibilidade máxima , você precisa fazer mais do que simplesmente retornar uma string, conforme explicado na Mozilla Developer Network .
Exemplo: Defina as duas funções a seguir para ativar / desativar o prompt de navegação (veja o exemplo MDN):
Em seguida, defina um formulário como este:
Dessa forma, o usuário só será avisado sobre a navegação se tiver alterado a área de texto e não será avisado quando estiver enviando o formulário.
fonte
Para fazer isso funcionar no Chrome e Safari, você teria que fazer assim
Referência: https://developer.mozilla.org/en/DOM/window.onbeforeunload
fonte
Com o JQuery, essas coisas são muito fáceis de fazer. Desde que você pode ligar a conjuntos.
NÃO é suficiente para executar o onbeforeunload, você deseja acionar a navegação apenas se alguém começar a editar as coisas.
fonte
jquerys 'beforeunload' funcionou muito bem para mim
fonte
para novas pessoas que procuram uma solução simples, tente o Areyousure.js
fonte
Essa é uma maneira fácil de apresentar a mensagem se houver dados inseridos no formulário e não mostrar a mensagem se o formulário for enviado:
fonte
Para expandir a resposta já surpreendente de Keith :
Mensagens de aviso personalizadas
Para permitir mensagens de aviso personalizadas, você pode agrupá-lo em uma função como esta:
Em seguida, basta chamar essa função com sua mensagem personalizada:
Ativando a navegação novamente
Para reativar a navegação, tudo que você precisa fazer é definir
window.onbeforeunload
comonull
. Aqui está, envolto em uma pequena função elegante que pode ser chamada em qualquer lugar:Usando jQuery para vincular isso para formar elementos
Se estiver usando jQuery, isso pode ser facilmente vinculado a todos os elementos de um formulário como este:
Em seguida, para permitir o envio do formulário:
Formulários modificados dinamicamente:
preventNavigation()
eenableNavigation()
pode ser vinculado a quaisquer outras funções, conforme necessário, como modificar dinamicamente um formulário ou clicar em um botão que envia uma solicitação AJAX. Eu fiz isso adicionando um elemento de entrada oculto ao formulário:Então, sempre que eu quiser impedir que o usuário navegue para longe, aciono a alteração nessa entrada para garantir que ela
preventNavigation()
seja executada:fonte
Aqui tente isso, funciona 100%
fonte
O padrão afirma que a solicitação pode ser controlada cancelando o evento beforeunload ou configurando o valor de retorno para um valor não nulo . Ele também afirma que os autores devem usar Event.preventDefault () em vez de returnValue, e a mensagem mostrada ao usuário não é personalizável .
A partir de 69.0.3497.92, o Chrome não atendia ao padrão. No entanto, há um relatório de bug arquivado e uma revisão está em andamento. O Chrome exige que returnValue seja definido por referência ao objeto de evento, não ao valor retornado pelo manipulador.
É de responsabilidade do autor acompanhar se foram feitas alterações; isso pode ser feito com uma variável ou garantindo que o evento seja tratado apenas quando necessário.
fonte
Quando o usuário começa a fazer alterações no formulário, um sinalizador booleano será definido. Se o usuário tentar navegar para fora da página, verifique esse sinalizador no evento window.onunload . Se o sinalizador estiver definido, você mostra a mensagem retornando-a como uma sequência. Retornar a mensagem como uma string exibirá uma caixa de diálogo de confirmação contendo sua mensagem.
Se você estiver usando o ajax para confirmar as alterações, poderá definir o sinalizador para
false
depois que as alterações forem confirmadas (ou seja, no evento de sucesso do ajax).fonte
Você pode adicionar um
onchange
evento na área de texto (ou em qualquer outro campo) que defina uma variável em JS. Quando o usuário tenta fechar a página (window.onunload), você verifica o valor dessa variável e mostra o alerta de acordo.fonte
alert
econfirm
está bloqueado durantewindow.onbeforeunload
ewindow.onunload
(pelo menos na versão do Chrome no meu PC, mas provavelmente também em todos os navegadores que suportam esses manipuladores).Com base em todas as respostas neste tópico, escrevi o seguinte código e funcionou para mim.
Se você tiver apenas algumas tags de entrada / área de texto que exijam a verificação de um evento onunload, poderá atribuir atributos de dados HTML5 como
data-onunload="true"
por exemplo.
e o Javascript (jQuery) pode ficar assim:
fonte
aqui está o meu html
E foi assim que fiz algo semelhante em javaScript
fonte
Isso pode ser feito facilmente, definindo um ChangeFlag como true, no evento onChange de TextArea . Use javascript para mostrar a caixa de diálogo de confirmação com base no valor ChangeFlag . Descarte o formulário e navegue para a página solicitada se a confirmação retornar verdadeira, caso contrário, não faça nada .
fonte
O que você deseja usar é o evento onunload em JavaScript.
Aqui está um exemplo: http://www.w3schools.com/jsref/event_onunload.asp
fonte
Existe um parâmetro "onunload" para a tag body, que você pode chamar de funções javascript a partir daí. Se retornar falso, impede a navegação.
fonte
<body onunload="return false;">
.