Wie kann verhindert werden, dass JavaScript-Warnungen beim Verlassen einer Seite ausgelöst werden?

12

Viele Seiten haben Warnungen, wenn Sie sie verlassen: Wenn Sie Registerkarten schließen, ohne Speichern weg navigieren usw., gibt es zahlreiche Gründe, warum eine Site Sie warnt / blockiert, bis Sie eine Warnung bestätigen, z. B. "Sind Sie sicher, dass Sie dies möchten?" von dieser Seite weg navigieren? ".

Dies erfolgt normalerweise mit den onbeforeunloadund / oder onunloadHandlern.

Hier ist ein Beispiel.

Gibt es eine Möglichkeit, Warnungen / Benutzerblockierungsereignisse zu verhindern, die von diesen Handlern generiert werden? Grundsätzlich möchte ich JS aktiviert lassen und insbesondere Dinge verbieten, die mich daran hindern würden, eine Seite zu verlassen, ohne dass ein zusätzlicher Klick erfolgt.

onbeforeunloadund onunloadHandler sollten immer noch feuern; Sie sollten einfach keine Dinge tun dürfen, die den Benutzer blockieren. Das bedeutet keine Warnungen und keine Vorgänge, die länger als ein paar Sekunden dauern.

Ich habe ein paar Plugins gefunden, die das Javascript für bestimmte Seiten bearbeiten / greasemonkey patchen, und ein wenig mit ihrem Code gespielt, um zu versuchen, sie universeller anwendbar zu machen. Ich hoffe jedoch, eine Lösung zu finden, die auf jeder Seite funktioniert , die versucht, den Benutzerexit zu blockieren.

Zac B.
quelle
Können Sie eine URL posten, die das tut?
Golimar
Bearbeitet, Beispiel hinzugefügt. Ich verstehe auch, warum dieses Verhalten oft wünschenswert ist und dass es in vielen Fällen erforderlich ist, um einen versehentlichen Datenverlust zu verhindern. Ich würde immer noch gerne wissen, wie man es überschreibt / deaktiviert.
Zac B
Hinweis: Alle aktuellen Antworten (die geändert werden onbeforeunload) funktionieren nur für Seiten, die verwendet werden onbeforeunload, nicht für Seiten, die eine der anderen Methoden zum Anhängen von Ereignissen verwenden.
Synetech

Antworten:

7

Am einfachsten ist es, das Seitenskript direkt zu überschreiben und das Ereignis neu zuzuweisen null.

window.onbeforeunload = null;

Dies sollte überall funktionieren, es sei denn, sie sind wirklich böswillig, und sie sollten sie selbst neu zuweisen. In einem solchen Fall nullfunktioniert wahrscheinlich eine Schleife, um die Einstellung beizubehalten.

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

Seien Sie gewarnt, einige Seiten verwenden dies für immer. Nehmen Sie die YouTube-Upload-Seite: Wenn Sie während eines Uploads weg navigieren, haben Sie möglicherweise stundenlangen Fortschritt verloren! Oder vielleicht ein Webformular, das Sie ausfüllen und das Sie möglicherweise nicht erneut ausfüllen möchten, oder eine Nachricht (Forum / E-Mail), die Sie möglicherweise nicht erneut eingeben möchten. Mit dieser Funktion sind Sie geschützt.

Ein weiteres Problem ist jede Seite, die dies für einen sekundären Zweck verwendet, z. B. zum Speichern von Daten mit AJAX. Sie können dieses Ereignis verwenden, um die Speicheraktion auszulösen, und hoffen, dass der Benutzer lange genug braucht, um auf die Schaltfläche zu klicken, damit die Anforderung ausgeführt werden kann. Auch dies wird oft getan, um dich vor dir selbst zu retten.

Aber natürlich wissen wir alle, dass viele Seiten dies für Kranke verwenden. Wenn Sie also Seiten kennen, auf denen Sie arbeiten möchten, können Sie jederzeit ein White-List-System verwenden. Es gibt wirklich keine Möglichkeit, diese Aktion zu blockieren, ohne sie vollständig zu blockieren window.onbeforeunload, und keine (möglicherweise guten) Aktionen, die sie möglicherweise ausführen.

Es gibt keine Möglichkeit (ohne vorherige Kenntnis eines bestimmten Seitencodes), die guten Aktionen beizubehalten, während das Popup-Fenster gestoppt wird. Dieses Feld ist nicht ein alert(). Die Box wird vom Browser als beabsichtigtes Verhalten von generiert onbeforeunload. Man erstellt es, indem man jede Funktion, die sie zuweisen, so macht, window.onbeforeunloaddass sie einen String zurückgibt. Diese Zeichenfolge wird im Popup gedruckt.

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

Daher können Sie das Popup nicht blockieren, ohne die Funktion zu löschen.

Wenn Sie einen Weg finden würden, würde jede AJAX fehlschlagen. Das Popup gibt Anfragen Zeit zum Durchlaufen, ohne es können Daten verloren gehen.

Was onunloadsollte es nicht möglich sein , das Sie mit diesem zu blockieren. Da es nach dem Entladen der Seite ausgelöst wird. Aber um sicher zu gehen, können Sie immer ein tun window.onunload = null;und es sollte erledigt werden.

zeel
quelle
Diese Art von Arbeiten, aber was ist, wenn der onbeforeunloadHandler etwas anderes Wichtiges getan hat? Was ist zum Beispiel, wenn eine kurze AJAX-Anfrage gestellt oder etwas für den lokalen HTML5-Speicher festgeschrieben wurde? Gibt es eine Möglichkeit, nur zu verhindern, dass onbeforeunloadHandler bestimmte Anrufe tätigen (dh alert()) oder länger als einen bestimmten Zeitraum laufen? Aus diesem Grund habe ich eher nach einer Erweiterung als nach einem Skript vom Typ Greasemonkey gefragt: Um dies richtig zu machen, müsste auf der Ebene der JavaScript-Engine etwas geändert werden.
Zac B
1
Ich habe weitere Informationen hinzugefügt. Soweit dies tatsächlich auf einer niedrigeren Ebene behoben wird, sind Erweiterungen eigentlich keine niedrigere Ebene. Sie verfügen zwar über höhere Berechtigungen und einige spezielle APIs, können jedoch die Kernfunktionen des Browsers nicht ändern. Ich bin mir nicht sicher, wie tief das FF-Stecken gehen kann, ich habe keine Erfahrung in diesem Bereich. Da Sie Open Source sind, können Sie diese Änderungen natürlich vornehmen. Aber das geht ein bisschen weit, um ein Popup zu reparieren.
Zeel
Arbeitet
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);
irgendjemand
quelle
1
Warum würden Sie jemals ein solches Skript erstellen?
Brad
3
@irgendjemand. Es kann hilfreich sein, wenn Sie versuchen, Ihr Skript zu erklären, damit andere wissen, was sie tun. Auf diese Weise können Sie auch die Antwort von vielen verwenden, da ein bestimmter Teil des Skripts möglicherweise geändert werden kann, um das Skript zu verbessern, oder ein Teil in einem völlig anderen Skript verwendet werden kann. Es ist auch eine gute Idee, Ihre Antwort zu erklären, damit die Leute wissen, wie sie auf ihre Frage zutrifft. Vielen Dank, dass Sie Ihre Antwort veröffentlicht haben.
David
0

Es gibt ein nettes Tool, das jedes nervige Popup auf einem Windows-System verarbeiten kann - ClickOff . Sie können es hier herunterladen . Ich habe es überprüft und es funktioniert mit der Warnung "Änderungen, die Sie vorgenommen haben, werden möglicherweise nicht gespeichert" für die SharePoint-Website.

Serhiy
quelle