Jak działa przycisk Wstecz w przeglądarce internetowej?

84

Szukałem w sieci tego pytania, ale nic nie znalazłem:

Jaka jest logika przycisku Wstecz? Co się dzieje, gdy klikamy przycisk Wstecz w przeglądarce internetowej?

Naprawdę chciałbym dowiedzieć się więcej na ten temat.

Dziękuję Ci.

Pierre Thibault
źródło
14
Czy ponownie wysyła żądanie, czy ładuje stronę z lokalnej pamięci podręcznej? Czy pliki cookie, które zostały utworzone w pierwszej odpowiedzi, są wysyłane, gdy wrócisz? itd.
Jimmy

Odpowiedzi:

99

Twoja przeglądarka internetowa przechowuje stos (lub listę, jeśli wolisz) stron internetowych, które odwiedziłeś w tym oknie. Załóżmy, że Twoja strona główna to google.com i stamtąd odwiedzasz kilka innych witryn: youtube.com, yahoo.com i cnn.com. Po odwiedzeniu ostatniego lista wygląda następująco:

google.com -> youtube.com -> yahoo.com -> cnn.com
                                            ^
                                            |
                                       current page

Po naciśnięciu przycisku Wstecz przeglądarka przeniesie Cię z powrotem do poprzedniej strony na liście, na przykład:

google.com -> youtube.com -> yahoo.com -> cnn.com
                                ^
                                |
                           current page

W tym momencie możesz ponownie nacisnąć przycisk Wstecz, aby przejść do youtube.com, lub nacisnąć przycisk Dalej, aby ponownie przejść do witryny cnn.com. Powiedzmy, że naciśniesz Wstecz po raz drugi:

google.com -> youtube.com -> yahoo.com -> cnn.com
                   ^
                   |
              current page

Jeśli teraz przejdziesz, powiedzmy, abc.com, lista zmieni się tak:

google.com -> youtube.com -> abc.com
                               ^
                               |
                          current page

Zwróć uwagę, że zarówno yahoo.com, jak i cnn.com zniknęły z listy. To dlatego, że wybrałeś nową trasę. Przeglądarka przechowuje tylko listę stron, które odwiedziłeś, aby dostać się tam, gdzie jesteś, a nie historię wszystkich stron, na których kiedykolwiek byłeś. Przeglądarka również nie wie nic o strukturze odwiedzanej witryny, co może prowadzić do zaskakujących zachowań.

Jesteś w witrynie zakupów (na przykład ne.com), która zawiera kategorie i podkategorie produktów do przeglądania. Projektant witryna została starannie pod warunkiem, bułkę tartą w górnej części okna, aby umożliwić poruszanie się kategorie. Zaczynasz na górnej stronie witryny, kliknij Sprzęt, a następnie Pamięć. Lista wygląda teraz następująco:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem
                                           ^
                                           |
                                      current page

Chcesz wrócić do kategorii Sprzęt, więc możesz skorzystać z menu nawigacyjnego, aby przejść do kategorii nadrzędnej, zamiast używać przycisku Wstecz. Teraz lista przeglądarki wygląda następująco:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
                                                          ^
                                                          |
                                                     current page

Zgodnie ze strukturą witryny przeszedłeś wstecz (o jeden poziom w górę), ale do przeglądarki przeszedłeś do przodu, ponieważ kliknąłeś łącze. Za każdym razem, gdy klikniesz łącze lub wpiszesz adres URL w pasku adresu, przechodzisz dalej, jeśli chodzi o przeglądarkę, niezależnie od tego, czy łącze prowadzi do strony, na której już byłeś.

Na koniec chcesz wrócić do strony głównej witryny (ne.com). Możesz użyć bułki tartej, ale tym razem klikniesz przycisk Wstecz - wydaje się oczywiste, że powinno to zająć jeden poziom wyżej, prawda? Ale dokąd cię to prowadzi?

Początkowo dla wielu użytkowników (łącznie ze mną, kiedy robię dokładnie to), jest to mylące, że przenosi cię „w dół” o poziom, z powrotem do kategorii Pamięć. Patrząc na listę stron, łatwo zrozumieć, dlaczego:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
                                            ^
                                            |
                                       current page

Powrót do strony głównej przy użyciu tylko przycisku Wstecz wymagałby dwóch kolejnych naciśnięć, przenoszących „z powrotem” do kategorii Sprzęt i na koniec do strony głównej. Nam, programistom, wydaje się oczywiste, co się dzieje, ale przez cały czas zaskakuje to zwykłych użytkowników, ponieważ nie zdają sobie sprawy, że przeglądarka nie wie nic o hierarchicznej strukturze strony, na której się znajdują.

Czy byłoby wspaniale, gdyby przeglądarki pozwoliły projektantom witryn zaprogramować przycisk Wstecz, aby zrobić oczywistą rzecz (podnieść poziom), a nie cokolwiek robi teraz?

Edycja: komentator zapytał, czy przeglądarka ponownie ładuje stronę, czy po prostu wyświetla ją z lokalnej pamięci podręcznej.

Odpowiedź brzmi: to zależy. Projektanci serwisu mogą określić, czy przeglądarka ma buforować stronę, czy nie. W przypadku stron, które są ustawione jako niebuforowane, przeglądarka ponownie ładuje stronę z serwera po naciśnięciu przycisku Wstecz, tak jakby była to pierwsza wizyta na niej. W przypadku stron w pamięci podręcznej przeglądarka wyświetla je poza pamięcią podręczną, co jest znacznie szybsze.

Barry Brown
źródło
5
Kiedy przeglądarka szuka w pamięci podręcznej, czy sprawdza datę ważności w nagłówku odpowiedzi serwera? Myślę, że jeśli strona wygasła, przeglądarka odeśle to samo zapytanie, prawda? Czy pobieranie i wysyłanie są obsługiwane w ten sam sposób w przypadku przycisku Wstecz? Dziękuję za wspaniałą odpowiedź.
Pierre Thibault
5
Pierwsze pytanie: tak, zgadza się. Jeśli strona wygasła, przeglądarka powinna ponownie zażądać strony, używając tego samego adresu URL i danych POST. Ale w przypadku operacji POST większość przeglądarek pyta użytkownika, czy chce go ponownie wysłać. Przypuszczam, że ponowne wysłanie danych POST może potencjalnie skutkować zduplikowanymi publikacjami, zduplikowanymi transakcjami itp. To projektant witryny musi temu zapobiec.
Barry Brown
Tak, ale w przypadku POST, myślę, że przeglądarka zapyta tylko w przypadku, gdy POST wygasł. Czy mam rację? Ponieważ kiedy tworzyłem program w ASP.net, przycisk Wstecz ponownie wysyłał posty na serwer bez pytania.
Pierre Thibault
Prawdopodobnie zależy od przeglądarki. Moja przeglądarka (Safari) zawsze pyta - przynajmniej myślę, że zawsze pyta.
Barry Brown
Używałem Safari. Nie zawsze pyta. To musi być zgodne z logiką, którą opisałem.
Pierre Thibault
5

Lubię myśleć o tym jako o ponownym wysłaniu mojej ostatniej prośby. Jeśli wykonałeś proste GET, prawdopodobnie zwróci to samo, co zrobiłeś ostatnim razem (bez zawartości dynamicznej). Jeśli wykonałeś POST, zamierzasz ponownie przesłać formularz (po potwierdzeniu) na serwer.

John Hoven
źródło
2

Podstawowym pomysłem jest powrót do ostatniej strony lub logicznego podziału serwisu.

Patrząc na Gmaila, zobaczysz, czy wyszukasz i klikniesz wiadomość, a następnie klikniesz przycisk Wstecz, a zostaniesz przeniesiony z powrotem do wyszukiwania, które zrobiłeś.

Gdy klikniesz go w większości przeglądarek, wyśle ​​ponownie ostatnie żądanie http lub załaduje pamięć podręczną, jeśli przeglądarka buforuje witryny.

BobBrez
źródło
Kiedy przeglądarka korzysta z pamięci podręcznej, a kiedy ponownie wysyła żądanie?
Pierre Thibault
To zależy od przeglądarki i tego, co zostało zrobione do tego momentu. Możesz ustawić większość przeglądarek tak, aby nie buforowały, więc zawsze będą ładować się ponownie. Istnieje metatag HTML do buforowania, ale przestrzeganie tego zależy od przeglądarki.
BobBrez
2

Myślę, że najłatwiej to wyjaśnić za pomocą pseudokodu:

class Page:
    String url, ...
    Page previous, next # implements a doubly-linked list

class History:
    Page current # current page

    void back():
        if current.previous == null:
            return
        current = current.previous
        refresh()

    void forward():
        if current.next == null:
            return
        current = current.next
        refresh()

    void loadPage(Page newPage):
        newPage.previous = current
        current.next = newPage # remove all the future pages
        current = current.next
        display(current)
Imagista
źródło
1

Historia przeglądanych stron jest przechowywana w formie stosu. Kiedy „wyskakujesz” z trzech pierwszych stron (na przykład A, B, C), a następnie przechodzisz do innej strony D, nie możesz ponownie dostać się do B, naciskając do przodu.

kajaco
źródło
0

Jako devoloper powinieneś upewnić się, że twoja aplikacja internetowa działa bez względu na to, jak przeglądarka obsługuje przycisk Wstecz :-) Czy ponownie wysyła żądanie? Czy nowe żądanie jest identyczne ze starym, czy też w jakikolwiek sposób się różni? Czy przeglądarka poprosi użytkownika o potwierdzenie ponownego POST? Jakie elementy strony będą ponownie zażądane, a które ładowane z pamięci podręcznej? Czy przeglądarka będzie przestrzegać moich nagłówków kontroli pamięci podręcznej?

Odpowiedzi na te pytania zależą od marki, wersji przeglądarki i ustawień użytkownika. Zaprojektuj oprogramowanie tak, aby to wszystko nie miało większego znaczenia.

Przepraszam za niezbyt bezpośrednią odpowiedź, ale jest tu już kilka prostych odpowiedzi.

Ilya Birman
źródło
Niestety, biorąc pod uwagę wszystkie możliwe efekty przycisku Wstecz, coś, co doprowadza większość programistów do szaleństwa, w tym mnie.
Louise
0

przeglądarka zawsze zapisywała strony do zapamiętania, a kiedy klikamy przycisk Wstecz, nie wysyła żądania do serwera dla poprzedniej strony, zamiast tego widzi tylko swoją pamięć podręczną, w której zapisała strony i postępuje zgodnie z regułą LIFO, dlatego daj nam tę stronę jako pierwszą, naciskając przycisk Wstecz, który otworzyliśmy w ostatnim

Dileep kumar
źródło
2
Nie, to nie działa, niech tak! Jeśli pamięć podręczna nie jest już ważna, wysyła żądanie z powrotem do serwera, aby ponownie pobrać stronę.
Pierre Thibault
-1

Przeglądarka ładuje ostatnio przeglądaną stronę przed bieżącą, a następnie śledzi wszelkie przekierowania, które mogą się zdarzyć?

Wydaje mi się, że nie rozumiem sedna pytania.

code_burgar
źródło
Prawdopodobnie chcą wyłączyć przycisk Wstecz - lub uniemożliwić jego użycie. Powodzenia.
John Hoven