Se o javascript modificar o DOM na página A, o usuário navega para a página B e, em seguida, clica no botão voltar para voltar à página A. Todas as modificações no DOM da página A são perdidas e o usuário é apresentado com a versão que foi originalmente recuperada do servidor.
Funciona assim no stackoverflow, reddit e muitos outros sites populares. (tente adicionar um comentário de teste a esta questão, em seguida, navegue para uma página diferente e clique no botão Voltar para voltar - seu comentário "desaparecerá")
Isso faz sentido, mas alguns sites (apple.com, basecamphq.com etc) estão de alguma forma forçando o navegador a fornecer ao usuário o estado mais recente da página. (vá para http://www.apple.com/ca/search/?q=ipod , clique no link Downloads na parte superior e clique no botão Voltar - todas as atualizações de DOM serão preservadas)
de onde vem a inconsistência?
fonte
Respostas:
Uma resposta: entre outras coisas, os eventos de descarregamento fazem com que o cache de retorno / encaminhamento seja invalidado .
Alguns navegadores armazenam o estado atual de toda a página da web no chamado "bfcache" ou "cache de página". Isso permite que eles renderizem novamente a página muito rapidamente ao navegar por meio dos botões voltar e avançar e preserva o estado do DOM e todas as variáveis JavaScript. No entanto, quando uma página contém eventos onunload, esses eventos podem colocar a página em um estado não funcional e, portanto, a página não é armazenada no bfcache e deve ser recarregada (mas pode ser carregada do cache padrão) e recarregada renderizado do zero, incluindo a execução de todos os gerenciadores onload. Ao retornar a uma página através do bfcache, o DOM é mantido em seu estado anterior, sem a necessidade de disparar manipuladores onload (porque a página já está carregada).
Observe que o comportamento do bfcache é diferente do cache do navegador padrão em relação ao Cache-Control e outros cabeçalhos HTTP. Em muitos casos, os navegadores armazenam em cache uma página no bfcache mesmo que não seja armazenada no cache padrão.
O jQuery anexa automaticamente um evento de descarregamento à janela, então, infelizmente, o uso do jQuery desqualificará sua página de ser armazenada no bfcache para preservação de DOM e avanço / retrocesso rápido. [Atualização: isso foi corrigido no jQuery 1.4 para que se aplique apenas ao IE]fonte
Tenho tentado fazer com que o Chrome se comporte como o Safari, e a única maneira que descobri que funciona é definindo
Cache-control: no-store
nos cabeçalhos. Isso força o navegador a buscar novamente a página do servidor quando o usuário pressiona o botão Voltar. Não é o ideal, mas é melhor do que ver uma página desatualizada.fonte
O Facebook lembra o estado da página modificando o identificador hash no URL para solicitações de ajax. Essas alterações são registradas no histórico do navegador, portanto, quando o usuário clica no botão Voltar, o hash muda para o que era antes. Portanto, está implícito que você precisará de algum Javascript para monitorar o identificador has e reagir quando ele é alterado pelo navegador. Andreas Blixt tem um script de monitoramento de hash disponível .
fonte
Isso não tem nada a ver com o símbolo hash (#).
Se você verificar os cabeçalhos HTTP da apple, está simplesmente armazenando a página em cache.
fonte
Usar o identificador de hash / fragmento de URL é uma maneira bastante comum de conectar / lembrar o estado em um aplicativo da web que depende de atualizações Ajax e DOM.
Confira o projeto Really Simple History para algumas idéias. É possível monitorar a URL para mudanças no hash, e rsh faz isso, levando em consideração as diferenças do navegador.
fonte
Para qualquer pessoa com problemas com
Rails
e isso - seu problema não é o bfcache (pensei que fosse) - é aturbolinks
joia. Aqui está como removê-lo.Esperançosamente, isso vai poupar algum tempo e bater sua cabeça contra a parede.
fonte
O que você está procurando é algum tipo de gerenciamento de hash de URL. O # no url é apenas para o lado do cliente.
Ao alterar o estado da parte traseira com JS, você atualiza os dados no # do url.
Além disso, você adiciona algum tipo de pesquisa que monitora se o hash mudou e carrega o estado da página com base nos novos dados do hash.
Dê uma olhada neste:
http://ajaxpatterns.org/Unique_URLs
fonte