Як я можу автоматично перезавантажувати веб-сторінку, якщо не було жодної активності на сторінці протягом певного періоду часу?
Як я можу автоматично перезавантажувати веб-сторінку, якщо не було жодної активності на сторінці протягом певного періоду часу?
Відповіді:
Якщо ви хочете оновити сторінку, якщо немає ніякої активності, вам потрібно визначити, як визначити активність. Скажімо, ми оновлюємо сторінку щохвилини, якщо хтось не натисне клавішу або не перемістить мишу. Тут використовується 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>
Це можна здійснити без JavaScript, за допомогою цього метатегу:
<meta http-equiv="refresh" content="5" >
де content = "5" - це секунди, які сторінка буде чекати, коли оновиться.
Але ви сказали, лише якщо б не було діяльності, який би це був вид діяльності?
setInterval
, тому радий знати, що це існує!
Я також створив повне рішення JavaScript, яке не вимагає jquery. Можливо, можна перетворити його на плагін. Я використовую його для автоматичного оновлення рідини, але, схоже, він може вам тут допомогти.
// 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);
<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>
Виходячи з прийнятої відповіді Артурта. Це дещо оптимізована версія, але по суті робить те саме:
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
?
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 ', він перезавантажить сторінку, в іншому випадку оновиться миша, яка перейшла останнім часом.
Автоматичне перезавантаження з вибором цілі. У цьому випадку ціль _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();">
використовувати setInterval
метод JavaScript :
setInterval(function(){ location.reload(); }, 3000);
Так шановні, тоді вам доведеться використовувати технологію 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>
Я б вважав, 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
І нарешті найпростіше рішення:
З підтвердженням попередження:
<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();">
З текстом на сторінці підтвердження замість оповіщення
Оскільки це ще один метод автоматичного завантаження, якщо неактивний, я даю йому другу відповідь. Цей простіший і легший для розуміння.
З підтвердженням перезавантаження на сторінці
<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>
Використовуючи 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))
Це завдання дуже просто використовувати наступний код у розділі заголовка html
<head> <meta http-equiv="refresh" content="30" /> </head>
Це оновить вашу сторінку через 30 секунд.