Weiß jemand, ob das onbeforeunload
Ereignis 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 onbeforeunload
Ereignis 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
quelle
addEventListener()
?beforeunload
dass Safari unter iOS nicht funktioniert. :-( Vielleicht nicht das, wonach Sie suchen, aber ich habe einen Vorschlag, wie man zuverlässig auf eine Arbeitbeforeunload
window.onbeforeunload = function(event) { event.returnValue = 'test'; }
nicht sowohl auf Chrome als auch auf Safari von iOS 9.2.1. Ich mag es wirklich,onbeforeunload
weil sich die Seite nicht ändert, wenn ich auf Abbrechen klicke.Antworten:
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.
quelle
unload
Veranstaltung veraltet zugunsten vonpagehide
siehe developer.apple.com/library/ios/documentation/AppleApplications/…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! ... } );
quelle
return 'test';
ähnlich wie bei op funktioniert nicht.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.
quelle
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 .
quelle
Das Ereignis beforeunload wird von Mobile Safari nicht unterstützt. Die Liste aller unterstützten Ereignisse finden Sie hier: Behandeln von Ereignissen Apple-Dokumentation
Und das Vorabladen ist nicht in der Liste!
quelle
https://code.google.com/p/chromium/issues/detail?id=97035
sehen hören.
Ich denke, Warnungen, Eingabeaufforderungen, Bestätigungen und andere Aktionen wie diese sind ebenfalls nicht mehr zulässig.
quelle
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 verwendenquelle
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.log
stattalert
in meinem Beispiel verwendet, weilalert
von einigen Browsern blockiert wird, wenn vonbeforeunload
oder aufgerufenvisibilitychange
.quelle