Come ricaricare automaticamente una pagina dopo un determinato periodo di inattività


Risposte:


217

Se si desidera aggiornare la pagina in assenza di attività, è necessario capire come definire l'attività. Supponiamo di aggiornare la pagina ogni minuto, a meno che qualcuno non prema un tasto o muova il mouse. Questo utilizza jQuery per l'associazione di eventi:

<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
perché dovresti impostare l'intervallo su 10000 se sta calcolando usando 60000? Per almeno 5 turni sarà falso?
Scary Wombat,

2
Il motivo per cui l'intervallo è inferiore al tempo di inattività è che si desidera controllare il tempo di inattività con una frequenza molto più elevata del tempo di inattività effettivo. Ad esempio, se il tempo di inattività è di 1 minuto e l'intervallo è di 1 minuto, se l'utente sposta il mouse dopo 1 secondo e poi si interrompe, l'aggiornamento avverrà solo dopo 2 minuti. Più basso è l'intervallo, più accurato sarà il tempo di aggiornamento.
Derorrist,

227

Questo può essere realizzato senza javascript, con questo metatag:

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

dove content = "5" sono i secondi che la pagina attenderà fino all'aggiornamento.

Ma hai detto solo se non ci fosse attività, che tipo di attività sarebbe?


2
Nessuna attività significa che l'utente finale non è sulla scrivania o naviga in qualche altro sito. Nessuna attività del mouse / KB sul sito a cui mi riferisco.
Umar Adil,

2
ottima risposta, ho pensato che fosse necessario farlo setInterval, così felice di sapere che esiste!
Tim Peterson,

11
valutato anche se questa non è la risposta perché non acquisisce attività, tuttavia questa domanda era in cima ai risultati di ricerca di Google quando cercava semplicemente javascript refresh. Quindi, se stai semplicemente cercando di aggiornare automaticamente la pagina a intervalli prestabiliti, questa è la strada da percorrere.
Jimmy Bosse,

possiamo eseguire l'aggiornamento automatico con le variabili post?
Pradeep Kumar Prabaharan,

2
questo non risponde alla domanda. Se c'è un'attività, questa verrà ricaricata comunque
Braian Mellor il

42

Ho creato anche una soluzione javascript completa che non richiede jquery. Potrebbe essere in grado di trasformarlo in un plugin. Lo uso per un auto-aggiornamento fluido, ma sembra che potrebbe aiutarti qui.

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
Questo è fantastico Vorrei che tu abbia ottenuto più voti qui. Non utilizzare JQuery ottiene importanti punti bonus.
Echiban,

1
* ottimo / molte grazie * questo account per rilevare eventi touch?
Sendbits,

1
Hmm sai che non ne sono sicuro. Quando l'ho creato non avevo molta esperienza con iPhone o iPad.
newdark-it

1
Eroe! Questo è perfetto grazie. Ho le mie sessioni PHP che scadranno dopo un'ora, e questo è impostato per aggiornarsi poco più di un'ora. Penso che questo dovrebbe realizzare la disconnessione dopo la funzionalità di inattività che sto cercando.
Tspesh,

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

Sopra aggiornerà la pagina ogni 10 minuti a meno che non venga chiamato resetTimeout (). Per esempio:

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

2
Eval implicito è puro male!
Stephan Weinhold,

7

Basato sulla risposta accettata di arturnt. Questa è una versione leggermente ottimizzata, ma essenzialmente fa la stessa cosa:

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

L'unica differenza è che questa versione utilizza setIntervalinvece di setTimeout, il che rende il codice più compatto.


perché dovresti impostare l'intervallo su 1000se si sta utilizzando il calcolo 60000?
Scary Wombat,

3
L'intervallo è 1.000 perché controlla ogni secondo se il mouse è stato spostato. I 60.000 vengono quindi utilizzati per determinare se l'ultima mossa del mouse è avvenuta almeno un minuto fa.
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();
    }
}

Ogni volta che sposti il ​​mouse controllerà l'ultima volta che hai spostato il mouse. Se l'intervallo di tempo è maggiore di 20 'ricaricherà la pagina, altrimenti rinnoverà l'ultima volta che hai spostato il mouse.


2

Ricarica automatica con target a tua scelta. In questo caso target è _selfimpostato su se stesso, ma è possibile modificare la pagina di ricarica semplicemente cambiando il window.open('self.location', '_self');codice in qualcosa di simile a questo esempio window.top.location="window.open('http://www.YourPageAdress.com', '_self'";.

Con un messaggio di conferma ALERT:

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

Senza avviso di conferma:

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

Il codice del corpo è lo STESSO per entrambe le soluzioni:

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

questo non risponde alla domanda. Se c'è un'attività, questa verrà ricaricata comunque.
Braian Mellor,

1
Esatto, non ho letto l'intera domanda. Va bene ora è modificato con la risposta corretta.
Cerca

Ho eliminato il -1 e ho aggiunto +10 per avere una risposta migliore! grazie
Braian Mellor

Ho anche una seconda risposta che funziona, ma in questo momento ho messo a punto questa risposta perché può essere migliore con una soluzione mirata come l'ho modificata ora.
Cerca

1
Ho dato 3 risposte ora per la stessa soluzione, a seconda di ciò che sembra più facile da applicare o adatto alle esigenze. Tutte e 3 le soluzioni hanno con o senza conferma o avviso. Ho risposto con 3 risposte poiché le 3 risposte sono con codici diversi e sarebbe troppo lungo avere tutte le soluzioni insieme in un'unica risposta. Inoltre ho aggiunto spiegazioni su come modificare i codici una volta utilizzati. Tutte le risposte ovviamente funzionano perfettamente ... È stato testato prima di metterle qui.
Cerca


0

Sì cara, allora devi usare la tecnologia Ajax. per modificare i contenuti di un particolare tag html:

 <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

Vorrei considerare activityse l'utente è concentrato sulla finestra. Ad esempio, quando si fa clic da una finestra all'altra (ad es. Google Chrome su iTunes o da Tab 1 a Tab 2 all'interno di un browser Internet), la pagina Web può inviare una richiamata che dice "Sono fuori fuoco!" o "Sono a fuoco!". Si potrebbe usare jQuery per sfruttare questa possibile mancanza di attività per fare ciò che volevano. Se fossi nella tua posizione, userei il seguente codice per verificare la messa a fuoco ogni 5 secondi, ecc. E ricaricare se non ci fosse la messa a fuoco.

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 infine la soluzione più semplice:

Con conferma dell'avviso:

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

Senza conferma dell'avviso:

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

Il codice del corpo è lo STESSO per entrambe le soluzioni

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

Ho dato 3 risposte ora per la stessa soluzione, a seconda di ciò che sembra più facile da applicare o adatto alle esigenze. Tutte e 3 le soluzioni hanno con o senza conferma o avviso. Ho risposto con 3 risposte poiché le 3 risposte sono con codici diversi e sarebbe troppo lungo avere tutte le soluzioni insieme in un'unica risposta. Inoltre ho aggiunto spiegazioni su come modificare i codici una volta utilizzati. Tutte le risposte ovviamente funzionano perfettamente ... È stato testato prima di metterle qui.
Cerca

0

Con testo di conferma sulla pagina anziché avviso

Poiché questo è un altro metodo per caricare automaticamente se inattivo, gli do una seconda risposta. Questo è più semplice e più facile da capire.

Con conferma di ricarica sulla pagina

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

Casella di conferma quando si utilizza con la conferma sulla pagina

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

I codici del corpo per entrambi sono gli stessi

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

NOTA: se non si desidera avere la conferma sulla pagina, utilizzare Senza conferma

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

Ho dato 3 risposte ora per la stessa soluzione, a seconda di ciò che sembra più facile da applicare o adatto alle esigenze. Tutte e 3 le soluzioni hanno con o senza conferma o avviso. Ho risposto con 3 risposte poiché le 3 risposte sono con codici diversi e sarebbe troppo lungo avere tutte le soluzioni insieme in un'unica risposta. Inoltre ho aggiunto spiegazioni su come modificare i codici una volta utilizzati. Tutte le risposte ovviamente funzionano perfettamente ... È stato testato prima di metterle qui.
Cerca

0

Utilizzando LocalStorage per tenere traccia dell'ultima volta dell'attività, possiamo scrivere la funzione di ricarica come segue

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

Quindi creiamo una funzione freccia che salva l'ultima volta dell'interazione in millisecondi (String)

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

Dovremo ascoltare l' beforeunloadevento nel browser per cancellare il nostro lastinteractionrecord in modo da non rimanere bloccati in un ciclo di ricarica infinito.

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

Gli eventi di attività dell'utente che dovremo monitorare sarebbero mousemovee keypress. Memorizziamo l'ora dell'ultima interazione quando l'utente sposta il mouse o preme un tasto sulla tastiera

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

Per impostare il nostro ascoltatore finale, utilizzeremo l' loadevento. Al caricamento della pagina, utilizziamo la setIntervalfunzione per verificare se la pagina è scaduta dopo un determinato periodo.

const expiryDurationMins = 1

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

-1

Questa attività è molto semplice da usare seguendo il codice nella sezione dell'intestazione html

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

Aggiorna la tua pagina dopo 30 secondi.


2
Nella mia domanda dobbiamo verificare l'assenza di attività
Umar Adil il

Sì cara, allora devi usare la tecnologia Ajax. per modificare i contenuti di un particolare tag html
FAISAL

Utilizzare la risposta sopra con la sintassi corretta.
FAISAL

1
Questo metodo a cui hai risposto non risponde alla domanda, poiché la domanda riguarda come ricaricare se NON è attiva la pagina e la tua soluzione forzerà automaticamente il ricaricamento anche se c'è un'attività sulla pagina. La risposta cercata qui è come ricaricarla se non ci sono mouse o tastiera mentre si utilizza la pagina per un certo periodo di tempo. NOTA: te lo sto dicendo perché io stesso ho fatto lo stesso errore quando ho risposto l'ultima volta, quindi ho cambiato la mia risposta per adattarla alla domanda.
SeekLoad
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.