Comment empêcher les alertes JavaScript qui déclenchent lorsqu'elles quittent une page?

Beaucoup de pages ont des alertes lorsque vous les quittez: si vous fermez les onglets, naviguez sans sauvegarder, etc., il existe de nombreuses raisons pour lesquelles un site vous alerterait / vous empêchera de vous quitter jusqu'à ce que vous confirmez une alerte, par exemple "Êtes-vous sûr de vouloir Naviguer loin de cette page? ".

Cela se fait généralement avec les onbeforeunload et / ou onunload .

Voici un exemple.

Est-ce que je peux empêcher les alertes / les événements bloquant les utilisateurs générés par ces gestionnaires? Fondamentalement, j'aimerais laisser JS activé, et plus particulièrement interdire les choses qui m'empêcheraient de laisser une page sans qu'un clic supplémentaire ne se produise.

onbeforeunload et de onunload doivent toujours déclencher; Ils ne devraient tout simplement pas être autorisés à faire des choses qui bloquent l'utilisateur. Cela signifie qu'aucune alerte, et aucune opération ne nécessite plus de quelques secondes.

J'ai trouvé quelques plugins qui éditent / greasemonkey remplace le javascript pour des pages particulières et joue avec leur code un peu pour essayer de les rendre plus universellement applicables. Cependant, j'espère trouver une solution qui fonctionne sur n'importe quelle page qui essaie de bloquer la sortie des utilisateurs.

Eh bien, la chose la plus simple à faire est simplement de remplacer le script de pages directement 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 qu'ils réaffectent eux-mêmes eux-mêmes. Dans un tel cas, une boucle pour garder la valeur null fonctionnera vraisemblablement.

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

Maintenant, soyez averti, certaines pages utilisent cela pour de bon. Prenez la page de téléchargement de YouTube: si vous naviguez pendant un téléchargement, vous avez peut-être perdu des heures de progrès! Ou peut-être un formulaire Web que vous remplissez, que vous ne souhaitez peut-être pas remplir à nouveau, ou un message (forum / courrier électronique) que vous ne voudrez peut-être pas retaper. Avec cette fonctionnalité, vous êtes protégé.

Un autre problème est toute page utilisant ceci pour un but secondaire, comme la sauvegarde des données par AJAX. Ils peuvent utiliser cet événement pour déclencher l'action de sauvegarde, et espérons que l'utilisateur prend suffisamment de temps pour cliquer sur le bouton pour la demande. Encore une fois, cela se fait souvent pour vous sauver de vous-même.

Mais, évidemment, nous savons que beaucoup de pages utilisent cela pour mal. Donc, si vous connaissez les pages sur lesquelles vous souhaitez fonctionner, vous pourriez toujours disposer d'un système de liste blanche. Il n'y a vraiment aucun moyen de bloquer cette action, sans bloquer totalement la window.onbeforeunload , window.onbeforeunload , et toutes les actions (éventuellement bonnes) que cela peut prendre.

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

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

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

De plus, si vous avez trouvé un moyen, tout AJAX échouerait. La fenêtre contextuelle donne le temps de passer des demandes, sans elle, les données peuvent être perdues.

En ce qui concerne la onunload , il ne devrait pas être possible de vous bloquer avec ceci. Puisqu'il se déclenche après la décharge de la page. Mais pour être en sécurité, vous pouvez toujours faire window.onunload = null; Et il devrait être pris en charge.

  // ==/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); 

Il existe un bon outil qui peut gérer n'importe quel popup gênant sur un système Windows – ClickOff . Vous pouvez le télécharger à partir d' ici . Je l'ai vérifié et cela fonctionne avec l'alerte "Les modifications que vous avez activées peuvent ne pas être sauvegardées" pour le site SharePoint.