Як автоматично перезавантажувати сторінку після певного періоду бездіяльності


Відповіді:


217

Якщо ви хочете оновити сторінку, якщо немає ніякої активності, вам потрібно визначити, як визначити активність. Скажімо, ми оновлюємо сторінку щохвилини, якщо хтось не натисне клавішу або не перемістить мишу. Тут використовується jQuery для прив'язки подій:

<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
чому б ви встановили інтервал у 10000, якщо він обчислює використання 60000? Принаймні на 5 витків це буде помилково?
Страшна вомба

2
Причина, чому інтервал нижче, ніж час бездіяльності, полягає в тому, що ви хочете перевірити час бездіяльності набагато вищою частотою, ніж фактичний час бездіяльності. Наприклад, якщо час бездіяльності становить 1 хвилину, а інтервал - 1 хвилина, якщо користувач перемістив мишу через 1 секунду, а потім зупинився, оновлення відбудеться лише через 2 хвилини. Чим менший інтервал, тим точнішим буде час оновлення.
Дерорист

227

Це можна здійснити без JavaScript, за допомогою цього метатегу:

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

де content = "5" - це секунди, які сторінка буде чекати, коли оновиться.

Але ви сказали, лише якщо б не було діяльності, який би це був вид діяльності?


2
Ніяка активність означає, що Кінцевий користувач не стоїть на столі та не відвідує якийсь інший сайт. Ніякої активності миші / КБ на сайті, про який я звертаюся.
Умар Аділь

2
чудова відповідь, думав, що це треба зробити setInterval, тому радий знати, що це існує!
tim peterson

11
незважаючи на те, що це не відповідь, оскільки він не фіксує активність, проте це питання було вгорі результатів пошуку Google, коли просто шукали оновлення JavaScript. Отже, якщо ви просто шукаєте, щоб сторінка автоматично оновлювалася протягом встановленого інтервалу, це шлях.
Джиммі Боссе

чи можемо ми зробити автоматичне оновлення змінними повідомленнями?
Pradeep Kumar Prabaharan

2
це не відповідає на питання. Якщо є діяльність, вона все одно перезавантажиться
Брайан Меллор

42

Я також створив повне рішення JavaScript, яке не вимагає jquery. Можливо, можна перетворити його на плагін. Я використовую його для автоматичного оновлення рідини, але, схоже, він може вам тут допомогти.

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
Це чудово. Бажаю, щоб ви тут більше звертали увагу. Якщо не використовувати JQuery, отримує основні бонусні бали.
Ехібан

1
* велике / велике спасибі * в цьому обліковому записі виявлення сенсорних подій?
sendbits

1
Хм ти знаєш, я не впевнений. Коли я його створив, у мене не було багато досвіду роботи з iPhone або iPad.
newdark-it

1
Герой! Це ідеально дякую. У мене встановлено, що мої сеанси PHP закінчуються через годину, і це налаштування буде оновлено трохи більше години. Я думаю, що це повинно завершити вихід після бездіяльності, яку я перебуваю після.
Тспеш

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

Вище буде оновлювати сторінку кожні 10 хвилин, якщо не буде викликано resetTimeout (). Наприклад:

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

2
Прихований евал - це чисте зло!
Стефан Вайнхолд

7

Виходячи з прийнятої відповіді Артурта. Це дещо оптимізована версія, але по суті робить те саме:

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

Різниця полягає лише в тому, що ця версія використовується setIntervalзамість setTimeout, що робить код більш компактним.


чому б ви встановили інтервал, 1000якщо він розраховується за допомогою 60000?
Страшна

3
Інтервал становить 1.000, оскільки він перевіряє щосекунди, чи була миша переміщена. Тоді 60 000 використовується для визначення того, чи відбувся останній рух миші хоча б хвилину тому.
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();
    }
}

Кожен раз, коли ви переміщуєте мишу, вона перевірятиме останній раз, коли ви переміщували мишу. Якщо інтервал часу перевищує 20 ', він перезавантажить сторінку, в іншому випадку оновиться миша, яка перейшла останнім часом.


2

Автоматичне перезавантаження з вибором цілі. У цьому випадку ціль _selfвстановлюється собі, але ви можете змінити сторінку для перезавантаження, просто змінивши window.open('self.location', '_self');код на щось подібне до цього прикладу window.top.location="window.open('http://www.YourPageAdress.com', '_self'";.

З повідомленням 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>

Без попередження підтвердження:

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

Код тіла є єдиним для обох рішень:

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

це не відповідає на питання. Якщо є діяльність, вона все одно перезавантажиться.
Браян Меллор

1
Ваше право, я не прочитав цілого питання. Гаразд, це ВИДАЛЕНО з правильною відповіддю.
SeekLoad

Я вийняв -1 і додав +10 для кращої відповіді! спасибі
Браян Меллор

У мене також є друга відповідь, яка працює, але зараз я точно налаштовую цю відповідь, оскільки це може бути краще з цільовим рішенням, як я її редагував зараз до.
SeekLoad

1
Я дав 3 відповіді на одне і те ж рішення, залежно від того, що відчувати простіше у застосуванні чи відповідно до потреб. Усі 3 рішення мають або без підтвердження, або без попередження. Я відповів 3 відповідями, оскільки 3 відповіді з різними кодами, і це було б занадто довго, щоб усі рішення були разом в одній відповіді. Також я додав пояснення, як редагувати коди, що колись використовувалися. Усі відповіді, звичайно, працюють чудово ... Це було випробувано ще до того, як я їх розмістив сюди.
SeekLoad


0

Так шановні, тоді вам доведеться використовувати технологію Ajax. щоб змінити вміст конкретного тегу 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

Я б вважав, activityорієнтований чи ні користувач на вікно. Наприклад, коли ви клацаєте з одного вікна в інше (наприклад, Google Chrome до iTunes або Tab 1 - Tab 2 в Інтернет-браузері), веб-сторінка може надіслати зворотній дзвінок із написом "Я не в фокусі!" або "Я у фокусі!". Можна використовувати jQuery, щоб використати цю можливу відсутність активності, щоб робити все, що завгодно. Якби я був на вашому положенні, я б використовував наступний код, щоб перевірити фокус кожні 5 секунд тощо, і перезавантажував би, якщо фокусу немає.

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

І нарешті найпростіше рішення:

З підтвердженням попередження:

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

Без підтвердження попередження:

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

Код тіла - єдиний для обох рішень

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

Я дав 3 відповіді на одне і те ж рішення, залежно від того, що відчувати простіше у застосуванні чи відповідно до потреб. Усі 3 рішення мають або без підтвердження, або без попередження. Я відповів 3 відповідями, оскільки 3 відповіді з різними кодами, і це було б занадто довго, щоб усі рішення були разом в одній відповіді. Також я додав пояснення, як редагувати коди, що колись використовувалися. Усі відповіді, звичайно, працюють чудово ... Це було випробувано ще до того, як я їх розмістив сюди.
SeekLoad

0

З текстом на сторінці підтвердження замість оповіщення

Оскільки це ще один метод автоматичного завантаження, якщо неактивний, я даю йому другу відповідь. Цей простіший і легший для розуміння.

З підтвердженням перезавантаження на сторінці

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

Поле підтвердження при використанні з підтвердженням на сторінці

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

Коди тіла для обох - ТОЖИЙ

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

ПРИМІТКА. Якщо ви не хочете мати підтвердження на сторінці, використовуйте Без підтвердження

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

Я дав 3 відповіді на одне і те ж рішення, залежно від того, що відчувати простіше у застосуванні чи відповідно до потреб. Усі 3 рішення мають або без підтвердження, або без попередження. Я відповів 3 відповідями, оскільки 3 відповіді з різними кодами, і це було б занадто довго, щоб усі рішення були разом в одній відповіді. Також я додав пояснення, як редагувати коди, що колись використовувалися. Усі відповіді, звичайно, працюють чудово ... Це було випробувано ще до того, як я їх розмістив сюди.
SeekLoad

0

Використовуючи LocalStorage для відстеження останнього часу діяльності, ми можемо записати функцію перезавантаження наступним чином

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

Потім ми створюємо функцію стрілки, яка зберігає останній час взаємодії в мілісекундах (String)

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

Нам потрібно буде прослухати beforeunloadподію у браузері, щоб очистити наш lastinteractionзапис, щоб ми не застрягли у нескінченному циклі перезавантаження.

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

Події діяльності користувачів, які нам потрібно буде відстежувати, були б mousemoveі keypress. Ми зберігаємо останній час взаємодії, коли користувач рухає мишкою або натискає клавішу на клавіатурі

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

Щоб встановити нашого остаточного слухача, ми будемо використовувати loadподію. Під час завантаження сторінки ми використовуємо setIntervalфункцію, щоб перевірити, чи закінчилась сторінка після певного періоду.

const expiryDurationMins = 1

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

-1

Це завдання дуже просто використовувати наступний код у розділі заголовка html

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

Це оновить вашу сторінку через 30 секунд.


2
У моєму запитанні нам потрібно перевірити відсутність активності
Umar Adil

Так шановні, тоді вам доведеться використовувати технологію Ajax. змінити вміст конкретного тегу html
FAISAL

Використовуйте вище відповідь із належним синтаксисом.
FAISAL

1
Цей спосіб, на який ви відповіли, не дає відповіді на запитання, оскільки питання полягає у тому, як перезавантажити, якщо на сторінці НЕ активується НЕ, і ваше рішення автоматично змусить перезавантажити, навіть якщо є активність на сторінці. Тут шукається відповідь - як змусити її перезавантажити, якщо на сторінці протягом декількох днів не з’являється миша чи клавіатура. ПРИМІТКА: Я говорю вам це, тому що я сам зробив ту саму помилку, коли відповідав востаннє, тому змінив свою відповідь, щоб відповідати цьому питанню.
SeekLoad
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.