Esta questão é semelhante a Rastrear quando o usuário pressiona o botão Voltar no navegador , mas não é o mesmo ... Tenho uma solução e a estou postando aqui para referência e feedback. Se alguém tiver opções melhores, sou todo ouvidos!
A situação é que tenho uma página com uma "edição no local", a la flickr. Ou seja, há um DIV "clique aqui para adicionar uma descrição", que quando clicado se transforma em uma TEXTAREA com os botões Salvar e Cancelar. Clicar em Salvar envia os dados para o servidor para atualizar o banco de dados e coloca a nova descrição no DIV no lugar de TEXTAREA. Se a página for atualizada, a nova descrição será exibida no banco de dados com uma opção "clique para editar". Coisas razoavelmente normais da Web 2.0 atualmente.
O problema é que se:
- a página é carregada sem a descrição
- uma descrição é adicionada pelo usuário
- a página é navegada para fora clicando em um link
- o usuário clica no botão Voltar
Então, o que é exibido (do cache do navegador) é a versão da página sem o DIV modificado dinamicamente contendo a nova descrição.
Este é um problema bastante grande, pois o usuário presume que sua atualização foi perdida e não necessariamente entenderá que precisa atualizar a página para ver as mudanças.
Portanto, a pergunta é: como você pode sinalizar uma página como modificada após ser carregada e, em seguida, detectar quando o usuário "volta para ela" e forçar uma atualização nessa situação?
fonte
Respostas:
Use um formulário oculto. Os dados do formulário são preservados (normalmente) nos navegadores quando você recarrega ou clica no botão Voltar para retornar a uma página. O seguinte vai para sua página (provavelmente perto do final):
No seu javascript, você precisará do seguinte:
O js que fareja o formulário deve ser executado depois que o html é totalmente analisado, mas você pode colocar o formulário e o js embutidos no topo da página (segundo js) se a latência do usuário for uma preocupação séria.
fonte
Aqui está uma solução moderna muito fácil para esse velho problema.
window.performance é atualmente suportado por todos os principais navegadores.
fonte
window.performance && window.performance.navigation.type
vez de apenaswindow.performance.navigation.TYPE_BACK_FORWARD
?).window.performance.navigation.TYPE_BACK_FORWARD
é uma constante que é sempre igual a 2. Portanto, é usada apenas para comparação.performance.navigation
está obsoleto e é sugerido usar developer.mozilla.org/en-US/docs/Web/API/…2
para cliques no botão Voltar. Até a v70, ele retornava incorretamente1
.Este artigo explica isso. Veja o código abaixo: http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/
fonte
event.persisted
=false
, mesmo ao pressionar o botão Voltar. Você deve usarwindow.performance.navigation
ou PerformanceNavigationTiming para Chrome.Para navegadores modernos, este parece ser o caminho certo agora:
Ainda é "Experimental" em janeiro de 2020, mas parece ter um bom suporte.
https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming
fonte
Conforme mencionado acima, eu encontrei uma solução e a estou postando aqui para referência e feedback.
O primeiro estágio da solução é adicionar o seguinte à página:
O conteúdo de
fresh.html
não é importante, então o seguinte deve ser suficiente:Quando o código do lado do cliente atualiza a página, ele precisa sinalizar a modificação da seguinte maneira:
stale.html
faz todo o trabalho: Quando é carregado, ele chamará areload_stale_page
função que atualizará a página se necessário. Na primeira vez que é carregado (ou seja, após a modificação ser feita, areload_stale_page
função não fará nada.)Pelo meu teste (mínimo) neste estágio, isso parece funcionar como desejado. Eu esqueci alguma coisa?
fonte
Você pode resolvê-lo usando o evento onbeforeunload :
Ter uma função de gerenciador de eventos vazio onbeforeunload significa que a página será reconstruída toda vez que for acessada. Javascripts serão executados novamente, scripts do lado do servidor serão executados novamente, a página será construída como se o usuário estivesse acessando-a pela primeira vez, mesmo se o usuário acessou a página apenas pressionando o botão Voltar ou Avançar .
Aqui está o código completo de um exemplo:
Experimente, navegue para fora desta página e volte usando os botões "Voltar" ou "Avançar" em seu navegador.
Funciona bem no IE, FF e Chrome.
Claro que você pode fazer o que quiser dentro da função myfun .
Mais informações: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
fonte
Você pode usar localStorage ou sessionStorage ( http://www.w3schools.com/html/html5_webstorage.asp ) para definir um sinalizador (em vez de usar um formulário oculto).
fonte
Usando esta página, especialmente incorporando o comentário de @sajith sobre a resposta de @Nick White e esta página: http://www.mrc-productivity.com/techblog/?p=1235
fonte
Aqui está uma versão do jQuery. Já tive a necessidade de usá-lo algumas vezes devido à maneira como o Safari para desktop / celular lida com o cache quando um usuário pressiona o botão Voltar.
fonte
Eu encontrei um problema semelhante hoje e resolvi com localStorage (aqui com um pouco de jQuery):
Si basicamente:
Na página 1, quando o usuário envia o formulário, definimos um valor "etapas" em localStorage para indicar a etapa que o usuário realizou. Ao mesmo tempo, lançamos uma função com timeout que irá verificar se este valor foi alterado (por exemplo, 10 vezes / segundo).
Na página 2, alteramos imediatamente o referido valor.
Portanto, se o usuário usar o botão Voltar e o navegador restaurar a página 1 no estado exato em que a deixamos, a função checkSteps ainda está em execução e é capaz de detectar que o valor em localStorage foi alterado (e pode tomar a ação apropriada ) Uma vez que essa verificação tenha cumprido seu propósito, não há necessidade de continuar a executá-la, então simplesmente não usamos mais setTimeout.
fonte