Existe algum código JavaScript / jQuery entre navegadores para detectar se o navegador ou uma guia do navegador está sendo fechada, mas não devido ao clique no link?
javascript
jquery
cometta
fonte
fonte
sessionStorage
Property, expirará assim que o navegador fechar. w3schools.com/jsref/prop_win_sessionstorage.aspRespostas:
Se eu entendi corretamente, você quer saber quando uma guia / janela é efetivamente fechada. Bem, o AFAIK é a única maneira
Javascript
de detectar esse tipo de coisasonunload
eonbeforeunload
eventos.Infelizmente (ou felizmente?), Esses eventos também são disparados quando você sai de um site por um
link
botão ou no navegador de seu navegador. Portanto, esta é a melhor resposta que posso dar, acho que você não consegue detectar nativamente um puroclose
em Javascript. Corrija-me se eu estiver errado aqui.fonte
String
valor de retorno personalizadoonbeforeunload
. Portanto, agora você não poderá mais exibir uma mensagem personalizada antes de descarregar.unload
?Da documentação do Firefox
Por alguns motivos, os navegadores baseados no Webkit não seguem as especificações da caixa de diálogo. Um exemplo quase transversal poderia estar próximo do exemplo abaixo.
Este exemplo para lidar com todos os navegadores.
fonte
Solução Simples
fonte
// Isso está funcionando no IE7, se você estiver fechando a guia ou o navegador com apenas uma guia
fonte
window.onunload = "alert('wait')"
ewindow.onbeforeunload = "alert('wait... chrome!')"
usei o console no Chromium / Ubuntu, mas nenhum dos dois disparou quando fechei a guia.window.onunload = "alert('wait')"
e coisas assim não deveriam funcionar realmente. "A função deve atribuir um valor de string à propriedade returnValue do objeto Event e retornar a mesma string". Por favor, dê uma olhada no artigo MDNEu precisava desconectar o usuário automaticamente quando o navegador ou a guia fecha, mas não quando o usuário navega para outros links. Eu também não queria que um prompt de confirmação fosse mostrado quando isso acontecesse. Depois de lutar por algum tempo, especialmente com o IE e o Edge, eis o que eu acabei de fazer (verificado trabalhando com o IE 11, Edge, Chrome e Firefox) depois de basear a abordagem nesta resposta .
Primeiro, inicie um cronômetro de contagem regressiva no servidor no
beforeunload
manipulador de eventos em JS. As chamadas ajax precisam ser síncronas para que o IE e o Edge funcionem corretamente. Você também precisa usarreturn;
para impedir que a caixa de diálogo de confirmação seja exibida assim:Iniciar o timer define o
cancelLogout
sinalizador como false . Se o usuário atualizar a página ou navegar para outro link interno, ocancelLogout
sinalizador no servidor será definido como verdadeiro . Depois que o evento do timer termina, ele verifica ocancelLogout
sinalizador para ver se o evento de logout foi cancelado. Se o cronômetro tiver sido cancelado, o cronômetro será interrompido. Se o navegador ou guia estivesse fechado, ocancelLogout
sinalizador permaneceria falso e o manipulador de eventos desconectaria o usuário.Nota de implementação: estou usando o ASP.NET MVC 5 e estou cancelando o logout em um
Controller.OnActionExecuted()
método substituído .fonte
OnActionExecuted
?Desculpe, não foi possível adicionar um comentário a uma das respostas existentes, mas caso você desejasse implementar um tipo de caixa de diálogo de aviso, só queria mencionar que qualquer função do manipulador de eventos possui um argumento - evento. No seu caso, você pode chamar event.preventDefault () para impedir a saída automática da página e emitir seu próprio diálogo. Considero isso uma opção muito melhor do que usar o alerta padrão feio e inseguro (). Pessoalmente, implementei meu próprio conjunto de caixas de diálogo com base no objeto kendoWindow (a interface do usuário Kendo da Telerik, que é quase totalmente de código aberto, exceto o kendoGrid e o kendoEditor). Você também pode usar caixas de diálogo na interface do usuário do jQuery. Observe, porém, que essas coisas são assíncronas e você precisará vincular um manipulador ao evento onclick de cada botão, mas tudo isso é muito fácil de implementar.
No entanto, concordo que a falta do evento real de fechamento é terrível: se você, por exemplo, deseja redefinir o estado da sessão no back-end apenas no caso do fechamento real, é um problema.
fonte
Para tarefas semelhantes, você pode usar
sessionStorage
para armazenar dados localmente até que a guia do navegador seja fechada.O
sessionStorage
objeto armazena dados para apenas uma sessão (os dados são excluídos quando a guia do navegador é fechada). ( W3Schools )Esta é a minha caneta .
fonte
Não há evento, mas há uma propriedade
window.closed
que é suportada em todos os principais navegadores até o momento da redação deste documento. Portanto, se você realmente precisava saber, poderia pesquisar na janela para verificar essa propriedade.if(myWindow.closed){do things}
Nota: pesquisar qualquer coisa geralmente não é a melhor solução. O
window.onbeforeunload
evento deve ser usado, se possível, a única ressalva é que ele também é acionado se você sair.fonte
fonte
beforeunload
se deseja exibir um alerta. Assim:$(window).on('beforeunload', function(){ alert ('Bye now')});
Tente usá-lo:
fonte
Eu encontrei uma maneira, que funciona em todos os meus navegadores .
Testado nas seguintes versões: Firefox 57, Internet Explorer 11, Edge 41, um dos mais recentes do Chrome (não mostrará minha versão)
fonte
Como ninguém o mencionou ainda (mais de 8 anos depois): um WebSocket pode ser outra maneira eficaz de detectar uma guia fechada. Enquanto a guia estiver aberta e apontada para o host, o cliente poderá manter uma conexão WebSocket ativa com o host.
Advertência: Observe que esta solução é realmente viável apenas para um projeto se um WebSocket não exigir nenhuma sobrecarga adicional significativa do que você já está fazendo.
Dentro de um período de tempo limite razoável (por exemplo, 2 minutos), o lado do servidor pode determinar que o cliente foi embora depois que o WebSocket foi desconectado e executar qualquer ação desejada, como remover arquivos temporários carregados. (No meu caso de uso extremamente especializado, meu objetivo era encerrar um servidor de aplicativos host local três segundos após a conexão com o WebSocket cair e toda a atividade CGI / FastCGI terminar - quaisquer outras conexões keep-alive não me afetam.)
Eu tive problemas para fazer com que o manipulador de eventos onunload funcionasse corretamente com beacons (conforme recomendado por esta resposta ). O fechamento da guia não pareceu acionar o farol e as abas abertas o acionaram de maneiras que poderiam causar problemas. Um WebSocket resolveu o problema que eu estava enfrentando de forma mais limpa, porque a conexão fecha aproximadamente na mesma hora em que a guia é fechada e a troca de páginas no aplicativo simplesmente abre uma nova conexão WebSocket dentro da janela de atraso.
fonte
JSFiddle Link
Olá pessoal, consegui cliques em 'Detectar navegador e fechar evento da guia' usando o armazenamento local e o carimbo de data / hora do navegador. Espero que todos vocês resolvam seus problemas usando esta solução.
Após minha pesquisa inicial, descobri que, quando fechamos um navegador, o navegador fecha todas as guias uma por uma para fechar completamente o navegador. Portanto, observei que haverá muito pouco tempo de atraso entre o fechamento das guias. Portanto, tomei esse atraso como meu principal ponto de validação e consegui alcançar a detecção de eventos de fechamento do navegador e da guia.
Eu testei no navegador Chrome versão 76.0.3809.132 e achei funcionando
:) Vote se achou a minha resposta útil ....
fonte
fonte
here also can be string, that will be shown to the user
no entanto, no firefox, no Chrome, no entanto ...É possível verificá-lo com a ajuda de window.closed em um manipulador de eventos no evento 'unload' como este, mas o uso do tempo limite é necessário (portanto, o resultado não pode ser garantido se smth atrasar ou impedir o fechamento da janela):
Exemplo de JSFiddle (Testado em versões recentes Safari, FF, Chrome, Edge e IE11)
fonte
Eu tentei todas as soluções acima, nenhuma delas realmente funcionou para mim, especialmente porque existem alguns componentes da Telerik no meu projeto que possuem o botão 'Fechar' para janelas pop-up e chama o evento 'beforeunload'. Além disso, o seletor de botões não funciona corretamente quando você possui uma grade Telerik em sua página (refiro-me a botões dentro da grade). Portanto, não pude usar nenhuma das sugestões acima. Finalmente, esta é a solução que funcionou para mim. Eu adicionei um evento onUnload na tag body de _Layout.cshtml. Algo assim:
e adicione a função LogOff para redirecionar para Account / LogOff, que é um método interno do Asp.Net MVC. Agora, quando fecho o navegador ou a guia, ele é redirecionado para o método LogOff e o usuário precisa fazer o login quando retornar. Eu testei no Chrome e Firefox. E funciona!
fonte
Essa função mostra uma caixa de diálogo de confirmação se você fechar a janela ou atualizar a página durante qualquer processo no navegador.Esta função funciona em todos os navegadores.Você deve definir o isProcess var no processo do ajax.
fonte
fonte
sendkeylog
?Como o @jAndy mencionou, não há código JavaScript apropriado para detectar uma janela sendo fechada. Comecei pelo que a @Syno havia proposto.
Passei por uma situação como essa e, desde que você siga estas etapas, poderá detectá-la.
Eu testei no Chrome 67+ e Firefox 61+.
};
fonte
resize
quando a janela estiver embaçada. Se ficar 100x borrado, você terá 100 ouvintes, o que acabará diminuindo a velocidade do navegador.tente isso, tenho certeza que isso funcionará para você.
fonte
Tente isso. Vai funcionar. O método jquery unload está obsoleto.
fonte