Как автоматически перезагрузить страницу после определенного периода бездействия

117

Как я могу автоматически перезагрузить веб-страницу, если на странице не было активности на определенный период времени?

Теги:

12 ответов

181
Лучший ответ

Если вы хотите обновить страницу, если нет активности, вам нужно выяснить, как определить активность. Скажем, мы обновляем страницу каждую минуту, если кто-то не нажимает клавишу или не перемещает мышь. Это использует 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>
  • 1
    это работает с сенсорным событием тоже?
  • 4
    зачем вам устанавливать интервал в 10000, если он рассчитывается с использованием 60000? Как минимум 5 витков это будет ложь?
162

Это может быть выполнено без javascript с помощью этого метатега:

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

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

Но вы сказали, что если бы не было никакой активности, какой вид деятельности был бы?

  • 2
    Отсутствие активности означает, что Конечный пользователь не находится на рабочем столе или не просматривает какой-либо другой сайт. Нет активности мыши / KB на сайте, на который я ссылаюсь.
  • 2
    отличный ответ, думал, что это должно быть сделано с setInterval , так что рад знать, что это существует!
Показать ещё 7 комментариев
22
<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>
  • 0
    благодарю вас! 10 минут будет 600000, хотя ;-)
  • 2
    Подразумеваемый eval - чистое зло!
18

Я создал полное javascript-решение, которое не требует jquery. Мог бы превратить его в плагин. Я использую его для жидкостного автоматического обновления, но похоже, что он может помочь вам здесь.

JSFiddle AutoRefresh

var refresh_rate = 200; //<-- In seconds, change to your needs
var last_user_action = 0;
var has_focus = false;
var lost_focus_count = 0;
var focus_margin = 10; // If we lose focus more then the margin we want to refresh


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

setInterval(function () {
    last_user_action++;
    refreshCheck();
}, 1000);

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);
  • 1
    Это замечательно. Жаль, что вы получили больше голосов здесь. Не используя JQuery получает основные бонусные очки.
  • 0
    * большое / большое спасибо * это аккаунт для обнаружения сенсорных событий?
Показать ещё 2 комментария
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 ', он перезагрузит страницу, иначе он обновит прокрутку в последний раз-вы-перемещаемую.

1

Автозагрузка с целью по вашему выбору. В этом случае цель _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();">
  • 0
    это не ответ на вопрос. Если есть активность, она все равно перезагрузится.
  • 1
    Ваше право, я не прочитал весь вопрос. Хорошо, теперь он отредактирован с правильным ответом.
Показать ещё 3 комментария
1

На основании принятого ответа 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, что делает код более компактным.

  • 0
    зачем вам устанавливать интервал в 1000 если он рассчитывается с использованием 60000 ?
  • 3
    Интервал составляет 1000, потому что он проверяет каждую секунду, была ли перемещена мышь. Затем 60.000 используется, чтобы определить, произошло ли последнее движение мыши хотя бы минуту назад.
1

Эта задача очень проста в использовании следующего кода в разделе заголовка html

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

Он обновит вашу страницу через 30 секунд.

  • 2
    В моем вопросе нам нужно проверить отсутствие активности
  • 0
    Да, дорогой, тогда вы должны использовать технологию Ajax. изменить содержимое определенного HTML-тега
Показать ещё 2 комментария
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>

Код тела является SAME для обоих решений

<body onload="StartTimers();" onmousemove="ResetTimers();" onKeyPress="ResetTimers();">
  • 0
    Я дал 3 ответа для одного и того же решения, в зависимости от того, что легче применять или соответствует потребностям. Все 3 решения имеют с или без подтверждения или предупреждения. Я ответил 3-мя ответами, так как 3-х ответов с разными кодами, и было бы слишком долго, чтобы все решения вместе в одном ответе. Также я добавил пояснения к тому, как редактировать коды, когда-то использованные. Все ответы, конечно, работают отлично ... Это было проверено, прежде чем я положил их здесь.
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>
  • 0
    Я дал 3 ответа для одного и того же решения, в зависимости от того, что легче применять или соответствует потребностям. Все 3 решения имеют с или без подтверждения или предупреждения. Я ответил 3-мя ответами, так как 3-х ответов с разными кодами, и было бы слишком долго, чтобы все решения вместе в одном ответе. Также я добавил пояснения к тому, как редактировать коды, когда-то использованные. Все ответы, конечно, работают отлично ... Это было проверено, прежде чем я положил их здесь.
0

Я бы рассмотрел activity, будет ли пользователь сфокусирован на окне. Например, когда вы щелкаете из одного окна в другое (например, Google Chrome в iTunes или с вкладки 1 на вкладку 2 в интернет-браузере), веб-страница может отправлять обратный вызов "Im не в фокусе!". или "Я в фокусе!". Можно использовать 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

Да, дорогая, вам нужно использовать технологию 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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню