Czy jest jakiś kod JavaScript / jQuery dla różnych przeglądarek, aby wykryć, czy przeglądarka lub karta przeglądarki jest zamykana, ale nie z powodu kliknięcia łącza?
javascript
jquery
cometta
źródło
źródło
sessionStorage
właściwości, wygasa po zamknięciu przeglądarki. w3schools.com/jsref/prop_win_sessionstorage.aspOdpowiedzi:
Jeśli otrzymam poprawnie, chcesz wiedzieć, kiedy karta / okno jest skutecznie zamknięte. AFAIK to jedyny sposób
Javascript
na wykrycie tego rodzaju rzeczyonunload
ionbeforeunload
zdarzeń.Niestety (lub na szczęście?) Zdarzenia te są również uruchamiane, gdy opuszczasz witrynę nad
link
przyciskiem Wstecz lub przeglądarki. To jest najlepsza odpowiedź, jaką mogę udzielić, nie sądzę, abyś mógł natywnie wykryć czystyclose
kod JavaScript. Popraw mnie, jeśli się tu mylę.źródło
String
wartość zwracaną zonbeforeunload
. Nie możesz już wyświetlać niestandardowego komunikatu przed rozładowaniem.unload
?Z dokumentacji Firefox
Z niektórych powodów przeglądarki oparte na Webkit nie są zgodne ze specyfikacją okna dialogowego. Prawie przekrojowy przykład byłby bliski poniższemu przykładowi.
Ten przykład obsługi wszystkich przeglądarek.
źródło
Proste rozwiązanie
źródło
// Działa to w IE7, jeśli zamykasz kartę lub przeglądarkę za pomocą tylko jednej karty
źródło
window.onunload = "alert('wait')"
iwindow.onbeforeunload = "alert('wait... chrome!')"
korzystałem z konsoli w Chromium / Ubuntu, ale żaden nie został uruchomiony po zamknięciu karty.window.onunload = "alert('wait')"
i takie nie powinny naprawdę działać. „Funkcja powinna przypisać wartość ciągu do właściwości returnValue obiektu Event i zwrócić ten sam ciąg”. Proszę spojrzeć na artykuł MDNMusiałem automatycznie wylogować użytkownika po zamknięciu przeglądarki lub karty, ale nie wtedy, gdy użytkownik przejdzie do innych łączy. Nie chciałem też, aby pojawił się monit o potwierdzenie. Po dłuższej walce z tym, szczególnie w IE i Edge, oto co skończyłem (sprawdziłem pracę z IE 11, Edge, Chrome i Firefox) po tym, jak oparłem podejście na tej odpowiedzi .
Najpierw uruchom licznik czasu na serwerze w
beforeunload
module obsługi zdarzeń w JS. Wywołania ajax muszą być synchroniczne, aby IE i Edge działały poprawnie. Musisz także użyć,return;
aby zapobiec wyświetlaniu okna dialogowego potwierdzenia w następujący sposób:Uruchomienie timera ustawia
cancelLogout
flagę na false . Jeśli użytkownik odświeży stronę lub przejdzie do innego łącza wewnętrznego,cancelLogout
flaga na serwerze zostanie ustawiona na wartość true . Po upływie zdarzenia licznika czasu sprawdzacancelLogout
flagę, aby sprawdzić, czy zdarzenie wylogowania zostało anulowane. Jeśli stoper został anulowany, wówczas stoper zostałby zatrzymany. Jeśli przeglądarka lub kartacancelLogout
zostaną zamknięte, flaga pozostanie fałszywa, a moduł obsługi zdarzeń wyloguje użytkownika.Uwaga dotycząca implementacji: używam ASP.NET MVC 5 i anuluję wylogowanie w przesłoniętej
Controller.OnActionExecuted()
metodzie.źródło
OnActionExecuted
?Niestety, nie byłem w stanie dodać komentarza do jednej z istniejących odpowiedzi, ale jeśli chciałbyś zaimplementować rodzaj okna dialogowego z ostrzeżeniem, chciałem tylko wspomnieć, że każda funkcja obsługi zdarzeń ma argument - zdarzenie. W twoim przypadku możesz wywołać event.preventDefault (), aby uniemożliwić automatyczne opuszczanie strony, a następnie wydać własne okno dialogowe. Uważam to za zdecydowanie lepszą opcję niż używanie standardowego brzydkiego i niepewnego alert (). Osobiście zaimplementowałem własny zestaw okien dialogowych opartych na obiekcie kendoWindow (interfejs użytkownika Kendo Telerik, który jest prawie w całości otwarty, z wyjątkiem kendoGrid i kendoEditor). Możesz także użyć okien dialogowych z interfejsu użytkownika jQuery. Pamiętaj jednak, że takie rzeczy są asynchroniczne i będziesz musiał powiązać moduł obsługi ze zdarzeniem onclick każdego przycisku, ale wszystko to jest dość łatwe do wdrożenia.
Zgadzam się jednak, że brak prawdziwego zdarzenia zamknięcia jest okropny: jeśli na przykład chcesz zresetować stan sesji na zapleczu tylko w przypadku prawdziwego zamknięcia, jest to problem.
źródło
W przypadku podobnych zadań można użyć
sessionStorage
do lokalnego przechowywania danych do momentu zamknięcia karty przeglądarki.Te
sessionStorage
dane przechowuje obiekt tylko dla jednej sesji (dane są usuwane po zamknięciu przeglądarki zakładka). ( W3Schools )To jest mój długopis .
źródło
Nie ma zdarzenia, ale jest właściwość
window.closed
która jest obsługiwana we wszystkich głównych przeglądarkach w momencie pisania tego tekstu. Dlatego jeśli naprawdę potrzebujesz wiedzieć, możesz przeszukać okno, aby sprawdzić tę właściwość.if(myWindow.closed){do things}
Uwaga: odpytywanie czegokolwiek na ogół nie jest najlepszym rozwiązaniem.
window.onbeforeunload
Zdarzenie powinno być stosowane, jeżeli jest to możliwe, tylko zastrzeżenie jest to, iż również pożary, jeśli opuścisz.źródło
źródło
beforeunload
jeśli chcesz wyświetlić alert. W ten sposób:$(window).on('beforeunload', function(){ alert ('Bye now')});
Spróbuj użyć:
źródło
Znalazłem sposób, który działa na wszystkich moich przeglądarkach .
Testowany na następujących wersjach: Firefox 57, Internet Explorer 11, Edge 41, jeden z najnowszych Chrome (nie wyświetla mojej wersji)
źródło
Ponieważ nikt jeszcze o tym nie wspominał (8+ lat później): WebSocket może być kolejnym skutecznym sposobem na wykrycie zamkniętej karty. Tak długo, jak karta jest otwarta i skierowana na hosta, klient może utrzymywać aktywne połączenie WebSocket z hostem.
Zastrzeżenie: Należy pamiętać, że to rozwiązanie jest naprawdę wykonalne tylko dla projektu, jeśli WebSocket nie wymaga żadnych dodatkowych znaczących kosztów ogólnych z tego, co już robisz.
W rozsądnym czasie (np. 2 minuty) strona serwera może stwierdzić, że klient zniknął po rozłączeniu WebSocket, i wykonać dowolne pożądane działanie, takie jak usunięcie przesłanych plików tymczasowych. (W moim wyjątkowo wyspecjalizowanym przypadku moim celem było zakończenie serwera aplikacji localhost trzy sekundy po zerwaniu połączenia WebSocket i zakończeniu aktywności CGI / FastCGI - żadne inne połączenia podtrzymujące mnie nie dotyczą.)
Miałem problemy z poprawnym działaniem modułu obsługi zdarzeń onunload z sygnalizatorami (zgodnie z zaleceniami tej odpowiedzi ). Wydaje się, że zamknięcie karty nie wyzwalało sygnału nawigacyjnego, a otwarte karty wyzwoliły ją w sposób, który potencjalnie może powodować problemy. WebSocket rozwiązał problem, na który wpadałem bardziej czysto, ponieważ połączenie zamyka się mniej więcej w tym samym czasie, w którym karta zamyka się, a przełączanie stron w aplikacji po prostu otwiera nowe połączenie WebSocket dobrze w oknie opóźnienia.
źródło
JSFiddle Link
Cześć wszystkim, udało mi się uzyskać kliknięcia „Wykryj zdarzenie przeglądarki i zamknij kartę” za pomocą lokalnej pamięci przeglądarki i znacznika czasu. Mam nadzieję, że wszyscy rozwiążą swoje problemy, korzystając z tego rozwiązania.
Po moich wstępnych badaniach odkryłem, że kiedy zamykamy przeglądarkę, przeglądarka zamyka wszystkie karty jeden po drugim, aby całkowicie zamknąć przeglądarkę. Dlatego zauważyłem, że pomiędzy zamknięciem kart będzie bardzo małe opóźnienie. Tak więc uznałem to opóźnienie za główny punkt sprawdzania poprawności i mogłem osiągnąć wykrycie zdarzenia zamknięcia przeglądarki i karty.
Przetestowałem to na przeglądarce Chrome w wersji 76.0.3809.132 i stwierdziłem, że działa
:) Głosuj, jeśli moja odpowiedź była pomocna ....
źródło
źródło
here also can be string, that will be shown to the user
wMożna to sprawdzić za pomocą window.closed w module obsługi zdarzeń na zdarzeniu „rozładuj” w ten sposób, ale wymagane jest przekroczenie limitu czasu (więc wynik nie może być zagwarantowany, jeśli opóźnia się okno lub uniemożliwia zamknięcie okna):
Przykład JSFiddle (testowany na Lates Safari, FF, Chrome, Edge i IE11)
źródło
Wypróbowałem wszystkie powyższe rozwiązania, żadne z nich tak naprawdę nie działało dla mnie, szczególnie dlatego, że w moim projekcie jest kilka komponentów Telerik, które mają przycisk „Zamknij” dla okien wyskakujących i wywołuje zdarzenie „przed załadowaniem”. Ponadto selektor przycisków nie działa poprawnie, jeśli na stronie znajduje się siatka Telerik (mam na myśli przyciski w siatce). Nie mogłem więc użyć żadnej z powyższych sugestii. Wreszcie to rozwiązanie zadziałało dla mnie. Dodałem zdarzenie onUnload do znacznika body _Layout.cshtml. Coś takiego:
a następnie dodaj funkcję LogOff, aby przekierować do konta / LogOff, która jest wbudowaną metodą w Asp.Net MVC. Teraz, kiedy zamykam przeglądarkę lub kartę, następuje przekierowanie do metody LogOff, a użytkownik musi się zalogować po powrocie. Przetestowałem to w Chrome i Firefox. I to działa!
źródło
Ta funkcja wyświetla okno dialogowe potwierdzenia, jeśli zamkniesz okno lub odświeżysz stronę podczas dowolnego procesu w przeglądarce. Ta funkcja działa we wszystkich przeglądarkach. Musisz ustawić zmienną isProcess var w procesie ajax.
źródło
źródło
sendkeylog
?Jak wspomniano @jAndy, nie ma poprawnie kodu javascript do wykrywania zamykanego okna. Zacząłem od tego, co zaproponował @Syno.
Przeszedłem przez taką sytuację i pod warunkiem, że wykonasz te kroki, będziesz w stanie ją wykryć.
Przetestowałem to na Chrome 67+ i Firefox 61+.
};
źródło
resize
gdy okno jest rozmyte. Jeśli 100 razy się rozmyje, będziesz mieć 100 słuchaczy, co spowoduje spowolnienie przeglądarki.spróbuj tego, jestem pewien, że to zadziała dla ciebie.
źródło
Spróbuj tego. To będzie działać. metoda odciążania jquery jest przestarzała.
źródło