Comment empêcher les alertes JavaScript qui se déclenchent lorsque vous quittez une page?

12

De nombreuses pages contiennent des alertes lorsque vous les quittez: si vous fermez des onglets, que vous vous éloignez sans enregistrer, etc., il existe de nombreuses raisons pour lesquelles un site vous alertera / vous empêchera de quitter jusqu'à ce que vous confirmiez une alerte, par exemple "Êtes-vous sûr de vouloir quitter cette page? ".

Cela se fait généralement avec les gestionnaires onbeforeunloadet / ou onunload.

Voici un exemple.

Existe-t-il un moyen de prévenir les alertes / événements de blocage d'utilisateurs générés par ces gestionnaires? Fondamentalement, je voudrais laisser JS activé, et en particulier interdire les choses qui m'empêcheraient de quitter une page sans qu'un clic supplémentaire ne se produise.

onbeforeunloadet les onunloadgestionnaires devraient toujours tirer; ils ne devraient tout simplement pas être autorisés à faire des choses qui bloquent l'utilisateur. Cela signifie aucune alerte et aucune opération qui prend plus de quelques secondes.

J'ai trouvé quelques plugins qui modifient / greasemonkey corrigent le javascript pour des pages particulières, et j'ai joué un peu avec leur code pour essayer de les rendre plus universellement applicables. Cependant, j'espère trouver une solution qui fonctionne sur n'importe quelle page qui tente de bloquer l'exit utilisateur.

Zac B
la source
Pouvez-vous publier une URL qui fait cela?
golimar
Exemple modifié et ajouté. De plus, je comprends pourquoi ce comportement est souvent souhaitable et qu'il est nécessaire pour éviter la perte accidentelle de données dans de nombreux cas. Je voudrais toujours savoir comment le remplacer / le désactiver.
Zac B
Remarque: toute la réponse actuelle (qui modifie onbeforeunload) ne fonctionnera que pour les pages qui utilisent onbeforeunload, pas pour les pages qui utilisent l'une des autres méthodes pour attacher des événements.
Synetech

Réponses:

7

Eh bien, la chose la plus simple à faire est simplement de remplacer directement le script des pages et de réaffecter l'événement à null.

window.onbeforeunload = null;

Cela devrait fonctionner n'importe où, à moins qu'ils ne soient vraiment malveillants, et continuer à les réaffecter eux-mêmes. Dans un tel cas, une boucle pour conserver le réglage nullfonctionnera probablement.

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

Maintenant, soyez averti, certaines pages l'utilisent pour de bon. Prenez la page de téléchargement YouTube: si vous vous éloignez pendant un téléchargement, vous risquez de perdre des heures de progression! Ou peut-être un formulaire Web que vous remplissez, que vous ne voudrez peut-être pas remplir à nouveau, ou un message (forum / e-mail) que vous ne voudrez peut-être pas retaper. Avec cette fonctionnalité, vous êtes protégé.

Un autre problème est toute page l'utilisant à des fins secondaires, comme la sauvegarde de données par AJAX. Ils peuvent utiliser cet événement pour déclencher l'action d'enregistrement et espèrent que l'utilisateur met suffisamment de temps à cliquer sur le bouton pour que la demande soit traitée. Encore une fois, cela est souvent fait pour vous sauver de vous-même.

Mais, évidemment, nous savons tous que de nombreuses pages l'utilisent pour du mal. Donc, si vous connaissez des pages sur lesquelles vous souhaitez qu'il fonctionne, vous pouvez toujours avoir un système de liste blanche. Il n'y a vraiment aucun moyen de bloquer cette action, sans blocage total window.onbeforeunload, et aucune action (éventuellement bonne) qu'elle puisse prendre.

Il n'y a aucun moyen (sans connaissance préalable d'un code de pages donné) de conserver les bonnes actions tout en arrêtant la boîte popup. Cette case n'est pas un alert(). La boîte est générée par le navigateur, comme le comportement prévu de onbeforeunload. On le crée en faisant n'importe quelle fonction qu'ils assignent pour window.onbeforeunloadretourner une chaîne. Cette chaîne sera imprimée dans le popup.

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

Ainsi, vous ne pourriez pas bloquer le popup sans effacer la fonction.

De plus, si vous trouviez un moyen, tout AJAX échouerait. Le popup laisse le temps aux requêtes de passer, sans lui, les données peuvent être perdues.

Quant à onunload, il ne devrait pas être possible de vous bloquer avec cela. Puisqu'il se déclenche après le déchargement de la page. Mais pour être en sécurité, vous pouvez toujours en faire un window.onunload = null;et il faut en prendre soin.

zeel
la source
Ce genre de travaux, mais que faire si le onbeforeunloadgestionnaire a fait autre chose d'important? Par exemple, que se passe-t-il si vous faites une brève demande AJAX ou si vous engagez quelque chose sur le stockage HTML5 local? Existe-t-il un moyen d'empêcher simplement les onbeforeunloadgestionnaires de passer certains appels (c.-à-d. alert()) Ou de s'exécuter plus longtemps qu'une certaine période de temps? C'est pourquoi j'ai demandé une extension plutôt qu'un simple script de type greasemonkey: il semble que, pour faire cela correctement, il devrait y avoir quelque chose de changé au niveau du moteur JavaScript.
Zac B
1
J'ai ajouté quelques informations supplémentaires. En ce qui concerne la résolution de ce problème à un niveau inférieur, les extensions ne sont pas en fait un niveau inférieur. Ils ont des autorisations plus élevées et certaines API spéciales, mais ils n'ont pas la possibilité de modifier les fonctions principales du navigateur. Je ne sais pas jusqu'où le bouchage FF peut aller, je n'ai aucune expérience dans ce domaine. Évidemment, étant open source, vous pouvez apporter ces modifications. Mais cela va un peu loin pour corriger un popup.
zeel
Ne travaille pas pour moi :(
Phuc Nguyen
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);
qui
la source
1
Pourquoi voudriez-vous jamais créer un script comme celui-ci?
Brad
3
@anywho. Cela peut être utile si vous essayez d'expliquer votre script pour aider les autres à savoir ce qu'ils font. Cela vous permettrait également de répondre à de nombreuses personnes, car une partie spécifique du script peut être modifiée de manière à améliorer le script ou une pièce peut être utilisée dans un script complètement différent. C'est aussi une bonne idée de vous expliquer quand même la réponse pour aider les gens à savoir comment cela s'applique à leur question. Merci d'avoir posté votre réponse.
David
0

Il y a un bon outil qui peut gérer n'importe quel popup ennuyeux sur un système Windows - ClickOff . Vous pouvez le télécharger ici . Je l'ai vérifié et cela fonctionne avec l'alerte "Les modifications que vous avez apportées peuvent ne pas être enregistrées" pour le site SharePoint.

Serhiy
la source