Lepszym sposobem, aby wiedzieć, że strona została ponownie załadowana, jest użycie obiektu nawigatora obsługiwanego przez większość współczesnych przeglądarek.
//check for Navigation Timing API supportif(window.performance){
console.info("window.performance works fine on this browser");}if(performance.navigation.type ==1){
console.info("This page is reloaded");}else{
console.info("This page is not reloaded");}
dzięki kolego, to dokładne rozwiązanie, aby wykryć, że strona została ponownie załadowana z kliknięcia / odświeżenia prawym przyciskiem myszy z przeglądarki lub przeładowana przez adres URL.
Uwaga: Chrom zmienił ostatnio to zachowanie. Gdy użytkownik kliknie bieżący pasek adresu i naciśnie Enter, wartość performance.navigation.type będzie wynosić 1, co powinno wynosić 0. Testowałem w wersji 56. Nie jestem pewien, dlaczego.
Ich sposób działania jest zgodny z oczekiwaniami, każda interakcja ze stroną, która wymusza nowy stan nawigacji na tej samej stronie, jest uważana za odświeżenie. Dlatego w zależności od kodu jest to bardzo przydatne, aby zarejestrować się za każdym razem, gdy strona jest odświeżana, ponownie ładowana lub jakakolwiek interakcja ajax. Mogę dać temu wiele zastosowań w zakresie funkcjonalności i analiz.
performance.navigation.type == performance.navigation.TYPE_RELOADjest łatwiejszy do odczytania zamiast == 1. Ponadto, jeśli sprawdzisz performance.navigation, zauważysz, że istnieją 4 różne typy nawigacji, takie jak TYPE_BACK_FORWARD:TYPE_NAVIGATE
Drugim krokiem jest ustawienie sessionStoragepewnej wartości (na przykład true):
sessionStorage.setItem("is_reloaded",true);
Wartości sesji są przechowywane do momentu zamknięcia strony, więc będzie działać tylko wtedy, gdy strona zostanie ponownie załadowana w nowej karcie z witryną. Możesz także zachować liczbę przeładowań w ten sam sposób.
Dwie rzeczy, o których należy pamiętać: 1). Wartości ciągów można przechowywać tylko w pamięci sesji i pamięci lokalnej. Dlatego truejest konwertowany na "true". 2). Pamięć sesji jest utrzymywana, dopóki użytkownik nie zamknie okna przeglądarki, więc nie można odróżnić przeładowywania strony od opuszczania witryny i powrotu do niej w tej samej sesji przeglądarki.
Właściwość typu tylko do odczytu zwraca ciąg znaków reprezentujący typ nawigacji. Wartość musi być jedną z następujących czynności:
nawiguj - nawigacja rozpoczęła się od kliknięcia linku, wpisania adresu URL w pasku adresu przeglądarki, przesłania formularza lub zainicjowania operacji skryptu innej niż przeładowanie i powrót do poprzedniej wersji, jak podano poniżej.
reload - Nawigacja odbywa się poprzez operację przeładowania przeglądarki lub location.reload().
back_forward - Nawigacja odbywa się poprzez przeglądanie historii przeglądarki.
Przechowuj plik cookie przy pierwszej wizycie na stronie. Po odświeżeniu sprawdź, czy plik cookie istnieje, a jeśli tak, powiadom alert.
function checkFirstVisit(){if(document.cookie.indexOf('mycookie')==-1){// cookie doesn't exist, create it now
document.cookie ='mycookie=1';}else{// not first visit, so alert
alert('You refreshed!');}}
Jak @ Rob2211 mówi, że to sprawdza tylko, czy strona została odwiedzona i może dać fałszywy wynik pozytywny, o ile strona jest ponownie odwiedzana, gdy plik cookie jest nadal aktywny. Nie używaj tego do sprawdzania odświeżenia.
Znalazłem tu trochę informacji Odśwież stronę z wykrywaniem Javascript . Jego pierwszą rekomendacją jest użycie ukrytych pól, które zwykle są przechowywane przez odświeżanie strony.
function checkRefresh(){if(document.refreshForm.visited.value ==""){// This is a fresh page load
document.refreshForm.visited.value ="1";// You may want to add code here special for// fresh page loads}else{// This is a page refresh// Insert code here representing what to do on// a refresh}}
Uwaga dodatkowa: pierwsza metoda wymieniona na tej stronie zakończy się niepowodzeniem, ponieważ kod jest wykonywany przed analizą DOM. Przeniesienie <script>elementu na dół działałoby - ale nadal nie jest to gwarantowane rozwiązanie (podobnie jak metoda cookie).
Napisałem tę funkcję, aby sprawdzić obie metody jednocześnie za pomocą starej window.performance.navigationi nowej performance.getEntriesByType("navigation"):
function navigationType(){var result;var p;if(window.performance.navigation){
result=window.performance.navigation;if(result==255){result=4}// 4 is my invention!}if(window.performance.getEntriesByType("navigation")){
p=window.performance.getEntriesByType("navigation")[0].type;if(p=='navigate'){result=0}if(p=='reload'){result=1}if(p=='back_forward'){result=2}if(p=='prerender'){result=3}//3 is my invention!}return result;}
Opis wyniku:
0: kliknięcie linku, wprowadzenie adresu URL w pasku adresu przeglądarki, przesłanie formularza, kliknięcie zakładki, zainicjowanie za pomocą operacji skryptu.
1: Kliknięcie przycisku Załaduj ponownie lub użycieLocation.reload()
2: Praca z historią przeglądania (Bakc i Forward).
3: działanie prerenderujące, takie jak<link rel="prerender" href="https://stackoverflow.com//example.com/next-page.html">
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.