Cómo recargar automáticamente una página después de un período de inactividad determinado

Respuestas:

217

Si desea actualizar la página si no hay actividad, debe descubrir cómo definirla. Digamos que actualizamos la página cada minuto a menos que alguien presione una tecla o mueva el mouse. Esto usa jQuery para el enlace 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
fuente
55
¿por qué establecerías el intervalo en 10000 si está calculando usando 60000? ¿Por al menos 5 turnos será falso?
Scary Wombat
2
La razón por la cual el intervalo es menor que el tiempo de inactividad es que desea verificar el tiempo de inactividad en una frecuencia mucho más alta que el tiempo de inactividad real. Por ejemplo, si el tiempo de inactividad es de 1 minuto y el intervalo es de 1 minuto, si el usuario movió el mouse después de 1 segundo y luego se detuvo, la actualización solo ocurrirá después de 2 minutos. Cuanto menor sea el intervalo, más preciso será el tiempo de actualización.
Derorrist el
227

Esto se puede lograr sin javascript, con esta metaetiqueta:

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

donde content = "5" son los segundos que la página esperará hasta que se actualice.

Pero usted dijo que si no hubiera actividad, ¿qué tipo de actividad sería?

amosrivera
fuente
2
Sin actividad significa que el usuario final no está en el escritorio o navegando en otro sitio. No hay actividad de Mouse / KB en el sitio al que me refiero.
Umar Adil
2
gran respuesta, pensé que esto tenía que hacerse setInterval, ¡me alegra saber que existe!
Tim Peterson
11
votó a pesar de que esta no es la respuesta porque no captura la actividad, sin embargo, esta pregunta estaba en la parte superior de los resultados de búsqueda de Google cuando simplemente buscaba la actualización de JavaScript. Entonces, si simplemente desea que la página se actualice automáticamente en un intervalo establecido, este es el camino a seguir.
Jimmy Bosse
¿podemos hacer una actualización automática con variables de publicación?
Pradeep Kumar Prabaharan
2
Esto no responde a la pregunta. Si hay una actividad, se recargará de todos modos
Braian Mellor
42

También he creado una solución javascript completa que no requiere jquery. Podría ser capaz de convertirlo en un complemento. Lo uso para la actualización automática fluida, pero parece que podría ayudarlo aquí.

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
fuente
2
Esto es genial. Ojalá te hayan votado más aquí. No usar JQuery obtiene importantes puntos de bonificación.
Echiban
1
* genial / muchas gracias * ¿cuenta esto para detectar eventos táctiles?
sendbits
1
Hmm, sabes que no estoy seguro. Cuando lo creé, no tenía mucha experiencia con iPhone o iPad.
newdark-it
1
¡Héroe! Esto es perfecto, gracias. Tengo mis sesiones de PHP expiradas después de una hora, y esto está configurado para actualizarse un poco más de una hora. Creo que esto debería lograr el cierre de sesión después de la funcionalidad de inactividad que busco.
Tspesh
24
<script type="text/javascript">
  var timeout = setTimeout("location.reload(true);",600000);
  function resetTimeout() {
    clearTimeout(timeout);
    timeout = setTimeout("location.reload(true);",600000);
  }
</script>

Arriba actualizará la página cada 10 minutos a menos que se llame a resetTimeout (). Por ejemplo:

<a href="javascript:;" onclick="resetTimeout();">clicky</a>
Yuriy Faktorovich
fuente
2
¡La evaluación implícita es pura maldad!
Stephan Weinhold
7

Basado en la respuesta aceptada de arturnt. Esta es una versión ligeramente optimizada, pero hace esencialmente lo mismo:

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);

La única diferencia es que esta versión usa en setIntervallugar de setTimeout, lo que hace que el código sea más compacto.

Hannes Sachsenhofer
fuente
¿por qué establecerías el intervalo 1000si está calculando usando 60000?
Scary Wombat
3
El intervalo es 1.000 porque comprueba cada segundo si el mouse se ha movido. El 60,000 se usa para determinar si el último movimiento del mouse ocurrió al menos hace un minuto.
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 mueva el mouse, verificará la última vez que movió el mouse. Si el intervalo de tiempo es mayor a 20 ', volverá a cargar la página, de lo contrario, renovará la última vez que movió el mouse.

mike_x_
fuente
2

Recarga automática con el objetivo de su elección. En este caso, el objetivo se _selfestablece en sí mismo, pero puede cambiar la página de recarga simplemente cambiando el window.open('self.location', '_self');código a algo como este ejemplo window.top.location="window.open('http://www.YourPageAdress.com', '_self'";.

Con un mensaje de ALERTA de confirmación:

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

Sin alerta de confirmación:

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

El código del cuerpo es el MISMO para ambas soluciones:

<body onLoad="set_interval(); document.form1.exp_dat.focus();" onKeyPress="reset_interval();" onmousemove="reset_interval();" onclick="reset_interval();" onscroll="reset_interval();">
SeekLoad
fuente
Esto no responde a la pregunta. Si hay una actividad, se volverá a cargar de todos modos.
Braian Mellor
1
Tienes razón, no leí toda la pregunta. Bien, ahora está EDITADO con la respuesta correcta.
SeekLoad
¡Saqué el -1 y agregué +10 para hacer una mejor respuesta! gracias
Braian Mellor
También tengo una segunda respuesta que funciona, pero en este momento afino esta respuesta, ya que puede ser mejor con una solución específica como la edité ahora.
SeekLoad
1
Di 3 respuestas ahora para la misma solución, dependiendo de lo que se sienta más fácil de aplicar o se ajuste a las necesidades. Las 3 soluciones tienen con o sin confirmación o alerta. Respondí con 3 respuestas ya que las 3 respuestas tienen códigos diferentes y sería demasiado largo tener todas las soluciones juntas en una sola respuesta. También agregué explicaciones sobre cómo editar los códigos una vez utilizados. Todas las respuestas, por supuesto, funcionan perfectamente ... Fue probado antes de ponerlas aquí.
SeekLoad
2

usa el setIntervalmétodo JavaScript :

setInterval(function(){ location.reload(); }, 3000);
Syed Mahfuzul Mazid
fuente
0

Sí querida, entonces tienes que usar la tecnología Ajax. para cambiar el contenido de una etiqueta html particular:

 <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
fuente
0

Consideraría activitysi el usuario está enfocado o no en la ventana. Por ejemplo, cuando hace clic de una ventana a otra (por ejemplo, Google Chrome a iTunes, o Tab 1 a Tab 2 dentro de un navegador de Internet), la página web puede enviar una devolución de llamada diciendo "¡Estoy fuera de foco!" o "Estoy enfocado". Se podría usar jQuery para aprovechar esta posible falta de actividad para hacer lo que quisieran. Si estuviera en su posición, usaría el siguiente código para verificar el enfoque cada 5 segundos, etc. y volver a cargar si no hay enfoque.

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
fuente
0

Y finalmente la solución más simple:

Con confirmación 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>

Sin confirmación 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>

El código del cuerpo es el MISMO para ambas soluciones

<body onload="StartTimers();" onmousemove="ResetTimers();" onKeyPress="ResetTimers();">
SeekLoad
fuente
Di 3 respuestas ahora para la misma solución, dependiendo de lo que se sienta más fácil de aplicar o se ajuste a las necesidades. Las 3 soluciones tienen con o sin confirmación o alerta. Respondí con 3 respuestas ya que las 3 respuestas tienen códigos diferentes y sería demasiado largo tener todas las soluciones juntas en una sola respuesta. También agregué explicaciones sobre cómo editar los códigos una vez utilizados. Todas las respuestas, por supuesto, funcionan perfectamente ... Fue probado antes de ponerlas aquí.
SeekLoad
0

Con texto de confirmación en la página en lugar de alerta

Dado que este es otro método para cargar automáticamente si está inactivo, le doy una segunda respuesta. Este es más simple y más fácil de entender.

Con confirmación de recarga en la 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>

Cuadro de confirmación cuando se usa con confirmación en la 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>

Los códigos corporales para ambos son MISMOS

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

NOTA: Si no desea tener la confirmación en la página, use Sin confirmación

<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
fuente
Di 3 respuestas ahora para la misma solución, dependiendo de lo que se sienta más fácil de aplicar o se ajuste a las necesidades. Las 3 soluciones tienen con o sin confirmación o alerta. Respondí con 3 respuestas ya que las 3 respuestas tienen códigos diferentes y sería demasiado largo tener todas las soluciones juntas en una sola respuesta. También agregué explicaciones sobre cómo editar los códigos una vez utilizados. Todas las respuestas, por supuesto, funcionan perfectamente ... Fue probado antes de ponerlas aquí.
SeekLoad
0

Usando LocalStorage para realizar un seguimiento de la última vez que realizó la actividad, podemos escribir la función de recarga de la siguiente manera

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()
}

Luego creamos una función de flecha que guarda la última vez de interacción en milisegundos (String)

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

Tendremos que escuchar el beforeunloadevento en el navegador para borrar nuestro lastinteractionregistro para no quedarnos atrapados en un ciclo de recarga infinito.

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

Los eventos de actividad del usuario que necesitaremos monitorear serían mousemovey keypress. Almacenamos el último tiempo de interacción cuando el usuario mueve el mouse o presiona una tecla en el teclado

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

Para configurar nuestro oyente final, utilizaremos el loadevento. En la carga de la página, utilizamos la setIntervalfunción para verificar si la página ha expirado después de un cierto período.

const expiryDurationMins = 1

window.addEventListener('load', setInterval.bind(null, reloadPage.bind(null, expiryDurationMins), 1000))
Enogwe Victor
fuente
-1

Esta tarea es muy fácil de usar siguiendo el código en la sección de encabezado html

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

Actualizará su página después de 30 segundos.

FAISAL
fuente
2
En mi pregunta es necesario comprobar si hay actividad
Omar Adil
Sí querida, entonces tienes que usar la tecnología Ajax. a cambios contenido de etiqueta en particular html
FAISAL
Use la respuesta anterior con la sintaxis adecuada.
FAISAL
1
Este método que respondió no responde a la pregunta, ya que la pregunta es sobre cómo recargar si NO hay activación en la página, y su solución forzará automáticamente la recarga incluso si hay una actividad en la página. La respuesta buscada aquí es cómo hacer que se vuelva a cargar si no se usa el mouse o el teclado mientras se está en la página dentro de un período de tiempo. NOTA: Te digo esto porque yo mismo cometí el mismo error cuando respondí la última vez, así que cambié mi respuesta para que se ajustara a la pregunta.
SeekLoad