在给定的闲置时间后如何自动重新加载页面


Answers:


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
如果使用60000计算间隔,为什么将间隔设置为10000?至少5圈会是假的?
可怕的袋熊

2
间隔小于非活动时间的原因是您要以比实际非活动时间高得多的频率检查非活动时间。例如,如果不活动时间为1分钟,间隔为1分钟,则如果用户在1秒后移动鼠标然后停止,则刷新将仅在2分钟后发生。间隔越短,刷新时间将越准确。
Derorrist

227

无需JavaScript,可以使用以下元标记来完成此操作:

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

其中content =“ 5”是页面将等待刷新的秒数。

但是您只说如果没有活动,那将是什么样的活动?


2
无活动表示最终用户不在办公桌上或在其他网站上冲浪。我要引用的网站上没有Mouse / KB活动。
Umar Adil'1

2
很好的答案,以为必须这样做setInterval,很高兴知道这个存在!
蒂姆·彼得森2014年

11
尽管这不是答案,因为它无法捕获活动,但仍予以支持。但是,当单纯寻找javascript刷新时,此问题位于Google搜索结果的顶部。因此,如果您只是想让页面按设定的时间间隔自动刷新,这就是方法。
Jimmy Bosse 2014年

我们可以用post变量自动刷新吗?
Pradeep Kumar Prabaharan 2015年

2
这没有回答问题。如果有活动,它仍然会重新加载
Braian Mellor

42

我已经建立了一个完整的javascript解决方案,并且不需要jquery。可能可以将其变成插件。我将其用于流畅的自动刷新,但看起来它可以在这里为您提供帮助。

JSFiddle自动刷新

// 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可获得主要的奖励积分。
Echiban '16

1
*非常感谢!*这是否用于检测触摸事件?
sendbits

1
嗯,你知道我不确定。创建它时,我对iPhone或iPad的使用经验并不丰富。
newdark-it

1
英雄!非常感谢。我将PHP会话设置为在一个小时后到期,并且将其设置为刷新一个多小时。我认为这应该在我没有活动功能之后完成注销。
Tspesh

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

除非调用resetTimeout(),否则上面的代码每10分钟刷新一次页面。例如:

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

2
隐含的评估是纯净的邪恶!
Stephan Weinhold '16

7

基于arturnt的公认答案。这是一个经过稍微优化的版本,但实际上具有相同的功能:

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
吓人的袋熊,2015年

3
间隔为1.000,因为它每秒检查一次鼠标是否被移动。然后使用60.000来确定最后一次鼠标移动是否至少在一分钟前发生了。
汉尼斯·萨森霍夫

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'";

带有一条确认警报消息:

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

我拿出-1并加了+10,以获得更好的答案!感谢
Braian Mellor

我还有一个有效的第二个答案,但是现在我微调此答案,因为使用我现在编辑的目标解决方案可能会更好。
SeekLoad '17

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是否用户专注于窗口。例如,当您从一个窗口单击到另一个窗口(例如,从Internet浏览器中的Google Chrome浏览器到iTunes,或从选项卡1到选项卡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跟踪上一次活动的时间,我们可以编写如下的reload函数

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

然后,我们创建一个箭头函数,以毫秒为单位保存上一次交互的时间(字符串)

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

我们将需要beforeunload在浏览器中监听事件以清除lastinteraction记录,这样我们就不会陷入无限的重载循环中。

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

我们将需要监视的用户活动事件为mousemovekeypress。当用户移动鼠标或按下键盘上的键时,我们存储最后一次交互时间

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

以正确的语法使用以上答案。
FAISAL 2013年

1
您回答的此方法无法解决问题,因为问题是关于页面上没有激活时如何重新加载,即使页面上有活动,您的解决方案也会自动强制重新加载。在此搜索的答案是,如果在一定时间内页面上没有鼠标或键盘的使用,则如何重新加载它。注意:我告诉您这是因为我上次回答时我自己也犯了同样的错误,所以我更改了答案以适合该问题。
SeekLoad
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.