일정 시간 동안 작업이 없으면 자동으로 페이지를 다시로드하는 방법


답변:


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 턴 동안은 거짓입니까?
Scary Wombat 2016 년

2
간격이 비활성 시간보다 낮은 이유는 실제 비활성 시간보다 훨씬 높은 빈도로 비활성 시간을 확인하기 때문입니다. 예를 들어, 비활성 시간이 1 분이고 간격이 1 분인 경우, 사용자가 1 초 후에 마우스를 움직 인 다음 중지하면 새로 고침은 2 분 후에 만 ​​발생합니다. 간격이 짧을수록 새로 고침 시간이 더 정확 해집니다.
Derorrist

227

이 메타 태그를 사용하면 자바 스크립트없이 수행 할 수 있습니다.

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

여기서 content = "5"는 페이지가 새로 고쳐질 때까지 기다리는 초입니다.

그러나 활동이없는 경우에만 어떤 종류의 활동을 하시겠습니까?


2
활동 없음은 최종 사용자가 책상 위에 있지 않거나 다른 사이트를 서핑하고 있음을 의미합니다. 내가 언급 한 사이트에서 마우스 / KB 활동이 없습니다.
Umar Adil

2
큰 대답은 이것이 완료되어야한다고 생각 setInterval했기 때문에 이것이 존재한다는 것을 알게되어 기쁩니다!
팀 피터슨

11
활동을 캡처하지 않기 때문에 이것이 대답이 아니지만 상향 조정되었지만이 질문은 단순히 자바 스크립트 새로 고침을 찾을 때 Google 검색 결과의 최상위에있었습니다. 따라서 설정된 간격으로 페이지를 자동으로 새로 고치려는 경우이 방법을 사용하십시오.
Jimmy Bosse

포스트 변수로 자동 새로 고침을 할 수 있습니까?
Pradeep Kumar Prabaharan

2
이것은 질문에 대답하지 않습니다. 활동이 있으면 어쨌든 다시로드됩니다
Braian Mellor

42

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

1
* 큰 / 많은 감사 * 터치 이벤트 감지에 대한 설명입니까?
sendbits

1
흠, 잘 모르겠다. 내가 그것을 만들었을 때 나는 iPhone이나 iPad에 대한 경험이 많지 않았습니다.
newdark-it 2016

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

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합니까?
Scary Wombat

3
마우스가 움직 였는지 확인하기 때문에 간격은 1.000입니다. 그런 다음 60.000은 최소한 1 분 전에 마지막 마우스 이동이 발생했는지 확인하는 데 사용됩니다.
Hannes Sachsenhofer 2016 년

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

이것은 질문에 대답하지 않습니다. 활동이 있으면 어쨌든 다시로드됩니다.
Braian Mellor

1
당신의 권리, 나는 전체 질문을 읽지 않았습니다. 이제 정답으로 편집되었습니다.
SeekLoad

나는 더 나은 답변을 얻기 위해 -1을 꺼내고 +10을 추가했습니다! 감사
Braian 멜러

또한 작동하는 두 번째 답변이 있지만 지금은이 솔루션을 편집 할 때 대상 솔루션으로 더 좋을 수 있으므로이 답변을 미세 조정하십시오.
SeekLoad

1
더 쉽게 적용하거나 필요에 맞는 것에 따라 동일한 솔루션에 대해 3 가지 답변을했습니다. 3 가지 솔루션 모두 확인 또는 경고 유무에 관계없이 있습니다. 3 개의 답변이 다른 코드로되어 있기 때문에 3 개의 답변으로 답변했으며 모든 솔루션을 하나의 답변으로 묶기가 너무 길 것입니다. 또한 사용 된 코드를 편집하는 방법에 대한 설명도 추가했습니다. 물론 모든 대답은 완벽하게 작동합니다 ... 여기에 넣기 전에 테스트되었습니다.
SeekLoad

2

JavaScript setInterval메소드를 사용하십시오 .

setInterval(function(){ location.reload(); }, 3000);

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사용자가 창에 집중하는지 여부를 고려 하고 싶습니다 . 예를 들어, 한 창에서 다른 창으로 (예 : 인터넷 브라우저에서 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>

본문 코드는 두 솔루션 모두에 대한 SAME입니다

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

모니터링해야 할 사용자 활동 이벤트는 mousemoveand 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.