Come funziona il pulsante Indietro in un browser web?


84

Ho cercato sul Web questa domanda ma non ho trovato nulla:

Qual è la logica del pulsante Indietro? Cosa succede quando premiamo il pulsante Indietro su un browser Web?

Mi piacerebbe davvero saperne di più su questo.

Grazie.


14
Rispedisce la richiesta o carica la pagina dalla cache locale? I cookie creati nella prima risposta vengono inviati quando si risponde? ecc.
Jimmy

Risposte:


100

Il tuo browser web mantiene una pila (o un elenco, se vuoi) delle pagine web che hai visitato in quella finestra. Supponiamo che la tua home page sia google.com e da lì visiti alcuni altri siti web: youtube.com, yahoo.com e cnn.com. Dopo aver visitato l'ultimo, l'elenco appare così:

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

Quando premi il pulsante Indietro, il browser ti riporta alla pagina precedente nell'elenco, in questo modo:

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

A questo punto puoi premere di nuovo Indietro per portarti su youtube.com, oppure puoi premere Avanti per rimetterti su cnn.com. Supponiamo che tu prema Indietro una seconda volta:

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

Se ora vai su, ad esempio, abc.com, l'elenco cambia in questo modo:

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

Nota che sia yahoo.com che cnn.com sono stati eliminati dall'elenco. Questo perché hai preso una nuova strada. Il browser mantiene solo un elenco delle pagine che hai visitato per arrivare dove sei ora, non una cronologia di ogni pagina in cui sei mai stato. Inoltre il browser non sa nulla della struttura del sito che stai visitando, il che può portare a comportamenti sorprendenti.

Sei su un sito di shopping (ne.com, come un breve esempio) che ha categorie e sottocategorie di prodotti da sfogliare. Il progettista del sito ha attentamente fornito breadcrumb nella parte superiore della finestra per consentirti di navigare tra le categorie. Si inizia dalla pagina principale del sito, si fa clic su Hardware, quindi su Memoria. L'elenco ora ha questo aspetto:

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

Vuoi tornare alla categoria Hardware, quindi usa i breadcrumb per salire alla categoria genitore invece di usare il pulsante Indietro. Ora l'elenco dei browser ha questo aspetto:

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

Secondo la struttura del sito, sei andato indietro (su di un livello), ma al browser sei andato avanti perché hai cliccato su un collegamento. Ogni volta che fai clic su un link o digiti un URL nella barra degli indirizzi, stai andando avanti per quanto riguarda il browser, indipendentemente dal fatto che quel link ti porti o meno a una pagina che hai già visitato.

Infine, vuoi tornare alla pagina principale del sito (ne.com). Potresti usare i breadcrumb, ma questa volta fai clic sul pulsante Indietro: sembra ovvio che dovrebbe portarti a un livello superiore, giusto? Ma dove ti porta?

Inizialmente è fonte di confusione per molti utenti (me compreso, quando mi capita di fare esattamente questo) che ti porti "giù" di un livello, tornando alla categoria Memoria. Guardando l'elenco delle pagine, è facile capire perché:

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

Per tornare alla pagina principale utilizzando solo il pulsante Indietro sarebbero necessarie altre due pressioni, riportandoti "indietro" alla categoria Hardware e infine alla pagina principale. Sembra così ovvio a noi programmatori cosa sta succedendo, ma sorprende continuamente gli utenti regolari perché non si rendono conto che il browser non sa nulla della struttura gerarchica di qualunque sito web si trovi.

Sarebbe fantastico se i browser permettessero ai progettisti di siti di programmare il pulsante Indietro per fare la cosa ovvia (portarti a un livello superiore) piuttosto che quello che fa ora?

Modifica: un commentatore ha chiesto se il browser ricarica la pagina o semplicemente la visualizza dalla sua cache locale.

La risposta è, dipende. I progettisti del sito possono specificare se il browser deve memorizzare nella cache la pagina o meno. Per le pagine impostate come non memorizzate nella cache, il browser ricarica la pagina dal server quando si preme Indietro, come se fosse la prima volta che la si visita. Per le pagine memorizzate nella cache, il browser lo visualizza fuori dalla cache, il che è molto più veloce.


5
Quando il browser sta cercando nella cache, controlla la data di scadenza nell'intestazione della risposta del server? Immagino che se la pagina fosse scaduta, il browser restituirà la stessa query, no? La ricezione e la pubblicazione vengono gestite allo stesso modo per quanto riguarda il pulsante Indietro? Grazie per la tua ottima risposta.
Pierre Thibault,

5
Prima domanda: sì, è corretto. Se la pagina è scaduta, il browser dovrebbe richiedere nuovamente la pagina utilizzando lo stesso URL e i dati POST. Ma per le operazioni POST, la maggior parte dei browser chiede all'utente se desidera inviarlo nuovamente. La mia ipotesi è che il nuovo invio dei dati POST potrebbe potenzialmente comportare registrazioni duplicate, transazioni duplicate, ecc. Spetta al progettista del sito impedire che ciò accada.
Barry Brown,

Si, ma in caso di POST, penso che il browser chiederà solo in caso di POST scaduto. Ho ragione? Perché quando stavo sviluppando con ASP.net il pulsante Indietro stava postando di nuovo sul server senza chiedere.
Pierre Thibault,

Probabilmente dipende dal browser. Il mio browser (Safari) chiede sempre, almeno penso che lo chieda sempre.
Barry Brown,

Stavo usando Safari. Non sempre chiede. Deve seguire la logica che ho descritto.
Pierre Thibault,

5

Mi piace pensare che sia una riemissione della mia ultima richiesta. Se hai eseguito un semplice GET, probabilmente restituirà la stessa cosa dell'ultima volta (meno il contenuto dinamico). Se hai eseguito un POST, invierai nuovamente il modulo (dopo la conferma) al server.


2

L'idea di base è tornare all'ultima pagina o divisione logica del sito.

Guardando Gmail vedrai se esegui una ricerca e fai clic su un messaggio, quindi premi il pulsante Indietro ti riporterà alla ricerca che hai fatto.

Quando fai clic su di esso nella maggior parte dei browser, invierà nuovamente l'ultima richiesta http o caricherà una cache se il browser memorizza nella cache i siti.


Quando il browser utilizza la cache e quando invia nuovamente una richiesta?
Pierre Thibault,

Dipende dal browser e da cosa è stato fatto fino a quel momento. È possibile impostare la maggior parte dei browser per non memorizzare nella cache e quindi verranno sempre ricaricati. C'è un metatag HTML per la memorizzazione nella cache, ma il rispetto che spetta al browser.
BobBrez

2

Penso che il modo più semplice per spiegare questo sia in pseudocodice:

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)

1

Una cronologia delle pagine visualizzate viene conservata in una forma simile a una pila. Quando "apri" le prime tre pagine (A, B, C, per esempio) e poi vai a una pagina diversa D, non puoi tornare a B premendo in avanti.


0

In qualità di devoloper, dovresti assicurarti che la tua webapp funzioni indipendentemente da come il browser gestisce il pulsante Indietro :-) Rispedisce la richiesta? La nuova richiesta è identica alla vecchia o differisce in qualche modo? Il browser chiederà all'utente di confermare il nuovo POST? Quali elementi della pagina verranno nuovamente richiesti e quali caricati dalla cache? Il browser rispetterà le mie intestazioni di controllo della cache?

Le risposte a queste domande dipendono dalla marca, dalla versione di un browser e dalle impostazioni dell'utente. Progetta il tuo software in modo che tutto questo non importi più di tanto.

Ci scusiamo per la risposta non molto diretta, ma ci sono già alcune risposte dirette qui.


Ahimè, tenendo conto di tutti i possibili effetti del pulsante Indietro qualcosa che fa impazzire la maggior parte degli sviluppatori, me compreso.
Louise

0

un browser ha sempre memorizzato le pagine per la sua memorizzazione e quando premiamo il pulsante indietro non invia la richiesta al server per la pagina precedente invece vede solo la sua cache dove ha memorizzato le pagine e segue la regola LIFO per questo motivo dacci quella pagina prima premendo il pulsante indietro che abbiamo aperto nell'ultimo


2
No, non funziona lascialo! Se la cache non è più valida, invia una richiesta al server per ottenere di nuovo la pagina.
Pierre Thibault

-1

Il browser carica l'ultima pagina visualizzata prima di quella corrente, quindi segue eventuali reindirizzamenti che potrebbero verificarsi?

Mi sembra di perdere il punto della domanda.


Probabilmente vogliono disabilitare il pulsante Indietro o impedirne l'uso. In bocca al lupo.
John Hoven,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.