Czy ktoś wie, czy onbeforeunload
wydarzenie jest obsługiwane na iPadzie i / lub czy istnieje inny sposób jego wykorzystania?
Próbowałem prawie wszystkiego i wygląda na to, że onbeforeunload
zdarzenie nigdy nie jest uruchamiane na iPadzie (przeglądarce Safari).
W szczególności próbowałem tego:
window.onbeforeunload = function(event) { event.returnValue = 'test'; }
window.onbeforeunload = function(event) { return 'test'; }
- (oba powyższe razem)
window.onbeforeunload = function(event) { alert('test')'; }
- (wszystkie powyższe funkcje, ale wewnątrz
<body onbeforeunload="...">
Wszystkie te działają na FF i Safari na PC, ale nie na iPadzie.
Po załadowaniu strony wykonałem również następujące czynności:
alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);
Odpowiednio wyniki są następujące:
true
object
null
Tak więc przeglądarka ma tę właściwość, ale z jakiegoś powodu nie jest uruchamiana.
Sposoby opuszczania strony to klikanie przycisków Wstecz i Dalej, wyszukiwanie w Google na górnym pasku, zmiana lokalizacji na pasku adresu i kliknięcie zakładki.
Czy ktoś ma pojęcie o tym, co się dzieje? Byłbym bardzo wdzięczny za wszelkie uwagi.
Dzięki
źródło
addEventListener()
?beforeunload
że nie działa w Safari na iOS. :-( Może nie to, czego szukasz, ale mam sugestię, jak rzetelnie przetestować działaniebeforeunload
window.onbeforeunload = function(event) { event.returnValue = 'test'; }
nie działa zarówno w przeglądarce Chrome, jak i Safari w systemie iOS 9.2.1. Bardzo mi się podoba,onbeforeunload
ponieważ strona nie zmienia się, jeśli kliknę anuluj.Odpowiedzi:
Zauważyłem, że zdarzenie onunload () jest uruchamiane. To zachowanie jest nieco dziwne; cokolwiek masz w swojej funkcji zwrotnej dołączonej do zdarzenia, jest faktycznie uruchamiane po załadowaniu nowej strony w tle (nie możesz jeszcze powiedzieć, że jest załadowana, ale logowanie serwera pokaże, że tak jest).
Co dziwniejsze, jeśli masz wywołanie confirm () w swoim onunload (), a użytkownik kliknął link, aby przejść gdzie indziej, jesteś w biznesie. Jeśli jednak użytkownik zamknie kartę przeglądarki iPad Safari, zdarzenie onunload () zostanie uruchomione, ale Twoje potwierdzenie () będzie miało niejawne anulowanie jako odpowiedź.
źródło
unload
zdarzenie wycofane na korzyśćpagehide
patrz developer.apple.com/library/ios/documentation/AppleApplications/…Ten fragment JavaScript działa dla mnie w Safari i Chrome na iPadzie i iPhonie, a także na komputerach stacjonarnych / laptopach / innych przeglądarkach:
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! ... } );
źródło
return 'test';
podobnego do tego przez op nie działa ..Tylko Apple wiedziałoby na pewno, ale przypuszczam, że celowo nie włączyli tej funkcji w mobilnym Safari, ponieważ jest ona najczęściej używana przez podejrzane postacie, aby zmusić Cię do pozostania na ich stronie lub wyskakiwania wielu okien pornograficznych / reklamowych.
źródło
W WebKit występuje znany błąd dotyczący włączenia przed pobraniem. Wydaje mi się, że zostało to naprawione w najnowszej wersji beta Chrome 5, ale całkiem możliwe, że przeglądarka iPada została utworzona z wersji WebKit, która nie ma poprawki.
Powiązany raport o błędzie Chrome .
źródło
Zdarzenie beforeunload nie jest obsługiwane przez Mobile Safari. Możesz zobaczyć listę wszystkich obsługiwanych zdarzeń tutaj: Obsługa zdarzeń Dokumentacja Apple
A przedpunktu nie ma na liście!
źródło
https://code.google.com/p/chromium/issues/detail?id=97035
zobacz, usłysz.
Myślę, że alerty, monity, potwierdzenia i inne tego typu działania również nie są już dozwolone.
źródło
Jeśli chcesz tylko wiedzieć, czy strona została opuszczona, możesz użyć
document.unload
. Działa dobrze w przeglądarkach na iOS. Jeśli zobaczysz w dokumentacji Apple , zauważysz, że jest przestarzała i zalecają użycie document.pagehideźródło
Oto rozwiązanie, które powinno działać we wszystkich nowoczesnych przeglądarkach:
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"); } });
Przeglądarki mobilne zwykle nie obsługują,
beforeunload
ponieważ przeglądarka może przejść do tła bez wyładowywania strony, a następnie w dowolnym momencie zostać zabita przez system operacyjny.Większość przeglądarek komputerowych zawiera błąd, który powoduje, że
visibilityState
nie są wywoływane po wyładowaniu dokumentu. Zobacz: tutaj .Dlatego ważne jest, aby uwzględnić oba zdarzenia, aby uwzględnić wszystkie scenariusze.
NB
Użyłem
console.log
zamiastalert
w moim przykładzie, ponieważalert
niektóre przeglądarki będą blokowane podczas wywoływania zbeforeunload
lubvisibilitychange
.źródło