Chcę użyć JavaScript, aby zobaczyć, czy istnieje historia, czy nie, mam na myśli, czy przycisk Wstecz jest dostępny w przeglądarce, czy nie.
javascript
Ryan
źródło
źródło
Odpowiedzi:
Krótka odpowiedź: nie możesz.
Technicznie istnieje dokładny sposób, którym byłoby sprawdzenie nieruchomości:
Jednak to nie zadziała. Problem polega na tym, że w większości przeglądarek jest to uważane za naruszenie bezpieczeństwa i zwykle zwraca wartość undefined .
Jest to właściwość, którą sugerowali inni ...
Jednak długość nie działa całkowicie, ponieważ nie wskazuje, w którym miejscu historii jesteś. Ponadto nie zawsze zaczyna się od tego samego numeru. Na przykład przeglądarka, która nie ma strony docelowej, zaczyna się od 0, a inna przeglądarka, która korzysta ze strony docelowej, zaczyna się od 1.
W większości przypadków dodawane jest łącze, które wywołuje:
lub
i oczekuje się, że jeśli nie możesz wrócić, kliknięcie linku nic nie da.
źródło
Jest inny sposób sprawdzenia - sprawdź stronę odsyłającą. Pierwsza strona zwykle będzie miała pustą stronę odsyłającą ...
źródło
Mój kod pozwala przeglądarce cofnąć się o jedną stronę, a jeśli to się nie powiedzie, ładuje zastępczy adres URL. Wykrywa również zmiany hashtagów.
Gdy przycisk Wstecz nie był dostępny, zastępczy adres URL zostanie załadowany po 500 ms, więc przeglądarka ma wystarczająco dużo czasu, aby załadować poprzednią stronę. Wczytanie zastępczego adresu URL zaraz po
window.history.go(-1);
tym spowodowałoby, że przeglądarka użyłaby zastępczego adresu URL, ponieważ skrypt js jeszcze się nie zatrzymał.źródło
chrome://newtab
i dzięki temu możesz cofnąć się do historii.Oto jak to zrobiłem.
Użyłem zdarzenie „beforeunload” ustawić wartość logiczną. Następnie ustawiłem limit czasu, aby sprawdzić, czy zadziałał komunikat „beforeunload”.
Wydaje się działać w głównych przeglądarkach (do tej pory testowane FF, Chrome, IE11).
źródło
window.location.href = fallback
zwindow.close()
i działa zbyt.W moich projektach używam fragmentu kodu:
Do Twojej wiadomości: Używam History.js do zarządzania historią przeglądarki.
Po co porównywać długość historii z liczbą 2?
Ponieważ strona początkowa Chrome jest liczona jako pierwsza pozycja w historii przeglądarki.
Możliwości
history.length
i zachowania użytkownika jest kilka:history.length = 2
i chcemy wyłączyćback()
w tym przypadku, ponieważ użytkownik przejdzie do pustej zakładki.history.length = 1
i znowu chcemy wyłączyćback()
metodę.history.length > 2
a terazback()
można włączyć.Uwaga: pomijam przypadek, gdy użytkownik wyląduje na bieżącej stronie po kliknięciu linku z zewnętrznej strony bez
target="_blank"
.Uwaga 2:
document.referrer
jest pusta, gdy otwierasz stronę internetową, wpisując jej adres, a także gdy strona używa Ajax do ładowania podstron, więc przestałem sprawdzać tę wartość w pierwszym przypadku.źródło
wydaje się, że to działa:
Wywołaj history.back (), a następnie window.close (). Jeśli przeglądarka jest w stanie wrócić do historii, nie będzie w stanie przejść do następnego zestawienia. Jeśli nie może się cofnąć, zamknie okno.
Należy jednak pamiętać, że jeśli strona została otwarta przez wpisanie adresu URL, firefox nie pozwoli skryptowi na zamknięcie okna.
źródło
window.close()
jest uważany za zagrożenie bezpieczeństwa przez wiele nowoczesnych przeglądarek. Niektórzy po prostu nie pozwolą ci tego zrobić.Uważaj,
window.history.length
ponieważ zawiera również wpisy dlawindow.history.forward()
Możesz więc mieć może
window.history.length
więcej niż 1 wpisy, ale bez wpisów historii. Oznacza to, że nic się nie dzieje, gdy strzelaszwindow.history.back()
źródło
Nie możesz bezpośrednio sprawdzić, czy przycisk Wstecz jest użyteczny. Możesz na nie spojrzeć
history.length>0
, ale będzie to prawdą, jeśli przed bieżącą stroną są również strony. Możesz mieć pewność, że przycisk Wstecz jest bezużyteczny tylko wtedy, gdyhistory.length===0
.Jeśli to nie wystarczy, prawie wszystko, co możesz zrobić, to zadzwonić,
history.back()
a jeśli strona jest nadal ładowana, przycisk Wstecz jest niedostępny! Oczywiście oznacza to, że jeśli przycisk Wstecz jest dostępny, właśnie opuściłeś stronę. Nie możesz anulować nawigacji w programieonunload
, więc wszystko, co możesz zrobić, aby zatrzymać faktycznie dzieje się z powrotem, to zwrócić coś zonbeforeunload
, co spowoduje pojawienie się dużego irytującego monitu. To nie jest tego warte.W rzeczywistości robienie czegokolwiek z historią to naprawdę zły pomysł. Nawigacja w historii dotyczy przeglądarki Chrome, a nie stron internetowych. Dodawanie linków „wróć” zazwyczaj powoduje więcej dezorientacji użytkowników, niż jest to warte.
źródło
1
! To0
był żart, myślałem, że przeglądarki zawsze będą reagować z1
lub więcej. Okazuje się, że Opera i IE myślą inaczej - dobry chwyt.history.length
jest bezużyteczny, ponieważ nie pokazuje, czy użytkownik może cofnąć się w historii. Również różne przeglądarki używają początkowych wartości 0 lub 1 - zależy to od przeglądarki.Działającym rozwiązaniem jest użycie
$(window).on('beforeunload'
zdarzenia, ale nie jestem pewien, czy zadziała, jeśli strona jest ładowana przez Ajax i używa pushState do zmiany historii okna.Więc użyłem następnego rozwiązania:
źródło
Wymyśliłem następujące podejście. Wykorzystuje zdarzenie onbeforeunload do wykrywania, czy przeglądarka zaczyna opuszczać stronę, czy nie. Jeśli nie nastąpi to w określonym przedziale czasu, po prostu przekieruje do rozwiązania zastępczego.
Możesz wywołać tę funkcję za pomocą
goBack("fallback.example.org")
.źródło
windows.onbeforeunload
na detektor zdarzeń,window.addEventListener("beforeunload", function (event) { useFallback = false; });
więc nie nadpisuje window.onbeforeunload.Opierając się na odpowiedzi tu i tutaj . Myślę, że bardziej rozstrzygającą odpowiedzią jest po prostu sprawdzenie, czy jest to nowa strona w nowej karcie.
Jeśli historia strony jest więcej niż jedna, możemy wrócić do strony poprzedniej do strony bieżącej. Jeśli nie, karta jest nowo otwartą kartą i musimy utworzyć nową kartę.
W przeciwieństwie do odpowiedzi, do których prowadzą linki, nie sprawdzamy, czy
referrer
nowa karta nadal będzie miała odsyłacz.źródło
Istnieje inne prawie idealne rozwiązanie, zaczerpnięte z innej odpowiedzi SO :
Ktoś zgłosił, że nie działa podczas używania,
target="_blank"
ale wydaje mi się, że działa u mnie na Chrome.źródło
przeglądarka ma przycisk Wstecz i Dalej. Znajduję rozwiązanie na to pytanie. ale wpłynie to na działanie przeglądarki i spowoduje błąd w niektórych przeglądarkach.
Działa to tak: jeśli przeglądarka otworzy nowy adres URL, który nigdy się nie otwierał, długość history.length wzrośnie.
więc możesz zmienić haszysz
aby uzyskać nigdy nie wyświetlany adres URL, wówczas history.length otrzyma prawdziwą długość.
ale nie zawsze to działa dobrze i nie wiem dlaczego, zwłaszcza gdy szybko przeskakuje adres URL.
źródło
Próbowałem znaleźć rozwiązanie i to jest najlepsze, jakie mogłem dostać (ale działa świetnie i jest to najłatwiejsze rozwiązanie, jakie znalazłem nawet tutaj).
W moim przypadku chciałem wrócić do historii za pomocą przycisku Wstecz, ale jeśli pierwsza strona, którą otworzył użytkownik, była podstroną mojej aplikacji, wróciłby do strony głównej.
Rozwiązaniem było to, że gdy tylko aplikacja zostanie załadowana, właśnie zmieniłem stan historii:
W ten sposób muszę tylko sprawdzić
history.state.root
przed powrotem. Jeśli tak, zastępuję historię:źródło
źródło
history.back()
jestundefined
tylko na pustej stronie kartyRozwiązanie
Wyjaśnienie
window.location.pathname
poda aktualny identyfikator URI. Na przykładhttps://domain/question/1234/i-have-a-problem
da/question/1234/i-have-a-problem
. Zobacz dokumentację o window.location, aby uzyskać więcej informacji.Następnie wywołanie
split()
dostarczy nam wszystkie fragmenty tego identyfikatora URI. więc jeśli weźmiemy nasz poprzedni URI, będziemy mieć coś takiego["", "question", "1234", "i-have-a-problem"]
. Zobacz dokumentację o String.prototype.split (), aby uzyskać więcej informacji.Wywołanie
filter()
jest tutaj, aby odfiltrować pusty ciąg wygenerowany przez lewy ukośnik. Zasadniczo zwróci tylko fragment URI, który ma długość większą niż 1 (niepusty ciąg). Więc mielibyśmy coś takiego["question", "1234", "i-have-a-question"]
. Można to napisać tak:Zobacz dokumentację o Array.prototype.filter () i przypisaniu Destrukturyzacja, aby uzyskać więcej informacji.
Teraz, jeśli użytkownik spróbuje wrócić, będąc włączony
https://domain/
, nie uruchomimy instrukcji if, a więc nie uruchomimywindow.history.back()
metody, więc użytkownik pozostanie w naszej witrynie. Ten adres URL będzie odpowiednikiem tego,[]
który ma długość0
i0 > 0
jest fałszywy. Dlatego cicho zawodzi. Oczywiście, jeśli chcesz, możesz coś zarejestrować lub wykonać inną akcję.Ograniczenia
Oczywiście to rozwiązanie nie zadziała, jeśli przeglądarka nie obsługuje History API . Przed użyciem tego rozwiązania zapoznaj się z dokumentacją, aby dowiedzieć się więcej na ten temat.
źródło
Nie jestem pewien, czy to działa i jest całkowicie nieprzetestowane, ale spróbuj tego:
I gdzieś w HTML:
EDYTOWAĆ:
Możesz również sprawdzić, jakie przeglądarki obsługują funkcję wsteczną (myślę, że wszystkie tak robią) i użyć standardowego obiektu wykrywania przeglądarki JavaScript, który został znaleziony i dokładnie opisany na tej stronie . Następnie możesz mieć 2 różne strony: jedną dla „dobrych przeglądarek” zgodną z przyciskiem Wstecz i jedną dla „złych przeglądarek” z poleceniem zaktualizowania przeglądarki
źródło
history.back
jest funkcją. Chcesz sprawdzić,history.length > 0
czy to wróci zhistory.back()
[]
na NodeList nie ma sensu i nie można przypisać ciągu do procedury obsługi zdarzeń.Sprawdź, czy
window.history.length
jest równe 0.źródło