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

146

Como recarregar automaticamente uma página da Web, se não houver atividade na página por um determinado período de tempo?

Umar Adil
fonte
Talvez o stackoverflow.com/questions/3729959/… esteja relacionado?
precisa saber é o seguinte

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>
Arte
fonte
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?

amosrivera
fonte
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);
newdark-it
fonte
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>
Yuriy Faktorovich
fonte
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.

Hannes Sachsenhofer
fonte
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.

mike_x_
fonte
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();">
SeekLoad
fonte
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
2

use o setIntervalmétodo JavaScript :

setInterval(function(){ location.reload(); }, 3000);
Syed Mahfuzul Mazid
fonte
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>
FAISAL
fonte
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
Joseph Orlando
fonte
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();">
SeekLoad
fonte
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>
SeekLoad
fonte
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))
Enogwe Victor
fonte
-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.

FAISAL
fonte
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