Como recarregar automaticamente uma página após um determinado período de inatividade


Respostas:


217

Se você deseja atualizar a página, se não houver atividade, precisará descobrir como definir atividade. Digamos que atualizamos a página a cada minuto, a menos que alguém pressione uma tecla ou mova o mouse. Isso usa jQuery para ligação de eventos:

<script>
     var time = new Date().getTime();
     $(document.body).bind("mousemove keypress", function(e) {
         time = new Date().getTime();
     });

     function refresh() {
         if(new Date().getTime() - time >= 60000) 
             window.location.reload(true);
         else 
             setTimeout(refresh, 10000);
     }

     setTimeout(refresh, 10000);
</script>

5
por que você definiria o intervalo para 10000 se estiver calculando usando 60000? Por pelo menos 5 turnos, será falso?
— Scary Wombat

2
A razão pela qual o intervalo é menor que o tempo de inatividade é que você deseja verificar o tempo de inatividade com uma frequência muito maior que o tempo de inatividade real. Por exemplo, se o tempo de inatividade for 1 minuto e o intervalo for 1 minuto, se o usuário mover o mouse após 1 segundo e depois parar, a atualização ocorrerá somente após 2 minutos. Quanto menor o intervalo, mais preciso será o tempo de atualização.
— Derorrist

227

Isso pode ser realizado sem javascript, com este metatag:

<meta http-equiv="refresh" content="5" >

onde content = "5" são os segundos que a página aguardará até que seja atualizada.

Mas você disse apenas se não houvesse atividade, que tipo de atividade seria essa?


2
Nenhuma atividade significa que o usuário final não está na mesa ou navegando em outro site. Nenhuma atividade Mouse / KB no site ao qual estou me referindo.
— precisa saber é o seguinte

2
ótima resposta, pensei que isso tinha que ser feito setInterval, tão feliz em saber que isso existe!
— tim Peterson

11
com votos positivos, mesmo que essa não seja a resposta porque não captura atividade, mas essa pergunta estava no topo dos resultados de pesquisa do Google ao simplesmente procurar atualização de javascript. Portanto, se você está simplesmente procurando atualizar a página automaticamente em um intervalo definido, este é o caminho a seguir.
— Jimmy Bosse

podemos fazer a atualização automática com variáveis ​​de postagem?
— Pradeep Kumar Prabaharan

2
isso não está respondendo à pergunta. Se há uma atividade que irá recarregar qualquer maneira
— Braian Mellor

42

Eu construí uma solução completa de javascript também que não requer jquery. Pode ser capaz de transformá-lo em um plugin. Eu o uso para a atualização automática fluida, mas parece que poderia ajudá-lo aqui.

JSFiddle AutoRefresh

// Refresh Rate is how often you want to refresh the page 
// bassed off the user inactivity. 
var refresh_rate = 200; //<-- In seconds, change to your needs
var last_user_action = 0;
var has_focus = false;
var lost_focus_count = 0;
// If the user loses focus on the browser to many times 
// we want to refresh anyway even if they are typing. 
// This is so we don't get the browser locked into 
// a state where the refresh never happens.    
var focus_margin = 10; 

// Reset the Timer on users last action
function reset() {
    last_user_action = 0;
    console.log("Reset");
}

function windowHasFocus() {
    has_focus = true;
}

function windowLostFocus() {
    has_focus = false;
    lost_focus_count++;
    console.log(lost_focus_count + " <~ Lost Focus");
}

// Count Down that executes ever second
setInterval(function () {
    last_user_action++;
    refreshCheck();
}, 1000);

// The code that checks if the window needs to reload
function refreshCheck() {
    var focus = window.onfocus;
    if ((last_user_action >= refresh_rate && !has_focus && document.readyState == "complete") || lost_focus_count > focus_margin) {
        window.location.reload(); // If this is called no reset is needed
        reset(); // We want to reset just to make sure the location reload is not called.
    }

}
window.addEventListener("focus", windowHasFocus, false);
window.addEventListener("blur", windowLostFocus, false);
window.addEventListener("click", reset, false);
window.addEventListener("mousemove", reset, false);
window.addEventListener("keypress", reset, false);
window.addEventListener("scroll", reset, false);
document.addEventListener("touchMove", reset, false);
document.addEventListener("touchEnd", reset, false);

2
Isso é ótimo. Desejo que você tenha votado mais aqui. Não usar o JQuery obtém grandes pontos de bônus.
— Echiban

1
* ótimo / muito obrigado * isso explica a detecção de eventos de toque?
— sendbits

1
Hmm, você sabe que não tenho certeza. Quando o criei, não tinha muita experiência com iPhone ou iPads.
— newdark-it

1
Herói! Isso é perfeito, obrigado. Eu tenho minhas sessões PHP configuradas para expirar após uma hora, e isso está configurado para atualizar um pouco mais de uma hora. Eu acho que isso deve realizar o logout após a funcionalidade de inatividade que eu estou procurando.
— Tspesh

24
<script type="text/javascript">
  var timeout = setTimeout("location.reload(true);",600000);
  function resetTimeout() {
    clearTimeout(timeout);
    timeout = setTimeout("location.reload(true);",600000);
  }
</script>

Acima, a página será atualizada a cada 10 minutos, a menos que resetTimeout () seja chamado. Por exemplo:

<a href="javascript:;" onclick="resetTimeout();">clicky</a>

2
Avaliação implícita é pura maldade!
— Stephan Weinhold

7

Com base na resposta aceita de arturnt. Esta é uma versão ligeiramente otimizada, mas faz essencialmente a mesma coisa:

var time = new Date().getTime();
$(document.body).bind("mousemove keypress", function () {
    time = new Date().getTime();
});

setInterval(function() {
    if (new Date().getTime() - time >= 60000) {
        window.location.reload(true);
    }
}, 1000);

A única diferença é que esta versão usa em setIntervalvez de setTimeout, o que torna o código mais compacto.


por que você definiria o intervalo 1000se estiver calculando usando 60000?
— Scary Wombat

3
O intervalo é 1.000, porque verifica a cada segundo se o mouse foi movido. Os 60.000 são usados ​​para determinar se o último movimento do mouse ocorreu há pelo menos um minuto atrás.
— Hannes Sachsenhofer

5
var bd = document.getElementsByTagName('body')[0];
var time = new Date().getTime();

bd.onmousemove = goLoad;
function goLoad() {
if(new Date().getTime() - time >= 1200000) {
    time = new Date().getTime();
    window.location.reload(true);
    }else{
        time = new Date().getTime();
    }
}

Cada vez que você move o mouse, ele verifica a última vez que o move. Se o intervalo de tempo for maior que 20 ', ele recarregará a página, caso contrário, renovará a última vez que você moveu o mouse.


2

Recarga automática com o alvo de sua escolha. Nesse caso, o destino é _selfdefinido como ele mesmo, mas você pode alterar a página de recarga simplesmente alterando o window.open('self.location', '_self');código para algo como este exemplo window.top.location="window.open('http://www.YourPageAdress.com', '_self'";.

Com uma mensagem de confirmação ALERTA:

<script language="JavaScript">
function set_interval() {
  //the interval 'timer' is set as soon as the page loads  
  var timeoutMins = 1000 * 1 * 15; // 15 seconds
  var timeout1Mins = 1000 * 1 * 13; // 13 seconds
  itimer=setInterval("auto_logout()",timeoutMins);
  atimer=setInterval("alert_idle()",timeout1Mins);

}

function reset_interval() {
  var timeoutMins = 1000 * 1 * 15; // 15 seconds 
  var timeout1Mins = 1000 * 1 * 13; // 13 seconds
  //resets the timer. The timer is reset on each of the below events:
  // 1. mousemove   2. mouseclick   3. key press 4. scrolling
  //first step: clear the existing timer
  clearInterval(itimer);
  clearInterval(atimer);
  //second step: implement the timer again
  itimer=setInterval("auto_logout()",timeoutMins);
  atimer=setInterval("alert_idle()",timeout1Mins);
}

function alert_idle() {
    var answer = confirm("Session About To Timeout\n\n       You will be automatically logged out.\n       Confirm to remain logged in.")
    if (answer){

        reset_interval();
    }
    else{
        auto_logout();
    }
}

function auto_logout() {
  //this function will redirect the user to the logout script
  window.open('self.location', '_self');
}
</script>

Sem alerta de confirmação:

<script language="JavaScript">
function set_interval() {
  //the interval 'timer' is set as soon as the page loads  
  var timeoutMins = 1000 * 1 * 15; // 15 seconds
  var timeout1Mins = 1000 * 1 * 13; // 13 seconds
  itimer=setInterval("auto_logout()",timeoutMins);

}

function reset_interval() {
  var timeoutMins = 1000 * 1 * 15; // 15 seconds 
  var timeout1Mins = 1000 * 1 * 13; // 13 seconds
  //resets the timer. The timer is reset on each of the below events:
  // 1. mousemove   2. mouseclick   3. key press 4. scrolling
  //first step: clear the existing timer
  clearInterval(itimer);
  clearInterval(atimer);
  //second step: implement the timer again
  itimer=setInterval("auto_logout()",timeoutMins);
}


function auto_logout() {
  //this function will redirect the user to the logout script
  window.open('self.location', '_self');
}
</script>

O código do corpo é o mesmo para as duas soluções:

<body onLoad="set_interval(); document.form1.exp_dat.focus();" onKeyPress="reset_interval();" onmousemove="reset_interval();" onclick="reset_interval();" onscroll="reset_interval();">

isso não está respondendo à pergunta. Se houver uma atividade, ela será recarregada de qualquer maneira.
— Braian Mellor

1
Você tem razão, eu não li a pergunta inteira. Ok, agora é editado com a resposta correta.
— SeekLoad

Tirei o -1 e adicionei +10 para fazer uma resposta melhor! Obrigado
— Braian Mellor

Eu também tenho uma segunda resposta que funciona, mas agora eu ajusto essa resposta, pois ela pode ser melhor com uma solução direcionada conforme a editei agora.
— precisa saber é o seguinte

1
Dei agora três respostas para a mesma solução, dependendo do que parecer mais fácil de aplicar ou atender às necessidades. Todas as 3 soluções têm com ou sem confirmação ou alerta. Eu respondi com 3 respostas, já que as 3 respostas estão com códigos diferentes e seria muito longo para ter todas as soluções juntas em uma resposta. Também adicionei explicações sobre como editar os códigos uma vez usados. Todas as respostas, é claro, funcionam perfeitamente ... Foi testado antes de colocá-las aqui.
— precisa saber é o seguinte


0

Sim querido, então você tem que usar a tecnologia Ajax. para alterar o conteúdo de uma tag html específica:

 <html>
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
        <title>Ajax Page</title>
        <script>
        setInterval(function () { autoloadpage(); }, 30000); // it will call the function autoload() after each 30 seconds. 
        function autoloadpage() {
            $.ajax({
                url: "URL of the destination page",
                type: "POST",
                success: function(data) {
                    $("div#wrapper").html(data); // here the wrapper is main div
                }
            });
        }
        </script>
    </head>
    <body>
    <div id="wrapper">
    contents will be changed automatically. 
    </div>
 </body>
 </html>

0

Eu consideraria activityse o usuário está ou não focado na janela. Por exemplo, quando você clica de uma janela para outra (por exemplo, Google Chrome para iTunes ou Tab 1 a Tab 2 em um navegador da Internet), a página da Web pode enviar um retorno de chamada dizendo "Estou fora de foco!" ou "Estou focado!". Alguém poderia usar o jQuery para aproveitar essa possível falta de atividade para fazer o que quisesse. Se eu estivesse na sua posição, usaria o código a seguir para verificar o foco a cada 5 segundos, etc. e recarregar se não houver foco.

var window_focus;
$(window).focus(function() {
    window_focus = true;
}).blur(function() {
    window_focus = false;
});
function checkReload(){
    if(!window_focus){
        location.reload();  // if not focused, reload
    }
}
setInterval(checkReload, 5000);  // check if not focused, every 5 seconds

0

E, finalmente, a solução mais simples:

Com confirmação de alerta:

<script type="text/javascript">
    // Set timeout variables.
    var timoutWarning = 3000; // Display warning in 1Mins.
    var timoutNow = 4000; // Timeout in 2 mins.

    var warningTimer;
    var timeoutTimer;

    // Start timers.
    function StartTimers() {
        warningTimer = setTimeout("IdleWarning()", timoutWarning);
        timeoutTimer = setTimeout("IdleTimeout()", timoutNow);
    }

    // Reset timers.
    function ResetTimers() {
        clearTimeout(warningTimer);
        clearTimeout(timeoutTimer);
        StartTimers();
        $("#timeout").dialog('close');
    }

    // Show idle timeout warning dialog.
    function IdleWarning() {
        var answer = confirm("Session About To Timeout\n\n       You will be automatically logged out.\n       Confirm to remain logged in.")
            if (answer){

                ResetTimers();
            }
            else{
                IdleTimeout();
            }
    }       

    // Logout the user and auto reload or use this window.open('http://www.YourPageAdress.com', '_self'); to auto load a page.
    function IdleTimeout() {
        window.open(self.location,'_top');
    }
</script>

Sem confirmação de alerta:

<script type="text/javascript">
    // Set timeout variables.
    var timoutWarning = 3000; // Display warning in 1Mins.
    var timoutNow = 4000; // Timeout in 2 mins.

    var warningTimer;
    var timeoutTimer;

    // Start timers.
    function StartTimers() {
        warningTimer = setTimeout(timoutWarning);
        timeoutTimer = setTimeout("IdleTimeout()", timoutNow);
    }

    // Reset timers.
    function ResetTimers() {
        clearTimeout(warningTimer);
        clearTimeout(timeoutTimer);
        StartTimers();
        $("#timeout").dialog('close');
    }

    // Logout the user and auto reload or use this window.open('http://www.YourPageAdress.com', '_self'); to auto load a page.
    function IdleTimeout() {
        window.open(self.location,'_top');
    }
</script>

O código do corpo é o mesmo para as duas soluções

<body onload="StartTimers();" onmousemove="ResetTimers();" onKeyPress="ResetTimers();">

Dei agora três respostas para a mesma solução, dependendo do que parecer mais fácil de aplicar ou atender às necessidades. Todas as 3 soluções têm com ou sem confirmação ou alerta. Eu respondi com 3 respostas, já que as 3 respostas estão com códigos diferentes e seria muito longo para ter todas as soluções juntas em uma resposta. Também adicionei explicações sobre como editar os códigos uma vez usados. Todas as respostas, é claro, funcionam perfeitamente ... Foi testado antes de colocá-las aqui.
— SeekLoad

0

Com texto de confirmação na página em vez de alerta

Como esse é outro método para carregar automaticamente se inativo, dou uma segunda resposta. Este é mais simples e mais fácil de entender.

Com a confirmação de recarga na página

<script language="javaScript" type="text/javascript">
<!--
var autoCloseTimer;
var timeoutObject;
var timePeriod = 5100; // 5,1 seconds
var warnPeriod = 5000; // 5 seconds
// Warning period should always be a bit shorter then time period

function promptForClose() {
autoCloseDiv.style.display = 'block';
autoCloseTimer = setTimeout("definitelyClose()", warnPeriod);
}


function autoClose() {
autoCloseDiv.style.display = 'block'; //shows message on page
autoCloseTimer = setTimeout("definitelyClose()", timePeriod); //starts countdown to closure
}

function cancelClose() {
clearTimeout(autoCloseTimer); //stops auto-close timer
autoCloseDiv.style.display = 'none'; //hides message
}

function resetTimeout() {
clearTimeout(timeoutObject); //stops timer
timeoutObject = setTimeout("promptForClose()", timePeriod); //restarts timer from 0
}


function definitelyClose() {

// If you use want targeted reload: parent.Iframe0.location.href = "https://URLHERE.com/"
// or  this: window.open('http://www.YourPageAdress.com', '_self');

// of for the same page reload use: window.top.location=self.location;
// or window.open(self.location;, '_self');

window.top.location=self.location;
}
-->
</script>

Caixa de confirmação ao usar com a confirmação na página

<div class="leftcolNon">
<div id='autoCloseDiv' style="display:none">
<center>
<b>Inactivity warning!</b><br />
This page will Reloads automatically unless you hit 'Cancel.'</p>
<input type='button' value='Load' onclick='definitelyClose();' />
<input type='button' value='Cancel' onclick='cancelClose();' />
</center>
</div>
</div>

Os códigos de corpo para ambos são os mesmos

<body onmousedown="resetTimeout();" onmouseup="resetTimeout();" onmousemove="resetTimeout();" onkeydown="resetTimeout();" onload="timeoutObject=setTimeout('promptForClose()',timePeriod);">

NOTA: Se você não deseja obter a confirmação na página, use Sem confirmação

<script language="javaScript" type="text/javascript">
<!--
var autoCloseTimer;
var timeoutObject;
var timePeriod = 5000; // 5 seconds

function resetTimeout() {
clearTimeout(timeoutObject); //stops timer
timeoutObject = setTimeout("definitelyClose()", timePeriod); //restarts timer from 0
}

function definitelyClose() {

// If you use want targeted reload: parent.Iframe0.location.href = "https://URLHERE.com/"
// or  this: window.open('http://www.YourPageAdress.com', '_self');

// of for the same page reload use: window.top.location=self.location;
// or window.open(self.location;, '_self');

window.top.location=self.location;
}
-->
</script>

Dei agora três respostas para a mesma solução, dependendo do que parecer mais fácil de aplicar ou atender às necessidades. Todas as 3 soluções têm com ou sem confirmação ou alerta. Eu respondi com 3 respostas, já que as 3 respostas estão com códigos diferentes e seria muito longo para ter todas as soluções juntas em uma resposta. Também adicionei explicações sobre como editar os códigos uma vez usados. Todas as respostas, é claro, funcionam perfeitamente ... Foi testado antes de colocá-las aqui.
— SeekLoad

0

Usando o LocalStorage para acompanhar a última hora da atividade, podemos escrever a função reload da seguinte maneira

function reloadPage(expiryDurationMins) {
    const lastInteraction = window.localStorage.getItem('lastinteraction')
    if (!lastInteraction) return // no interaction recorded since page load
    const inactiveDurationMins = (Date.now() - Number(lastInteraction)) / 60000
    const pageExpired = inactiveDurationMins >= expiryDurationMins
    if (pageExpired) window.location.reload()
}

Em seguida, criamos uma função de seta que salva a última vez de interação em milissegundos (String)

const saveLastInteraction = () => window.localStorage.setItem('last', Date.now().toString())

Precisamos ouvir o beforeunloadevento no navegador para limpar nosso lastinteractionregistro, para não ficarmos presos em um loop infinito de recarga.

window.addEventListener('beforeunload', () => window.localStorage.removeItem('lastinteraction'))

Os eventos de atividade do usuário que precisaremos monitorar seriam mousemovee keypress. Armazenamos o último tempo de interação em que o usuário move o mouse ou pressiona uma tecla no teclado

window.addEventListener('mousemove', saveLastInteraction)
window.addEventListener('keypress', saveLastInteraction)

Para configurar nosso ouvinte final, usaremos o loadevento. No carregamento da página, usamos a setIntervalfunção para verificar se a página expirou após um determinado período.

const expiryDurationMins = 1

window.addEventListener('load', setInterval.bind(null, reloadPage.bind(null, expiryDurationMins), 1000))

-1

Esta tarefa é muito fácil de usar, seguindo o código na seção de cabeçalho html

<head> <meta http-equiv="refresh" content="30" /> </head>

Ele atualizará sua página após 30 segundos.


2
Na minha pergunta, precisamos verificar se há nenhuma atividade
— Umar Adil

Sim querido, então você tem que usar a tecnologia Ajax. alterar o conteúdo de determinada tag html
— FAISAL 12/12

Use a resposta acima com sintaxe adequada.
— FAISAL 12/12

1
Este método que você respondeu não responde à pergunta, pois a pergunta é sobre como recarregar se NÃO houver ativação na página, e sua solução forçará a recarga automaticamente, mesmo que haja uma atividade na página. A resposta pesquisada aqui é como fazê-lo recarregar se não houver uso de mouse ou teclado na página dentro de um período de tempo. NOTA: Estou lhe dizendo isso porque eu mesmo cometi o mesmo erro quando respondi da última vez, então mudei minha resposta para se adequar à pergunta.
— precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.