O beforeunload
evento é acionado sempre que o usuário sai da sua página por qualquer motivo.
Por exemplo, ele será acionado se o usuário enviar um formulário, clicar em um link, fechar a janela (ou guia) ou for para uma nova página usando a barra de endereços, a caixa de pesquisa ou um marcador.
Você pode excluir envios de formulários e hiperlinks (exceto de outros quadros) com o seguinte código:
var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });
$(window).on("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
Para versões do jQuery anteriores a 1.7, tente o seguinte:
var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });
$(window).bind("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
O live
método não funciona com o submit
evento, portanto, se você adicionar um novo formulário, precisará vincular o manipulador a ele também.
Observe que se um manipulador de eventos diferente cancelar o envio ou a navegação, você perderá o prompt de confirmação se a janela for fechada mais tarde. Você pode corrigir isso através da gravação do tempo nos submit
e click
eventos, e verificar se o beforeunload
acontece mais do que um par de segundos mais tarde.
Ctrl + r
,F5
,Ctrl + Shift + r
e alterando a URL do navegador?.on()
.Talvez apenas desvincule o
beforeunload
manipulador de eventos no manipulador de eventos do formuláriosubmit
:fonte
onsubmit=...
em cada formulário. (I ter muitas formas por página, em uma determinada aplicação web)Para uma solução entre navegadores (testada no Chrome 21, IE9, FF15), considere usar o código a seguir, que é uma versão ligeiramente aprimorada do código de Slaks:
Observe que, desde o Firefox 4, a mensagem "Deseja realmente fechar?" não é exibido. FF apenas exibe uma mensagem genérica. Veja a nota em https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload
fonte
live
asbind
instruções e paraon
, o que funciona muito bem com o nível mais recente do jQuery. Obrigado!fonte
Para uma solução que funcionou bem com controles de terceiros, como Telerik (por exemplo: RadComboBox) e DevExpress que usam as tags Anchor por vários motivos, considere usar o código a seguir, que é uma versão ligeiramente aprimorada do código da desm com um seletor melhor para si próprio segmentação por tags âncora:
fonte
Minha resposta tem como objetivo fornecer referências simples.
COMO
Veja a resposta @SLaks .
Quanto tempo o navegador leva para finalmente desligar sua página?
Sempre que um usuário fecha a página ( xbotão ou CTRL+ W), o navegador executa o
beforeunload
código fornecido , mas não por tempo indeterminado. A única exceção é a caixa de confirmação (return 'Do you really want to close?
) que aguardará a resposta do usuário.Chrome : 2 segundos.
Firefox : ∞ (ou clique duas vezes ou force para fechar)
Borda : ∞ (ou clique duas vezes)
Explorer 11 : 0 segundos.
Safari : TODO
O que usamos para testar isso:
O que ele faz é enviar o maior número possível de solicitações antes que o navegador encerre sua página (de forma síncrona).
Saída do Chrome:
fonte
Eu usei a resposta do Slaks, mas isso não estava funcionando como está, pois o onBeforeunload returnValue é analisado como uma sequência e exibido na caixa de confirmações do navegador. Portanto, o valor true foi exibido, como "true".
Apenas usando o retorno funcionou. Aqui está o meu código
fonte
Talvez você possa manipular o OnSubmit e definir um sinalizador que depois verifique no seu manipulador OnBeforeUnload.
fonte
fonte
Infelizmente, seja um recarregamento, um redirecionamento de nova página ou o fechamento do navegador, o evento será acionado. Uma alternativa é capturar o ID que aciona o evento e, se for o formulário, não aciona nenhuma função e, se não for o ID do formulário, faça o que você deseja fazer quando a página for fechada. Não tenho certeza se isso também é possível diretamente e é tedioso.
Você pode fazer algumas pequenas coisas antes que o cliente feche a guia. O javascript detecta a guia fechar o navegador / fechar o navegador, mas se a sua lista de ações for grande e a guia fechar antes de terminar, você estará desamparado. Você pode experimentá-lo, mas com a minha experiência, não depende disso.
https://developer.mozilla.org/en-US/docs/Web/Reference/Events/beforeunload?redirectlocale=en-US&redirectslug=DOM/Mozilla_event_reference/beforeunload
fonte
Se o envio do formulário os levar para outra página (como suponho que seja, daí o acionamento de
beforeunload
), você poderá tentar alterar o envio do formulário para uma chamada ajax. Dessa forma, eles não sairão da página quando enviarem o formulário e você poderá usar obeforeunload
código de ligação conforme desejar.fonte
Meu problema: o evento 'onbeforeunload' seria acionado apenas se houvesse um número ímpar de envios (cliques). Eu tive uma combinação de soluções de threads semelhantes no SO para que minha solução funcionasse. bem, meu código falará.
fonte
A partir do jQuery 1.7, o método .live () está obsoleto. Use .on () para anexar manipuladores de eventos. Usuários de versões mais antigas do jQuery devem usar .delegate () em vez de .live ()
no link completo ou
fonte
Tente isso também
fonte
Basta verificar ...
fonte
fonte
Seguir trabalhou para mim;
fonte
event.clientY
é negativo se você clicar no botão Fechar do navegador ou no botão Fechar da guia. No entanto, esse valor é positivo quando você recarrega a página usando atalhos de teclado (F5, Ctrl-R) ou fecha o navegador usando atalhos de teclado (por exemplo, Alt-F4). Portanto, você não pode confiar na posição do evento para diferenciar o evento de fechamento do navegador do evento de recarregamento da página.