Como evitar alertas JavaScript acionados ao sair de uma página?

12

Muitas páginas têm alertas quando você as deixa: se você fechar as guias, navegar sem salvar, etc., há várias razões pelas quais um site o alertaria / impedia de sair até que você confirmasse um alerta, por exemplo, "Tem certeza de que deseja sair desta página? ".

Isso geralmente é feito com os manipuladores onbeforeunloade / ou onunload.

Aqui está um exemplo.

Existe alguma maneira de impedir alertas / eventos de bloqueio de usuários gerados por esses manipuladores? Basicamente, gostaria de deixar o JS ativado e, especificamente, não permitir coisas que me impediriam de sair de uma página sem que um clique extra acontecesse.

onbeforeunloade os onunloadmanipuladores ainda devem disparar; eles simplesmente não devem fazer coisas que bloqueiam o usuário. Isso significa que não há alertas nem operações que demoram mais do que alguns segundos.

Encontrei alguns plugins que editam / greasemonkey corrigem o javascript para páginas específicas e brincamos um pouco com o código deles para tentar torná-los mais aplicáveis ​​universalmente. No entanto, espero encontrar uma solução que funcione em qualquer página que tente bloquear a saída do usuário.

Zac B
fonte
Você pode postar um URL que faz isso?
golimar
Editado, exemplo adicionado. Além disso, entendo por que esse comportamento geralmente é desejável e que é necessário para evitar a perda acidental de dados em muitos casos. Eu ainda gostaria de saber como substituí-lo / desativá-lo.
Zac B
Nota: todas as respostas atuais (que modificam onbeforeunload) funcionarão apenas para páginas que usam onbeforeunload, não para páginas que usam um dos outros métodos para anexar eventos.
Synetech

Respostas:

7

Bem, a coisa mais simples a fazer é simplesmente substituir diretamente o script das páginas e atribuir novamente o evento null.

window.onbeforeunload = null;

Isso deve funcionar em qualquer lugar, a menos que sejam realmente maliciosos, e continue atribuindo-os novamente. Nesse caso, um loop para manter a configuração nullprovavelmente funcionará.

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

Agora, esteja avisado, algumas páginas usam isso para sempre. Veja a página de upload do YouTube: se você sair durante o upload, poderá ter perdido horas de progresso! Ou talvez um formulário da web que você esteja preenchendo, que talvez você não queira preencher novamente, ou uma mensagem (fórum / email) que você não queira redigitar. Com esse recurso, você está protegido.

Outra questão é qualquer página que use isso para fins secundários, como salvar dados pelo AJAX. Eles podem usar esse evento para acionar a ação de salvar e esperam que o usuário demore o suficiente para clicar no botão da solicitação. Novamente, isso geralmente é feito para salvá-lo de si mesmo.

Mas, obviamente, todos sabemos que muitas páginas usam isso para problemas. Portanto, se você souber de alguma página em que deseja trabalhar, sempre poderá ter um sistema de lista branca. Realmente não há uma maneira de bloquear essa ação, sem bloquear totalmente window.onbeforeunload, e quaisquer ações (possivelmente boas) que ela possa executar .

Não há como (sem o conhecimento prévio de um determinado código de página) manter as boas ações enquanto para a caixa pop-up. Esta caixa não é uma alert(). A caixa é gerada pelo navegador, conforme o comportamento pretendido de onbeforeunload. Um cria, fazendo qualquer função que eles atribuam para window.onbeforeunloadretornar uma string. Essa sequência será impressa no pop-up.

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}

Portanto, você não conseguiria bloquear o pop-up sem apagar a função.

Além disso, se você encontrasse uma maneira, qualquer AJAX falharia. O pop-up fornece tempo para as solicitações passarem, sem ela, os dados podem ser perdidos.

Quanto a onunload, não deve ser possível bloquear você com isso. Uma vez que é acionado após o descarregamento da página. Mas, para estar seguro, você sempre pode fazer um window.onunload = null;e deve ser resolvido.

Zeel
fonte
Esse tipo de trabalho, mas e se o onbeforeunloadmanipulador fizesse outra coisa importante? Por exemplo, o que se fez uma breve solicitação AJAX ou comprometeu algo no armazenamento HTML5 local? Existe uma maneira de impedir que os onbeforeunloadmanipuladores façam determinadas chamadas (ou seja alert()) ou funcionem por mais de um determinado período de tempo? É por isso que perguntei sobre uma extensão em vez de apenas um script do tipo greasemonkey: parece que, para fazer isso corretamente, teria que haver algo alterado no nível do mecanismo JavaScript.
Zac B
1
Eu adicionei mais algumas informações. Na medida em que realmente corrige isso em um nível inferior, as extensões não são realmente um nível inferior. Eles têm permissões mais altas e algumas APIs especiais, mas não têm capacidade de alterar as principais funções do navegador. Não tenho certeza da profundidade da conexão FF, não tenho experiência nessa área. Obviamente, sendo de código aberto, você pode fazer essas alterações. Mas isso está indo um pouco longe para consertar um pop-up.
Zeel
Não está funcionando para mim :(
Phuc Nguyen 8/19
0
    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);
qualquer pessoa
fonte
1
Por que você criaria um script como esse?
Brad
3
@anywho. Pode ser útil se você tentar explicar seu script para ajudar outras pessoas a saber o que estão fazendo. Isso também permitiria que a resposta fosse usada por muitos, pois uma parte específica do script pode ser alterada de maneira a melhorar o script ou uma peça pode ser usada em um script completamente diferente. Também é uma boa ideia explicar as respostas de qualquer maneira para ajudar as pessoas a saber como isso se aplica à sua pergunta. Obrigado por postar sua resposta.
David
0

Existe uma boa ferramenta que pode lidar com qualquer pop-up irritante em um sistema Windows - ClickOff . Você pode baixá-lo aqui . Eu verifiquei e funciona com o alerta "Alterações que você fez não podem ser salvas" no site do SharePoint.

Serhiy
fonte