
Muitas páginas têm alertas quando você sai delas: se você fechar guias, navegar sem salvar, etc., há vários motivos pelos quais um site alertaria/bloquearia sua saída até que você confirme um alerta, por exemplo, "Tem certeza de que deseja navegar para fora desta página?".
Isso normalmente é feito com os manipuladores onbeforeunload
e/ou onunload
.
Aquié um exemplo.
Existe alguma maneira de evitar alertas/eventos de bloqueio de usuário gerados por esses manipuladores? Basicamente, gostaria de deixar o JS ativado e proibir especificamente coisas que me impediriam de sair de uma página sem que um clique extra acontecesse.
onbeforeunload
e onunload
os manipuladores ainda devem atirar; eles simplesmente não deveriam ter permissão para fazer coisas que bloqueiem o usuário. Isso significa nenhum alerta e nenhuma operação que leve mais do que alguns segundos.
Encontrei alguns plug-ins que editam/Greasemonkey corrigem o JavaScript para páginas específicas e brinquei um pouco com seu código para tentar torná-los mais universalmente aplicáveis. No entanto, espero encontrar uma solução que funcionequalquerpágina que tenta bloquear a saída do usuário.
Responder1
Bem, a coisa mais simples a fazer é simplesmente substituir o script das páginas diretamente e reatribuir o evento para null
.
window.onbeforeunload = null;
Isso deve funcionar em qualquer lugar, a menos que eles sejam realmente maliciosos e continuem reatribuindo eles próprios. Nesse caso, um loop para manter a configuração null
provavelmente 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 um upload, poderá ter perdido horas de progresso! Ou talvez um formulário da web que você está preenchendo e que talvez não queira preencher novamente, ou uma mensagem (fórum/e-mail) que talvez não queira redigitar. Com esse recurso, você está protegido.
Outro problema é qualquer página que use isso para algum propósito secundário, como salvar dados por AJAX. Eles podem usar esse evento para acionar a ação de salvar e esperar que o usuário demore o tempo suficiente para clicar no botão para que a solicitação seja processada. Novamente, isso geralmente é feito para salvá-lo de si mesmo.
Mas, obviamente, todos nós sabemos que muitas páginas usam isso para o mal. Portanto, se você souber de alguma página na qual deseja que funcione, poderá sempre 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 realizar.
Não há como (sem conhecimento prévio do código de uma determinada página) manter as boas ações ao parar a caixa pop-up. Esta caixa énãoum alert()
. A caixa é gerada pelo navegador, conforme o comportamento pretendido do onbeforeunload
. Pode-se criá-lo fazendo qualquer função atribuída para window.onbeforeunload
retornar uma string. Essa string será impressa no pop-up.
window.onbeforeunload = function() {
//Whatever
return "WARNING! You have unsaved changes that may be lost!";
}
Assim, 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 dá tempo para as solicitações serem processadas; sem ele, os dados podem ser perdidos.
Quanto a onunload
, não deveria ser possível bloqueá-lo com isso. Já que disparadepoisa página é descarregada. Mas, para estar seguro, você sempre pode fazer um window.onunload = null;
e deve cuidar disso.
Responder2
// ==/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);
Responder3
Existe uma ferramenta interessante que pode lidar com qualquer pop-up irritante em um sistema Windows -Clique desligado. Você pode baixá-lo emaqui. Eu verifiquei e funciona com o alerta "As alterações feitas podem não ser salvas" para o site do SharePoint.