Wie verhindere ich, dass beim Verlassen einer Seite JavaScript-Warnmeldungen ausgelöst werden?

Wie verhindere ich, dass beim Verlassen einer Seite JavaScript-Warnmeldungen ausgelöst werden?

Bei vielen Seiten gibt es Warnmeldungen, wenn Sie sie verlassen: Wenn Sie Tabs schließen, wegnavigieren, ohne zu speichern, usw., gibt es zahlreiche Gründe, warum eine Site Sie warnt bzw. Sie am Verlassen hindert, bis Sie eine Warnmeldung bestätigen, z. B. „Möchten Sie diese Seite wirklich verlassen?“.

Dies geschieht normalerweise mit den onbeforeunloadund/oder onunloadHandlern.

Hierist 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 ausgelöst werden; sie sollten nur 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/patchen, und habe ein bisschen mit ihrem Code herumgespielt, um sie universeller einsetzbar zu machen. Ich hoffe jedoch, eine Lösung zu finden, die funktioniert aufbeliebigSeite, die versucht, den Benutzerausgang zu blockieren.

Antwort1

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 weisen es selbst immer wieder neu zu. In einem solchen Fall nullwird eine Schleife zum Beibehalten der Einstellung wahrscheinlich funktionieren.

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

Aber seien Sie gewarnt, manche Seiten nutzen dies zu guten Zwecken. Nehmen Sie zum Beispiel die Upload-Seite von YouTube: Wenn Sie während eines Uploads wegnavigieren, sind möglicherweise Stunden an Fortschritt verloren! Oder vielleicht ein Webformular, das Sie ausfüllen und das Sie vielleicht nicht noch einmal ausfüllen möchten, oder eine Nachricht (Forum/E-Mail), die Sie vielleicht nicht noch einmal eingeben möchten. Mit dieser Funktion sind Sie geschützt.

Ein weiteres Problem sind Seiten, die dies für einen sekundären Zweck verwenden, beispielsweise zum Speichern von Daten per 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 wird. Auch dies wird häufig getan, um Sie vor sich selbst zu schützen.

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

Es gibt keine Möglichkeit (ohne vorherige Kenntnis des Codes einer bestimmten Seite), die guten Aktionen beizubehalten und gleichzeitig das Popup-Fenster zu stoppen. Dieses Fenster istnichtein alert(). Das Feld wird vom Browser generiert, wie es das beabsichtigte Verhalten von ist onbeforeunload. Man erstellt es, indem man die von ihm zugewiesene Funktion so einstellt, dass sie window.onbeforeunloadeinen String zurückgibt. Dieser String 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.

Und selbst wenn Sie einen Weg finden würden, würde jedes AJAX fehlschlagen. Das Popup gibt den Anfragen Zeit, durchzugehen. Ohne dieses Popup können Daten verloren gehen.

Was betrifft onunload, sollte es nicht möglich sein, Sie damit zu blockieren. Da es auslöstnachdie Seite wird entladen. Aber um sicher zu gehen, können Sie immer ein tun window.onunload = null;und es sollte darauf geachtet werden.

Antwort2

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

Antwort3

Es gibt ein nettes Tool, das jedes lästige Popup auf einem Windows-System bewältigen kann -KlickenAus. Sie können es herunterladen vonHier. Ich habe es geprüft und es funktioniert mit der Warnmeldung „Von Ihnen vorgenommene Änderungen werden möglicherweise nicht gespeichert“ für die SharePoint-Site.

verwandte Informationen