Pergunta

Eu procurei na Web sobre esta questão, mas eu não encontrei nada:

Qual é a lógica do botão de volta? O que está acontecendo quando acertar o botão Voltar em um navegador da Web?

Eu realmente gostaria de entender mais sobre isso.

Obrigado.

Foi útil?

Solução

O navegador da Web mantém uma pilha (ou lista, se você preferir) das páginas da web que você visitou nessa janela. Vamos dizer que sua home page é google.com e de lá você visitar alguns outros sites: youtube.com, yahoo.com, e CNN.com. Ao visitar o último, a lista esta aparência:

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

Quando você pressiona o botão Voltar, o navegador leva de volta para a página anterior na lista, como este:

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

Neste ponto, você pode pressionar Voltar novamente para levá-lo para youtube.com, ou você pode pressionar Avançar para colocá-lo em cnn.com novamente. Vamos dizer que você pressione uma segunda vez:

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

Se você agora ir para, digamos, abc.com, a lista muda para ficar assim:

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

Note que tanto yahoo.com e cnn.com sumiram da lista. Isso é porque você tomou uma nova rota. O navegador só mantém uma lista das páginas que você visitou para chegar onde você está agora, não uma história de todas as páginas que você já esteve. O navegador também não sabe nada sobre a estrutura do site que você está visitando, o que pode levar a um comportamento surpreendente.

Você está em um site de compras (ne.com, como um pequeno exemplo) que tem categorias e subcategorias de produtos para percorrer. O designer do site foi cuidadosamente fornecidos pão ralado perto do topo da janela para permitir que você para navegar pelas categorias. Você começa no topo da página do site, clique em Hardware e, em seguida Memória. A lista agora se parece com isso:

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

Você quer voltar para a categoria Hardware, então você usa a farinha de rosca para ir até a categoria principal em vez de usar o botão Voltar. Agora a lista navegador esta aparência:

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

De acordo com a estrutura do site, você foi para trás (um nível acima), mas para o navegador que você foi para a frente porque você clicou em um link. Toda vez que você clicar em um link ou digite um URL na barra de endereços, você está indo para a frente, tanto quanto o navegador está em causa, ou não que o link leva a uma página que você já esteve.

Finalmente, você quer voltar para a página do site principal (ne.com). Você pode usar a farinha de rosca, mas desta vez você clica no botão Back - parece óbvio que deve levá-lo até um nível, certo? Mas onde você leva?

É inicialmente confuso para muitos usuários (eu incluído, quando acontecer de eu fazer exatamente isso) que leva você "para baixo" um nível, de volta para a categoria de memória. Olhando para a lista de páginas, é fácil perceber porquê:

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

Para voltar à página principal usando apenas o botão Voltar exigiria mais duas prensas, levando-o "back" para a categoria Hardware e, finalmente, para a página principal. Parece tão óbvio para nós programadores que está acontecendo, mas surpreende o Parreira fora de utilizadores regulares o tempo todo porque eles não percebem que o navegador não sabe nada sobre a estrutura hierárquica de qualquer website que estejam diante.

Seria ótimo se navegadores deixaria designers de sites programar o botão Voltar para fazer a coisa óbvia (levá-lo até um nível), em vez de tudo o que ele faz agora?

Edit: Um comentarista perguntou se recarrega navegador da página ou simplesmente exibe-lo fora de seu cache local

.

A resposta é que depende. designers de sites podem especificar se o navegador deve armazenar em cache da página ou não. Para páginas que são definidas como não-armazenada em cache, recarrega navegador da página do servidor quando você pressiona para trás, como se fosse a primeira vez que está a visitar. Para páginas em cache, o navegador exibe-lo fora do cache, que é muito mais rápido.

Outras dicas

Eu gosto de pensar nisso como re-emissão meu último pedido. Se você executou uma GET simples, seria provavelmente voltar a mesma coisa que fez da última vez (conteúdo dinâmico menos). Se você tivesse feito um post, você vai reenviar o formulário (após confirmação) para o servidor.

A idéia básica é voltar para a última página ou divisão local lógico.

Olhando para o Gmail que você vai ver se você fizer uma pesquisa e clicar em uma mensagem, em seguida, apertar o botão de volta vai levá-lo de volta para a pesquisa que você fez.

Quando você clicar nele na maioria dos navegadores ele quer reenviar o último pedido http ou irá carregar um cache se os caches do navegador sites.

Eu acho que a maneira mais fácil de explicar isso é em pseudocódigo:

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)

A história de páginas vistas é mantido em uma pilha-como forma. Quando você "pop" as três páginas (A, B, C, por exemplo) e, em seguida, ir para uma página diferente D, você não pode chegar a B novamente por bater a frente.

Como devoloper, você deve se certificar de que a sua webapp funciona não importa como as alças do navegador o botão BACK :-) Será que ela reenviar o pedido? É o novo pedido idêntico à antiga, ou é que diferem de alguma forma? Será navegador pedir usuário para confirmar re-POST? Que elementos da página será re-solicitado eo que carregado a partir de cache? Será navegador respeitar meus cabeçalhos de controle de cache?

As respostas a essas perguntas dependem de marca, versão de um navegador de usuário e configurações. Projete-o software para que tudo isso não importa muito.

Desculpe por não resposta muito direta, mas existem algumas respostas diretas já aqui.

um navegador sempre armazenados as páginas para a sua lembrança e quando nós pressionamos o botão voltar não enviar o pedido ao servidor para a página anterior em vez disso, basta ver seu cache onde armazenadas as páginas e seguir a regra LIFO é por isso que nos dão essa página primeiro ao pressionar o botão Voltar que abriu na última

As navegador carrega a última página visualizada antes da atual, em seguida, segue qualquer redirecionamento que pode acontecer?

Eu meio que parece estar faltando o ponto da questão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top