Quero verificar quando alguém tenta atualizar uma página.
Por exemplo, quando abro uma página, nada acontece, mas quando atualizo a página, ele deve exibir um alerta.
window.performance.navigation.type
está obsoleto, pls veja minha resposta .
Quero verificar quando alguém tenta atualizar uma página.
Por exemplo, quando abro uma página, nada acontece, mas quando atualizo a página, ele deve exibir um alerta.
window.performance.navigation.type
está obsoleto, pls veja minha resposta .
Respostas:
⚠️⚠️⚠️ window.performance.navigation.type
está obsoleto, pls veja a resposta de Илья Зеленько
Uma maneira melhor de saber que a página é realmente recarregada é usar o objeto de navegador suportado pela maioria dos navegadores modernos.
Ele usa a API de tempo de navegação .
//check for Navigation Timing API support
if (window.performance) {
console.info("window.performance works fine on this browser");
}
if (performance.navigation.type == 1) {
console.info( "This page is reloaded" );
} else {
console.info( "This page is not reloaded");
}
fonte: https://developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API
performance.navigation.type == performance.navigation.TYPE_RELOAD
é mais fácil de ler em vez de == 1
. Além disso, se você verificar performance.navigation
que você vai descobrir que existem 4 tipos de navegação diferente e foi decorado como TYPE_BACK_FORWARD
,TYPE_NAVIGATE
window.performance.navigation.type
está obsoleto, pls veja minha resposta .
O primeiro passo é verificar sessionStorage
algum valor predefinido e, se existir, alertar o usuário:
if (sessionStorage.getItem("is_reloaded")) alert('Reloaded!');
O segundo passo é definir sessionStorage
com algum valor (por exemplo true
):
sessionStorage.setItem("is_reloaded", true);
Os valores da sessão são mantidos até que a página seja fechada, para que funcione apenas se a página for recarregada em uma nova guia com o site. Você também pode manter a contagem de recargas da mesma maneira.
true
é convertido em "true"
. 2) O armazenamento da sessão persiste até que o usuário feche a janela do navegador. Portanto, você não pode dizer a diferença entre recarregar a página e navegar de volta para o site na mesma sessão do navegador.
window.performance.navigation
A propriedade foi descontinuada na especificação Nível de tempo de navegação 2 . Por favor, use a PerformanceNavigationTiming
interface.
Esta é uma tecnologia experimental .
Verifique a tabela de compatibilidade do navegador com cuidado antes de usá-la na produção.
A propriedade somente leitura do tipo retorna uma sequência que representa o tipo de navegação. O valor deve ser um dos seguintes:
navegar - Navegação iniciada clicando em um link, inserindo o URL na barra de endereços do navegador, enviando formulário ou inicializando através de uma operação de script diferente de recarregar e voltar_forward, conforme listado abaixo.
recarregar - A navegação é feita através da operação de recarregamento do navegador ou location.reload()
.
back_forward - A navegação é realizada através da operação de travessia do histórico do navegador.
prerender - A navegação é iniciada por uma dica de prerender .
Esta propriedade é somente leitura.
function print_nav_timing_data() {
// Use getEntriesByType() to just get the "navigation" events
var perfEntries = performance.getEntriesByType("navigation");
for (var i=0; i < perfEntries.length; i++) {
console.log("= Navigation entry[" + i + "]");
var p = perfEntries[i];
// dom Properties
console.log("DOM content loaded = " + (p.domContentLoadedEventEnd - p.domContentLoadedEventStart));
console.log("DOM complete = " + p.domComplete);
console.log("DOM interactive = " + p.interactive);
// document load and unload time
console.log("document load = " + (p.loadEventEnd - p.loadEventStart));
console.log("document unload = " + (p.unloadEventEnd - p.unloadEventStart));
// other properties
console.log("type = " + p.type);
console.log("redirectCount = " + p.redirectCount);
}
}
Armazene um cookie na primeira vez que alguém visitar a página. Na atualização, verifique se o seu cookie existe e, se existir, alerta.
function checkFirstVisit() {
if(document.cookie.indexOf('mycookie')==-1) {
// cookie doesn't exist, create it now
document.cookie = 'mycookie=1';
}
else {
// not first visit, so alert
alert('You refreshed!');
}
}
e na sua etiqueta corporal:
<body onload="checkFirstVisit()">
E se
event.currentTarget.performance.navigation.type
retorna
0 => usuário digitou uma URL
1 => página recarregada
2 => botão voltar clicado.
performance.navigation.type
está obsoleto, pls veja minha resposta .
Encontrei algumas informações aqui Atualização da página de detecção de Javascript . Sua primeira recomendação é usar campos ocultos, que tendem a ser armazenados por meio de atualizações de página.
function checkRefresh() {
if (document.refreshForm.visited.value == "") {
// This is a fresh page load
document.refreshForm.visited.value = "1";
// You may want to add code here special for
// fresh page loads
} else {
// This is a page refresh
// Insert code here representing what to do on
// a refresh
}
}
<html>
<body onLoad="JavaScript:checkRefresh();">
<form name="refreshForm">
<input type="hidden" name="visited" value="" />
</form>
</body>
</html>
Referer
propriedade e modificar a resposta do servidor com base nessa propriedade
<script>
elemento para o final funcionaria - mas ainda não é uma solução garantida (nem o método de cookie).
Referer
também não é confiável; muitos proxies e extensões de navegador o retiram das solicitações.
Eu escrevi esta função para verificar os dois métodos usando antigos window.performance.navigation
e novos performance.getEntriesByType("navigation")
ao mesmo tempo:
function navigationType(){
var result;
var p;
if (window.performance.navigation) {
result=window.performance.navigation;
if (result==255){result=4} // 4 is my invention!
}
if (window.performance.getEntriesByType("navigation")){
p=window.performance.getEntriesByType("navigation")[0].type;
if (p=='navigate'){result=0}
if (p=='reload'){result=1}
if (p=='back_forward'){result=2}
if (p=='prerender'){result=3} //3 is my invention!
}
return result;
}
Descrição do resultado:
0: clicando em um link, Digitando o URL na barra de endereços do navegador, envio de formulário, Clicando em marcador, inicializando através de uma operação de script.
1: Clique no botão Recarregar ou useLocation.reload()
2: Trabalhando com o histórico do navegador (Bakc e Forward).
3: atividade de pré - renderização como<link rel="prerender" href="https://stackoverflow.com//example.com/next-page.html">
4: qualquer outro método.
if(sessionStorage.reload) {
sessionStorage.reload = true;
// optionnal
setTimeout( () => { sessionStorage.setItem('reload', false) }, 2000);
} else {
sessionStorage.setItem('reload', false);
}