beforeunload
Zdarzenie pożary, gdy użytkownik opuszcza stronę z jakiegokolwiek powodu.
Na przykład zostanie uruchomiony, jeśli użytkownik wyśle formularz, kliknie łącze, zamknie okno (lub kartę) lub przejdzie do nowej strony za pomocą paska adresu, pola wyszukiwania lub zakładki.
Możesz wykluczyć przesyłanie formularzy i hiperłącza (z wyjątkiem innych ramek) za pomocą następującego kodu:
var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });
$(window).on("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
W przypadku wersji jQuery starszych niż 1.7 spróbuj tego:
var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });
$(window).bind("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
Ta live
metoda nie działa ze submit
zdarzeniem, więc jeśli dodasz nowy formularz, będziesz musiał również powiązać z nim procedurę obsługi.
Zauważ, że jeśli inny program obsługi zdarzeń anuluje przesyłanie lub nawigację, utracisz monit o potwierdzenie, jeśli okno zostanie faktycznie zamknięte później. Można to naprawić poprzez rejestrowanie czasu w submit
i click
wydarzeń, a także sprawdzanie, czy beforeunload
dzieje się więcej niż kilka sekund później.
Ctrl + r
,F5
,Ctrl + Shift + r
i zmieniając adres URL w przeglądarce?.on()
.Może po prostu usuń powiązanie programu
beforeunload
obsługi zdarzeń w module obsługi zdarzeń formularzasubmit
:źródło
onsubmit=...
w każdej formie. (Mam wiele formularzy na stronie, w określonej aplikacji internetowej)W przypadku rozwiązania obsługującego wiele przeglądarek (przetestowanego w Chrome 21, IE9, FF15) rozważ użycie następującego kodu, który jest nieco zmodyfikowaną wersją kodu Slaksa:
Zwróć uwagę, że od wersji Firefox 4 pojawia się komunikat „Czy na pewno chcesz zamknąć?” nie jest wyświetlany. FF wyświetla tylko ogólny komunikat. Zobacz notatkę w https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload
źródło
live
ibind
instrukcje doon
, co działa świetnie z najnowszym poziomem jQuery. Dzięki!źródło
Aby uzyskać rozwiązanie, które działało dobrze z kontrolkami innych firm, takimi jak Telerik (np .: RadComboBox) i DevExpress, które używają znaczników Anchor z różnych powodów, rozważ użycie następującego kodu, który jest nieco zmodyfikowaną wersją kodu desm z lepszym selektorem dla siebie kierowanie na tagi kotwicy:
źródło
Moja odpowiedź ma na celu przedstawienie prostych wzorców.
JAK
Zobacz odpowiedź @SLaks .
Jak długo trwa przeglądarka, aby ostatecznie zamknąć stronę?
Za każdym razem, gdy użytkownik zamyka stronę ( xprzycisk lub CTRL+ W), przeglądarka wykonuje podany
beforeunload
kod, ale nie w nieskończoność. Jedynym wyjątkiem jest okienko potwierdzenia (return 'Do you really want to close?
), które będzie czekać na odpowiedź użytkownika.Chrome : 2 sekundy.
Firefox : ∞ (lub kliknij dwukrotnie lub wymuś zamknięcie)
Edge : ∞ (lub kliknij dwukrotnie)
Explorer 11 : 0 sekund.
Safari : TODO
Co wykorzystaliśmy do przetestowania tego:
To, co robi, to wysłanie jak największej liczby żądań, zanim przeglądarka zamknie swoją stronę (synchronicznie).
Wyjście Chrome:
źródło
Użyłem odpowiedzi Slaks, ale to nie działało tak, jak jest, ponieważ wartość returnValue onbeforeunload jest analizowana jako ciąg, a następnie wyświetlana w polu potwierdzeń przeglądarki. Została więc wyświetlona wartość true, np. „True”.
Po prostu użycie zwrotu zadziałało. Oto mój kod
źródło
Być może mógłbyś obsłużyć OnSubmit i ustawić flagę, którą później sprawdzisz w programie obsługi OnBeforeUnload.
źródło
źródło
Niestety, niezależnie od tego, czy jest to przeładowanie, przekierowanie nowej strony, czy zamknięcie przeglądarki, zdarzenie zostanie wywołane. Alternatywą jest złapanie identyfikatora wyzwalającego zdarzenie, a jeśli jest to forma, nie wyzwalaj żadnej funkcji, a jeśli nie jest to identyfikator formularza, zrób to, co chcesz zrobić po zamknięciu strony. Nie jestem pewien, czy jest to również możliwe bezpośrednio i nużące.
Możesz zrobić kilka drobnych rzeczy, zanim klient zamknie kartę. javascript wykrywa przeglądarkę zamknij kartę / zamknij przeglądarkę, ale jeśli lista działań jest duża, a karta zamyka się przed jej zakończeniem, jesteś bezradny. Możesz spróbować, ale z moim doświadczeniem nie polegaj na tym.
https://developer.mozilla.org/en-US/docs/Web/Reference/Events/beforeunload?redirectlocale=en-US&redirectslug=DOM/Mozilla_event_reference/beforeunload
źródło
Jeśli przesłanie formularza przenosi ich na inną stronę (jak zakładam, stąd wyzwolenie
beforeunload
), możesz spróbować zmienić przesyłanie formularza na wywołanie Ajax. W ten sposób nie opuszczą Twojej strony, gdy prześlą formularz, a Ty możesz użyć swojegobeforeunload
kodu wiążącego, jak chcesz.źródło
Mój problem: zdarzenie „onbeforeunload” byłoby wywoływane tylko w przypadku nieparzystej liczby zgłoszeń (kliknięć). Miałem kombinację rozwiązań z podobnych wątków w SO, aby moje rozwiązanie działało. mój kod będzie mówił.
źródło
Od jQuery 1.7 metoda .live () jest przestarzała. Użyj .on (), aby dołączyć programy obsługi zdarzeń. Użytkownicy starszych wersji jQuery powinni używać .delegate () zamiast .live ()
po zakończeniu lub linku
źródło
Spróbuj tego również
źródło
Po prostu zweryfikuj ...
źródło
źródło
Następujące pracowały dla mnie;
źródło
event.clientY
jest ujemna, jeśli klikniesz przycisk zamykania przeglądarki lub przycisk zamykania karty. Jednak ta wartość jest dodatnia po ponownym załadowaniu strony za pomocą skrótów klawiaturowych (F5, Ctrl-R) lub zamknięciu przeglądarki za pomocą skrótów klawiaturowych (np. Alt-F4). Dlatego nie można polegać na pozycji zdarzenia w celu odróżnienia zdarzenia zamknięcia przeglądarki od zdarzenia ponownego załadowania strony.