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 onbeforeunload
und / oder onunload
Handlern.
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.
onbeforeunload
und onunload
Handler 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.
quelle
onbeforeunload
) funktionieren nur für Seiten, die verwendet werdenonbeforeunload
, nicht für Seiten, die eine der anderen Methoden zum Anhängen von Ereignissen verwenden.Antworten:
Am einfachsten ist es, das Seitenskript direkt zu überschreiben und das Ereignis neu zuzuweisen
null
.Dies sollte überall funktionieren, es sei denn, sie sind wirklich böswillig, und sie sollten sie selbst neu zuweisen. In einem solchen Fall
null
funktioniert wahrscheinlich eine Schleife, um die Einstellung beizubehalten.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 generiertonbeforeunload
. Man erstellt es, indem man jede Funktion, die sie zuweisen, so macht,window.onbeforeunload
dass sie einen String zurückgibt. Diese Zeichenfolge wird im Popup gedruckt.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
onunload
sollte 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 tunwindow.onunload = null;
und es sollte erledigt werden.quelle
onbeforeunload
Handler 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, dassonbeforeunload
Handler bestimmte Anrufe tätigen (dhalert()
) 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.quelle
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.
quelle