Jak automatycznie przeładować stronę po określonym okresie bezczynności

Odpowiedzi:

217

Jeśli chcesz odświeżyć stronę, jeśli nie ma żadnej aktywności, musisz dowiedzieć się, jak zdefiniować aktywność. Powiedzmy, że odświeżamy stronę co minutę, chyba że ktoś naciśnie klawisz lub poruszy myszą. To używa jQuery do wiązania zdarzeń:

<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>
Sztuka
źródło
5
dlaczego miałbyś ustawić interwał na 10000, jeśli oblicza się za pomocą 60000? Co najmniej przez 5 tur będzie fałszywa?
Scary Wombat,
2
Przyczyną, dla której interwał jest krótszy niż czas braku aktywności, jest to, że chcesz sprawdzić czas braku aktywności z dużo większą częstotliwością niż rzeczywisty czas braku aktywności. Na przykład, jeśli czas braku aktywności wynosi 1 minutę, a interwał wynosi 1 minutę, jeśli użytkownik poruszył myszą po 1 sekundzie, a następnie zatrzymał się, odświeżanie nastąpi dopiero po 2 minutach. Im niższy interwał, tym dokładniejszy będzie czas odświeżania.
Derorrist,
227

Można to zrobić bez javascript, za pomocą tego metatagu:

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

gdzie content = „5” to sekundy, przez które strona będzie czekać do odświeżenia.

Ale powiedziałeś tylko, że gdyby nie było żadnej aktywności, jakiego rodzaju byłaby to działalność?

amosrivera
źródło
2
Brak aktywności oznacza, że ​​użytkownik końcowy nie jest na biurku ani nie przegląda innej witryny. Brak aktywności myszy / KB w witrynie, o którą się odnoszę.
Umar Adil
2
świetna odpowiedź, pomyślałem, że trzeba to zrobić setInterval, więc cieszę się, że to istnieje!
tim peterson
11
upvoted, mimo że nie jest to odpowiedź, ponieważ nie przechwytuje aktywności, jednak to pytanie znajdowało się na górze wyników wyszukiwania Google, gdy po prostu szukałem odświeżania javascript. Tak więc, jeśli po prostu chcesz, aby strona automatycznie odświeżała się w ustalonych odstępach czasu, to jest droga do zrobienia.
Jimmy Bosse,
czy możemy zrobić automatyczne odświeżanie ze zmiennymi postów?
Pradeep Kumar Prabaharan
2
to nie jest odpowiedzią na pytanie. Jeśli jest aktywność, i tak zostanie ponownie załadowana
Braian Mellor
42

Zbudowałem również kompletne rozwiązanie javascript, które nie wymaga jquery. Może uda się przekształcić go we wtyczkę. Używam go do automatycznego odświeżania płynu, ale wygląda na to, że może ci pomóc.

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
źródło
2
To jest świetne. Żałuję, że nie otrzymałeś więcej głosów tutaj. Nieużywanie JQuery daje duże punkty bonusowe.
Echiban
1
* wielkie / wielkie dzięki * czy to konto służy do wykrywania zdarzeń dotykowych?
sendbits
1
Hmm, wiesz, nie jestem pewien. Kiedy ją tworzyłem, nie miałem dużego doświadczenia z iPhonem czy iPadem.
newdark-it
1
Bohater! To jest idealne, dzięki. Moje sesje PHP mają wygasać po godzinie, a to jest ustawione na nieco ponad godzinę. Myślę, że powinno to spowodować wylogowanie po funkcji nieaktywności, której szukam.
Tspesh
24
<script type="text/javascript">
  var timeout = setTimeout("location.reload(true);",600000);
  function resetTimeout() {
    clearTimeout(timeout);
    timeout = setTimeout("location.reload(true);",600000);
  }
</script>

Powyższe będzie odświeżać stronę co 10 minut, chyba że zostanie wywołana funkcja resetTimeout (). Na przykład:

<a href="javascript:;" onclick="resetTimeout();">clicky</a>
Yuriy Faktorovich
źródło
2
Domniemana ocena jest czystym złem!
Stephan Weinhold
7

Na podstawie zaakceptowanej odpowiedzi arturnt. Jest to nieco zoptymalizowana wersja, ale zasadniczo robi to samo:

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

Jedyną różnicą jest to, że ta wersja używa setIntervalzamiast setTimeout, co sprawia, że ​​kod jest bardziej zwarty.

Hannes Sachsenhofer
źródło
dlaczego miałbyś ustawić interwał na, 1000jeśli oblicza za pomocą 60000?
Scary Wombat,
3
Interwał wynosi 1.000, ponieważ co sekundę sprawdza, czy mysz została przesunięta. Wartość 60.000 jest następnie używana do określenia, czy ostatni ruch myszy miał miejsce co najmniej minutę temu.
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();
    }
}

Za każdym razem, gdy poruszasz myszą, sprawdzane jest, kiedy ostatnio poruszałeś myszą. Jeśli przedział czasu jest większy niż 20 minut, strona zostanie ponownie załadowana, w przeciwnym razie odnowi ostatni raz, gdy przesunąłeś mysz.

mike_x_
źródło
2

Automatycznie przeładuj wybrany cel. W tym przypadku cel jest _selfustawiony na siebie, ale możesz zmienić stronę ponownego ładowania, po prostu zmieniając window.open('self.location', '_self');kod na podobny do tego przykładu window.top.location="window.open('http://www.YourPageAdress.com', '_self'";.

Z potwierdzeniem Komunikat 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>

Bez alertu potwierdzającego:

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

Kod ciała jest taki sam dla obu rozwiązań:

<body onLoad="set_interval(); document.form1.exp_dat.focus();" onKeyPress="reset_interval();" onmousemove="reset_interval();" onclick="reset_interval();" onscroll="reset_interval();">
SeekLoad
źródło
to nie jest odpowiedzią na pytanie. Jeśli jest aktywność, i tak zostanie ona ponownie załadowana.
Braian Mellor
1
Twoje prawo, nie przeczytałem całego pytania. OK, teraz jest EDYTOWANY z poprawną odpowiedzią.
SeekLoad
Wyciągnąłem -1 i dodałem +10, aby uzyskać lepszą odpowiedź! dzięki
Braian Mellor
Mam również drugą odpowiedź, która działa, ale teraz dostosowuję tę odpowiedź, ponieważ może być lepsza z ukierunkowanym rozwiązaniem, tak jak je teraz zredagowałem.
SeekLoad
1
Udzieliłem teraz 3 odpowiedzi dla tego samego rozwiązania, w zależności od tego, co wydaje się łatwiejsze do zastosowania lub odpowiada potrzebom. Wszystkie 3 rozwiązania mają potwierdzenie lub ostrzeżenie lub bez. Odpowiedziałem z 3 odpowiedziami, ponieważ 3 odpowiedzi mają różne kody i byłoby zbyt długo mieć wszystkie rozwiązania razem w jednej odpowiedzi. Dodałem również wyjaśnienia, jak edytować używane kody. Wszystkie odpowiedzi oczywiście działają idealnie ... Zostało to przetestowane, zanim je tutaj umieściłem.
SeekLoad
2

użyj setIntervalmetody JavaScript :

setInterval(function(){ location.reload(); }, 3000);
Syed Mahfuzul Mazid
źródło
0

Tak kochanie, więc musisz użyć technologii Ajax. aby zmienić zawartość danego tagu 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>
FAISAL
źródło
0

Zastanowiłbym activitysię, czy użytkownik koncentruje się na oknie. Na przykład, gdy klikniesz z jednego okna do drugiego (np. Google Chrome do iTunes lub Tab 1 do Tab 2 w przeglądarce internetowej), strona internetowa może wysłać wywołanie zwrotne o treści „Jestem nieostry!” lub „Jestem w centrum uwagi!”. Można by użyć jQuery, aby wykorzystać ten możliwy brak aktywności do robienia wszystkiego, co chcieli. Gdybym był na twoim miejscu, użyłbym następującego kodu do sprawdzania fokusu co 5 sekund itp. I ponownego ładowania, jeśli nie ma fokusa.

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
źródło
0

I wreszcie najprostsze rozwiązanie:

Z potwierdzeniem alertu:

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

Bez potwierdzenia ostrzeżenia:

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

Kod ciała jest taki sam dla obu rozwiązań

<body onload="StartTimers();" onmousemove="ResetTimers();" onKeyPress="ResetTimers();">
SeekLoad
źródło
Udzieliłem teraz 3 odpowiedzi dla tego samego rozwiązania, w zależności od tego, co wydaje się łatwiejsze do zastosowania lub odpowiada potrzebom. Wszystkie 3 rozwiązania mają potwierdzenie lub ostrzeżenie lub bez. Odpowiedziałem z 3 odpowiedziami, ponieważ 3 odpowiedzi mają różne kody i byłoby zbyt długo mieć wszystkie rozwiązania razem w jednej odpowiedzi. Dodałem również wyjaśnienia, jak edytować używane kody. Wszystkie odpowiedzi oczywiście działają idealnie ... Zostało to przetestowane, zanim je tutaj umieściłem.
SeekLoad
0

Zawiera tekst potwierdzenia na stronie zamiast alertu

Ponieważ jest to kolejna metoda automatycznego ładowania, jeśli jest nieaktywna, daję jej drugą odpowiedź. Ten jest prostszy i łatwiejszy do zrozumienia.

Z potwierdzeniem ponownego załadowania na stronie

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

Pole potwierdzenia podczas używania z potwierdzeniem na stronie

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

Kody treści dla obu są TAKIE SAME

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

UWAGA: Jeśli nie chcesz, aby potwierdzenie na stronie było wyświetlane, użyj opcji Bez potwierdzenia

<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
źródło
Udzieliłem teraz 3 odpowiedzi dla tego samego rozwiązania, w zależności od tego, co wydaje się łatwiejsze do zastosowania lub odpowiada potrzebom. Wszystkie 3 rozwiązania mają potwierdzenie lub ostrzeżenie lub bez. Odpowiedziałem z 3 odpowiedziami, ponieważ 3 odpowiedzi mają różne kody i byłoby zbyt długo mieć wszystkie rozwiązania razem w jednej odpowiedzi. Dodałem również wyjaśnienia, jak edytować używane kody. Wszystkie odpowiedzi oczywiście działają idealnie ... Zostało to przetestowane, zanim je tutaj umieściłem.
SeekLoad
0

Używając LocalStorage do śledzenia ostatniego czasu aktywności, możemy napisać funkcję przeładowania w następujący sposób

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

Następnie tworzymy funkcję strzałkową, która zapisuje ostatni czas interakcji w milisekundach (String)

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

Będziemy musieli odsłuchać beforeunloadzdarzenie w przeglądarce, aby wyczyścić nasz lastinteractionrekord, aby nie utknąć w nieskończonej pętli przeładowania.

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

Zdarzenia aktywności użytkowników, które będziemy musieli monitorować, to mousemovei keypress. Przechowujemy czas ostatniej interakcji, kiedy użytkownik poruszy myszką lub naciśnie klawisz na klawiaturze

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

Aby ustawić naszego końcowego słuchacza, użyjemy loadzdarzenia. Podczas ładowania strony używamy tej setIntervalfunkcji, aby sprawdzić, czy strona wygasła po określonym czasie.

const expiryDurationMins = 1

window.addEventListener('load', setInterval.bind(null, reloadPage.bind(null, expiryDurationMins), 1000))
Enogwe Victor
źródło
-1

To zadanie jest bardzo łatwe w użyciu po kodzie w sekcji nagłówka html

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

Odświeży Twoją stronę po 30 sekundach.

FAISAL
źródło
2
W moim pytaniu musimy sprawdzić brak aktywności
Umar Adil
Tak kochanie, więc musisz użyć technologii Ajax. aby zmienić zawartość konkretnego tagu html
FAISAL
Użyj powyższej odpowiedzi z poprawną składnią.
FAISAL
1
Ta metoda, na którą odpowiedziałeś, nie odpowiada na pytanie, ponieważ pytanie dotyczy tego, jak przeładować, jeśli NIE ma aktywacji na stronie, a twoje rozwiązanie automatycznie wymusi ponowne załadowanie, nawet jeśli na stronie jest aktywność. Poszukiwana tutaj odpowiedź brzmi: jak ją przeładować, jeśli nie ma myszy ani klawiatury, gdy jesteś na stronie w określonym czasie. UWAGA: Mówię ci to, ponieważ sam popełniłem ten sam błąd, kiedy odpowiadałem ostatnim razem, więc zmieniłem odpowiedź, aby pasowała do pytania.
SeekLoad