Para todos os principais navegadores (exceto o IE), o onload
evento JavaScript não é acionado quando a página é carregada como resultado de uma operação do botão Voltar - é acionado somente quando a página é carregada pela primeira vez.
Alguém pode me indicar algum código de exemplo para vários navegadores (Firefox, Opera, Safari, IE,…) que resolve esse problema? Estou familiarizado com o pageshow
evento do Firefox, mas infelizmente nem o Opera nem o Safari implementam isso.
javascript
pageload
Conta
fonte
fonte
Respostas:
Pessoal, descobri que o JQuery tem apenas um efeito: a página é recarregada quando o botão Voltar é pressionado. Isso não tem nada a ver com " pronto ".
Como é que isso funciona? Bem, o JQuery adiciona um ouvinte de evento onunload .
Por padrão, ele não faz nada. Mas de alguma forma isso parece desencadear uma recarga no Safari, Opera e Mozilla - não importa o que o manipulador de eventos contenha.
[ edit (Nickolay) : eis por que funciona dessa maneira: webkit.org , developer.mozilla.org . Leia esses artigos (ou meu resumo em uma resposta separada abaixo) e considere se você realmente precisa fazer isso e tornar sua página mais lenta para os usuários.]
Não pode acreditar? Tente o seguinte:
Você verá resultados semelhantes ao usar o JQuery.
Você pode comparar com este sem onunload
fonte
onunload
manipulador (a página já destruiu tudo; por que armazená-la em cache?).Alguns navegadores modernos (Firefox, Safari e Opera, mas não o Chrome) suportam o cache "back / forward" especial (vou chamá-lo de bfcache, que é um termo inventado pela Mozilla), envolvido quando o usuário navega em Voltar. Ao contrário do cache normal (HTTP), ele captura o estado completo da página (incluindo o estado de JS, DOM). Isso permite recarregar a página mais rapidamente e exatamente como o usuário a deixou.
O
load
evento não deve ser acionado quando a página é carregada deste bfcache. Por exemplo, se você criou sua interface do usuário no manipulador "load" e o evento "load" foi acionado uma vez no carregamento inicial e na segunda vez em que a página foi recarregada a partir do bfcache, a página terminaria com duplicar elementos da interface do usuário.É também por isso que adicionar o manipulador "descarregar" impede que a página seja armazenada no bfcache (tornando mais lento a navegação de volta para) - o manipulador descarregar pode executar tarefas de limpeza, o que pode deixar a página em estado impraticável.
Para páginas que precisam saber quando estão sendo navegadas / retornadas, Firefox 1.5+ e a versão do Safari com a correção do bug 28758 oferecem suporte a eventos especiais chamados "pageshow" e "pagehide".
Referências:
fonte
Encontrei um problema que meu js não estava executando quando o usuário clicou para trás ou para frente. Primeiro, decidi parar o cache do navegador, mas esse não parecia ser o problema. Meu javascript foi definido para ser executado depois que todas as bibliotecas etc. foram carregadas. Eu verifiquei isso com o evento readyStateChange.
Após alguns testes, descobri que o readyState de um elemento em uma página em que foi clicada em voltar não é 'carregado', mas 'completo'. Adicionando
|| element.readyState == 'complete'
à minha declaração condicional resolveu meus problemas.Apenas pensei em compartilhar minhas descobertas, espero que elas ajudem alguém.
Editar para completar
Meu código tinha a seguinte aparência:
No exemplo de código acima, a variável de script estava um elemento de script recém-criado que foi adicionado ao DOM.
fonte
OK, aqui está uma solução final baseada na solução inicial do ckramer e no exemplo do palehorse que funciona em todos os navegadores, incluindo o Opera. Se você definir history.navigationMode como 'compatible', a função ready do jQuery será acionada nas operações do botão Voltar no Opera, bem como nos outros principais navegadores.
Esta página tem mais informações .
Exemplo:
Eu testei isso no Opera 9.5, IE7, FF3 e Safari e funciona em todos eles.
fonte
Não consegui que os exemplos acima funcionassem. Eu simplesmente queria acionar uma atualização de certas áreas div modificadas ao voltar para a página usando o botão Voltar. O truque que usei foi definir um campo de entrada oculto (chamado de "bit sujo") para 1 assim que as áreas div forem alteradas em relação ao original. O campo de entrada oculto, na verdade, mantém seu valor quando clico em voltar, para que seja possível carregar esse bit. Se estiver definido, atualizo a página (ou apenas atualizo as divs). No carregamento original, no entanto, o bit não está definido, portanto, não perco tempo carregando a página duas vezes.
E seria acionado corretamente sempre que eu clicasse no botão Voltar.
fonte
Se bem me lembro, adicionar um evento unload () significa que a página não pode ser armazenada em cache (no cache de avanço / retrocesso) - porque o estado muda / pode mudar quando o usuário navega. Portanto, não é seguro restaurar o estado de último segundo da página ao retornar a ela navegando pelo objeto de histórico.
fonte
Eu pensei que isso seria para "onunload", não para carregamento de página, pois não estamos falando de disparar um evento ao pressionar "Back"? $ document.ready () é para eventos desejados no carregamento da página, não importa como você chegue a essa página (por exemplo, redirecionar, abrir o navegador diretamente para o URL etc.), não ao clicar em "Voltar", a menos que você esteja falando sobre o que disparar na página anterior quando carregar novamente. E não tenho certeza de que a página não esteja sendo armazenada em cache, pois descobri que os Javascripts ainda estão, mesmo quando $ document.ready () está incluído neles. Tivemos que pressionar Ctrl + F5 ao editar nossos scripts que possuem esse evento sempre que os revisamos e queremos testar os resultados em nossas páginas.
é o que você deseja para um evento onunload ao pressionar "Voltar" e descarregar a página atual e também dispara quando um usuário fecha a janela do navegador. Isso soou mais como o desejado, mesmo que eu esteja em menor número com as respostas $ document.ready (). Basicamente, a diferença está entre um evento disparado na página atual enquanto está sendo fechado ou aquele carregado ao clicar em "Voltar" enquanto está sendo carregado. Testado no IE 7, não posso falar pelos outros navegadores, pois eles não são permitidos onde estamos. Mas isso pode ser outra opção.
fonte
Posso confirmar ao ckramer que o evento pronto do jQuery funciona no IE e no FireFox. Aqui está uma amostra:
fonte
para as pessoas que não querem usar a biblioteca jquery inteira, extraí a implementação em código separado. Tem apenas 0,4 KB de tamanho.
Você pode encontrar o código, juntamente com um tutorial em alemão neste wiki: http://www.easy-coding.de/wiki/html-ajax-und-co/onload-event-cross-browser-kompatibler-domcontentloaded.html
fonte
O evento pronto do jQuery foi criado para esse tipo de problema. Você pode pesquisar na implementação para ver o que está acontecendo nos bastidores.
fonte
ready
parece não ter sido acionado no Firefox ao usar o botão Voltar. Veja também a resposta de Nickolay .Bill, ouso responder à sua pergunta, mas não tenho 100% de certeza com meus palpites. Eu acho que outros navegadores do IE, ao levar o usuário a uma página no histórico, não apenas carregarão a página e seus recursos do cache, mas também restaurarão todo o estado do DOM (sessão de leitura) para ela. O IE não faz a restauração do DOM (ou, no momento da concessão, não) e, portanto, o evento onload parece ser necessário para a reinicialização adequada da página.
fonte
Tentei a solução de Bill usando $ (document) .ready ... mas no começo não funcionou. Descobri que, se o script for colocado após a seção html, ele não funcionará. Se for a seção principal, funcionará, mas apenas no IE. O script não funciona no Firefox.
fonte
OK, tentei isso e funciona no Firefox 3, Safari 3.1.1 e IE7, mas não no Opera 9.52.
Se você usar o exemplo mostrado abaixo (com base no exemplo de palehorse), receberá uma caixa de alerta quando a página for carregada pela primeira vez. Mas se você for para outro URL e pressionar o botão Voltar para voltar a esta página, não verá uma caixa de alerta no Opera (mas sim nos outros navegadores).
Enfim, acho que isso está perto o suficiente por enquanto. Obrigado a todos!
fonte
O evento Unload não está funcionando bem no IE 9. Tentei com o evento load (onload ()), está funcionando bem no IE 9 e FF5 .
Exemplo:
fonte
Eu usei um modelo html. No arquivo custom.js deste modelo, havia uma função como esta:
Mas essa função não estava funcionando quando eu voltei depois de ir para outra página.
Então, eu tentei isso e funcionou:
Agora, eu tenho 2 funções "prontas", mas não dá nenhum erro e a página está funcionando muito bem.
No entanto, tenho que declarar que ele foi testado no Windows 10 - Opera v53 e Edge v42, mas em outros navegadores. Lembre-se disso ...
Nota: a versão do jquery era 3.3.1 e a versão da migração era 3.0.0
fonte