Preciso avisar os usuários sobre alterações não salvas antes de deixarem uma página (um problema bastante comum).
window.onbeforeunload=handler
Isso funciona, mas gera uma caixa de diálogo padrão com uma mensagem padrão irritante que envolve meu próprio texto. Eu preciso substituir completamente a mensagem padrão, para que meu texto seja claro ou (melhor ainda) substituir toda a caixa de diálogo por uma caixa de diálogo modal usando jQuery.
Até agora, falhei e não encontrei mais ninguém que pareça ter uma resposta. Isso é possível?
Javascript na minha página:
<script type="text/javascript">
window.onbeforeunload=closeIt;
</script>
A função closeIt ():
function closeIt()
{
if (changes == "true" || files == "true")
{
return "Here you can append a custom message to the default dialog.";
}
}
Usando jQuery e jqModal, tentei esse tipo de coisa (usando um diálogo de confirmação personalizado):
$(window).beforeunload(function() {
confirm('new message: ' + this.href + ' !', this.href);
return false;
});
o que também não funciona - não consigo vincular o evento beforeunload.
javascript
jquery
onbeforeunload
carne
fonte
fonte
Respostas:
Você não pode modificar o diálogo padrão para
onbeforeunload
, portanto, sua melhor aposta pode ser trabalhar com ele.Aqui está uma referência a isso da Microsoft:
O problema parece ser:
onbeforeunload
é chamado, o valor de retorno do manipulador será assumido comowindow.event.returnValue
.false
é analisado como uma sequência, a caixa de diálogo será acionada, a qual passará umtrue
/ apropriadofalse
.O resultado é, não parece ser uma maneira de atribuir
false
aonbeforeunload
para impedir que o diálogo padrão.Notas adicionais sobre o jQuery:
onbeforeunload
eventos ocorram também. Se você deseja apenas que o seu evento de descarregamento ocorra, devo usar o JavaScript simples.O jQuery não possui um atalho para
onbeforeunload
que você precise usar abind
sintaxe genérica .Editar 09/04/2018 : as mensagens personalizadas nas caixas de diálogo onbeforeunload estão obsoletas desde o chrome-51 (cf: nota de versão )
fonte
O que funcionou para mim, usando o jQuery e testado no IE8, Chrome e Firefox, é:
É importante não retornar nada se nenhum prompt for necessário, pois há diferenças entre o IE e outros comportamentos do navegador aqui.
fonte
event.returnValue
é o único método "aprovado" no IE. O IE continua dizendo "O valor dessa propriedade tem precedência sobre os valores retornados pela função, como por meio de uma instrução de retorno Microsoft JScript". .. seria bom ver uma correlação garantida entrereturn
(de evento) eevent.returnValue
..Embora não haja nada que você possa fazer sobre a caixa em algumas circunstâncias, você pode interceptar alguém clicando em um link. Para mim, valeu a pena o esforço para a maioria dos cenários e, como alternativa, deixei o evento de descarregamento.
Eu usei o Boxy em vez do Diálogo jQuery padrão, ele está disponível aqui: http://onehackoranother.com/projects/jquery/boxy/
Você pode se conectar a outro evento e filtrar mais sobre que tipo de âncora foi clicada, mas isso funciona para mim e o que eu quero fazer e serve como um exemplo para outras pessoas usarem ou melhorarem. Pensei em compartilhar isso para aqueles que desejam esta solução.
Recortei o código, portanto, isso pode não funcionar como está.
fonte
1) Use onbeforeunload, não onunload.
2) O importante é evitar a execução de uma declaração de retorno. Com isso, não pretendo evitar retornar do seu manipulador. Você retorna bem, mas faz isso garantindo que você chegue ao final da função e NÃO execute uma declaração de retorno. Sob essas condições, o diálogo padrão interno não ocorre.
3) Você pode, se você usar onbeforeunload, executar uma chamada ajax em seu manipulador unbeforeunload para organizar o servidor, mas deve ser síncrono, e você deverá aguardar e manipular a resposta em seu manipulador onbeforeunload (ainda respeitando condição (2) acima). Eu faço isso e funciona bem. Se você fizer uma chamada ajax síncrona, tudo será mantido até a resposta voltar. Se você fizer uma assíncrona, pensando que não se importa com a resposta do servidor, o descarregamento da página continuará e sua chamada ajax será abortada por esse processo - incluindo um script remoto, se estiver em execução.
fonte
Tente colocar uma
return;
mensagem em vez de uma mensagem .. isso está funcionando para muitos navegadores para mim. (Isso realmente impede os presentes da caixa de diálogo)fonte
null
abrirá uma caixa de diálogo com o texto "nulo". No entanto,return void(0);
não abrirá a caixa de diálogo.Isso não pode ser feito no chrome agora para evitar spam, consulte javascript onbeforeunload não mostrando mensagem personalizada para obter mais detalhes.
fonte
Você pode detectar qual botão (ok ou cancelar) pressionado pelo usuário, porque a função onunload é chamada apenas quando o usuário escolhe sair da página. Embora nesta função as possibilidades sejam limitadas, porque o DOM está sendo recolhido. Você pode executar o javascript, mas o POST do ajax não faz nada; portanto, você não pode usar esse método para o logout automático. Mas existe uma solução para isso. O window.open ('logout.php') é executado na função onunload, para que o usuário saia com uma nova janela.
Esse código é chamado quando o usuário sai da página ou fecha a janela ativa e o usuário desconectado por 'logout.php'. A nova janela fecha imediatamente quando o logout php consiste em código:
fonte
Enfrentei o mesmo problema, estava bem em obter sua própria caixa de diálogo com a minha mensagem, mas o problema que enfrentei foi: 1) Ele estava dando uma mensagem em todas as navegações. Quero apenas um clique para fechar. 2) com minha própria mensagem de confirmação, se o usuário selecionar cancelar, ainda mostrará a caixa de diálogo padrão do navegador.
A seguir está o código de soluções que encontrei, que escrevi na minha página mestra.
fonte
consulte http://www.codeprojectdownload.com
fonte
Que tal usar a versão especializada do comando "bind" "one". Depois que o manipulador de eventos é executado pela primeira vez, é automaticamente removido como manipulador de eventos.
fonte
.one()
- que anexa um ouvinte de evento para ouvir o evento acontecer apenas uma vez: "Anexe um manipulador a um evento para os elementos. O manipulador é executado no máximo uma vez por elemento por tipo de evento". api.jquery.com/oneAbordagem angular 9:
Suporte a navegadores e remoção da mensagem personalizada:
fonte