window.onbeforeunload funktioniert nicht auf dem iPad?

84

Weiß jemand, ob das onbeforeunloadEreignis auf dem iPad unterstützt wird und / oder ob es eine andere Möglichkeit gibt, es zu verwenden?

Ich habe so ziemlich alles ausprobiert und es scheint, dass das onbeforeunloadEreignis auf dem iPad (Safari-Browser) nie ausgelöst wird.

Im Einzelnen habe ich Folgendes versucht:

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (beide oben zusammen)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (Alle oben genannten Funktionen, aber innen <body onbeforeunload="...">

Alle diese Funktionen funktionieren mit FF und Safari auf dem PC, jedoch nicht auf dem iPad.

Außerdem habe ich gleich nach dem Laden der Seite Folgendes getan:

alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);

Die Ergebnisse sind jeweils:

  • true
  • object
  • null

Der Browser verfügt zwar über die Eigenschaft, wird jedoch aus irgendeinem Grund nicht ausgelöst.

Ich versuche, von der Seite weg zu navigieren, indem ich auf die Schaltflächen Zurück und Vorwärts klicke, eine Google-Suche in der oberen Leiste durchführe, die Position in der Adressleiste ändere und auf ein Lesezeichen klicke.

Hat jemand eine Idee, was los ist? Ich würde mich über jede Eingabe sehr freuen.

Vielen Dank

Art Zambrano
quelle
Vielen Dank für Ihre Eingabe. Dies muss einer der von Ihnen genannten Gründe sein. Leider gibt es keine offizielle Dokumentation von Apple zu dieser und anderen Einschränkungen. Hoffentlich werden sie eine kreativere Möglichkeit finden, diese Funktion zu aktivieren und gleichzeitig die böswillige Verwendung zu verhindern. Ich höre sehr oft, dass Leute versehentlich von der Seite weg tippen und alle Daten verlieren, die sie in ein Formular eingegeben haben.
Art Zambrano
Haben Sie versucht, zu verwenden addEventListener()?
Hallo71
2
Ich bin mir ziemlich sicher, beforeunloaddass Safari unter iOS nicht funktioniert. :-( Vielleicht nicht das, wonach Sie suchen, aber ich habe einen Vorschlag, wie man zuverlässig auf eine Arbeit beforeunload
Peter V. Mørch
1
Am 3. März 16 funktioniert The window.onbeforeunload = function(event) { event.returnValue = 'test'; }nicht sowohl auf Chrome als auch auf Safari von iOS 9.2.1. Ich mag es wirklich, onbeforeunloadweil sich die Seite nicht ändert, wenn ich auf Abbrechen klicke.
vanduc1102
Scheint, als ob dieses Problem in Safari und iOS 13
Finesse

Antworten:

20

Ich habe festgestellt, dass das Ereignis onunload () ausgelöst wird. Das Verhalten ist etwas seltsam; Was auch immer Sie in Ihrer Rückruffunktion an das Ereignis angehängt haben, wird tatsächlich ausgeführt, nachdem die neue Seite im Hintergrund geladen wurde (Sie können nicht sagen, dass sie noch geladen ist, aber die Serverprotokollierung zeigt an, dass dies der Fall ist).

Seltsamerweise sind Sie im Geschäft, wenn Sie in Ihrem onunload () einen Bestätigungsaufruf () haben und der Benutzer auf einen Link geklickt hat, um an einen anderen Ort zu gelangen. Wenn der Benutzer jedoch die Registerkarte des iPad Safari-Browsers schließt, wird das Ereignis onunload () ausgelöst, Ihre Bestätigung () wird jedoch implizit abgebrochen.

Danny Armstrong
quelle
Huh, diese Bestätigungs-Eigenart (dass die zweite Seite vor der Bestätigungsnachricht aufgerufen wird) gilt nicht nur für mobile Safari, sondern auch für Firefox (und wahrscheinlich auch für andere). Du hast mich einfach umgehauen.
Amalgovinus
4
unloadVeranstaltung veraltet zugunsten von pagehidesiehe developer.apple.com/library/ios/documentation/AppleApplications/…
sol0mka
1
@ sol0mka: Das war's, Mann! Toll! In meinem Fall hat der folgende Code den Job gemacht, soweit ich für alle meine Browser UND iOS sehen kann: $ (window) .on ('beforeunload pagehide', function () {// meine Sachen, die auf Seite erledigt werden müssen Veränderung } ); Dies sollte in meinen Augen die akzeptierte Antwort sein.
Garavani
18

Dieses bisschen JavaScript funktioniert für mich auf Safari und Chrome auf iPad und iPhone sowie auf Desktop / Laptop / anderen Browsern:

var isOnIOS = navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPhone/i);
var eventName = isOnIOS ? "pagehide" : "beforeunload";

window.addEventListener(eventName, function (event) { 
    window.event.cancelBubble = true; // Don't know if this works on iOS but it might!
    ...
} );
Achtung
quelle
1
Es kann das Ereignis abfangen, aber wie können Sie die Bestätigungsaufforderung öffnen? Die Verwendung return 'test';ähnlich wie bei op funktioniert nicht.
user2335065
Danke, das habe ich in der ursprünglichen Frage verpasst. Ich habe dies nicht speziell unter iOS getestet, aber möglicherweise würde das Hinzufügen dieser zusätzlichen Zeile funktionieren: window.event.cancelBubble = true; Ich werde zu meiner Antwort hinzufügen
Gefahr
2
Danke, aber leider funktioniert es nicht ... Ich habe versucht, alert () darin zu platzieren. Anscheinend wurde die neue Seite geladen, bevor die alert () ausgelöst wird. Siehe auch dies: stackoverflow.com/questions/3239834/…
user2335065
@ user2335065 hast du eine Lösung dafür gefunden?
Neeraj Rathod
Leute, habt ihr eine Lösung gefunden, um die Bestätigungsaufforderung anzuzeigen, bevor ihr die Seite verlässt? Dies funktioniert in jedem Browser außer IOS Safari einwandfrei. Ich habe auch Pagehide Event ausprobiert, aber bei mir nicht funktioniert. Danke im Voraus.
Rahul
6

Nur Apple würde es sicher wissen, aber ich vermute, dass sie diese Funktionalität in Mobile Safari absichtlich nicht aktiviert haben, da sie am häufigsten von zwielichtigen Charakteren verwendet wird, um Sie dazu zu bringen, auf ihrer Website zu bleiben oder viele Porno- / Werbefenster aufzurufen.

Charles Boyung
quelle
55
Oder speichern Sie Ihre Änderungen automatisch, damit sie nicht verloren gehen, nur weil Sie versehentlich auf das Falsche getippt haben.
Joel Mueller
4
Ich habe nicht gesagt, dass es keine gültigen Verwendungen gibt, ich habe nur gesagt, dass dies die häufigsten Verwendungen sind.
Charles Boyung
3
@ JoelMueller Ihr Kommentar sollte die akzeptierte Antwort sein :)
Sanchez
1
@ JoelMueller Das ist genau mein Anwendungsfall. Grrr @ apple
user2808054
@JoelMueller können Sie bitte jedes offizielle Dokument teilen, in dem wir diese Aussage ansprechen können, dass Mobile Safari Änderungen automatisch speichert.
Neeraj Rathod
3

In WebKit ist ein Fehler mit onbeforeunload bekannt. Ich glaube, es wurde in der neuesten Beta von Chrome 5 behoben, aber es ist durchaus möglich, dass der Browser des iPad aus einer Version von WebKit besteht, die das Update nicht enthält.

Zugehöriger Chrome-Fehlerbericht .

Joel Mueller
quelle
1
Ich bin verwirrt oder existiert dieser Fehler noch im iPad-Browser?
Peter
2

https://code.google.com/p/chromium/issues/detail?id=97035

sehen hören.

Warnungen sind bei Seitenentlassungsereignissen (vor dem Entladen, Entladen, Seitenausblenden) nicht mehr zulässig.

Ich denke, Warnungen, Eingabeaufforderungen, Bestätigungen und andere Aktionen wie diese sind ebenfalls nicht mehr zulässig.

zelda.j
quelle
1

Wenn Sie nur wissen müssen, ob die Seite verlassen wurde, können Sie verwenden document.unload. Es funktioniert gut in iOS-Browsern. Wenn Sie in der Apple-Dokumentation sehen , dass diese veraltet ist, wird empfohlen, document.pagehide zu verwenden

Miquel
quelle
Ja, dieses Ereignis wird auf einer Safari ausgelöst, aber die Bestätigungsaufforderung erfolgt nicht wie in Chrome.
Rahul
1

Hier ist eine Lösung, die auf allen modernen Browsern funktionieren sollte:

var unloaded = false;
window.addEventListener("beforeunload", function(e)
{
    if (unloaded)
        return;
    unloaded = true;
    console.log("beforeUnload");
});
window.addEventListener("visibilitychange", function(e)
{
    if (document.visibilityState == 'hidden')
    {
        if (unloaded)
            return;
        unloaded = true;
        console.log("beforeUnload");
    }
});

Mobile Browser unterstützen dies normalerweise nicht beforeunload da der Browser in den Hintergrund kann, ohne die Seite zu entladen, und dann jederzeit vom Betriebssystem beendet werden kann.

Die meisten Desktop-Browser enthalten einen Fehler, der dazu führt visibilityState, dass beim Entladen des Dokuments kein Aufruf erfolgt. Siehe: hier .

Daher ist es wichtig, beide Ereignisse einzuschließen, um alle Szenarien abzudecken.

NB

Ich habe console.logstatt alertin meinem Beispiel verwendet, weil alertvon einigen Browsern blockiert wird, wenn von beforeunloadoder aufgerufen visibilitychange.

Dan Bray
quelle