一定時間操作がないと自動的にページをリロードする方法


回答:


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ターンの間、それは間違いでしょうか?
怖いウォンバット2017年

2
間隔が非アクティブ時間よりも短いのは、実際の非アクティブ時間よりもはるかに高い頻度で非アクティブ時間をチェックするためです。たとえば、非アクティブ時間が1分で間隔が1分である場合、ユーザーが1秒後にマウスを動かして停止すると、更新は2分後にのみ行われます。間隔が小さいほど、更新時間は正確になります。
Derorrist

227

これは、次のメタタグを使用して、JavaScriptなしで実行できます。

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

content = "5"は、ページが更新されるまで待機する秒数です。

しかし、あなたは活動がなかった場合にのみ言った、それはどのような活動ですか?


2
アクティビティがないということは、エンドユーザーが机の上や他のサイトを閲覧していないことを意味します。私が参照しているサイトでマウス/ KBアクティビティがありません。
Umar Adil、2011年

2
すばらしい回答です。これはで行う必要があると考えたsetIntervalので、これが存在することを知ってうれしいです!
ティム・ピーターソン2014年

11
これはアクティビティをキャプチャしないため回答ではありませんが、賛成票を投じましたが、この質問は単にJavaScriptの更新を探しているときにGoogle検索結果の上部にありました。したがって、設定された間隔でページが自動的に更新されるようにするだけの場合は、この方法が適しています。
ジミーボス14

ポスト変数で自動更新できますか?
Pradeep Kumar Prabaharan

2
これは質問に答えていません。アクティビティがある場合でもリロードされます
Braian Mellor 2017

42

私はjqueryを必要としない完全なJavaScriptソリューションも構築しました。それをプラグインに変えることができるかもしれません。流体の自動更新に使用しますが、ここで役立つと思われます。

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を使用しないと、大きなボーナスポイントが得られます。
Echiban

1
*すばらしい/多くの感謝*このアカウントはタッチイベントを検出するためのものですか?
sendbits 2018年

1
うーん、わかりません。私がそれを作成したとき、私はiPhoneやiPadでの経験があまりありませんでした。
newdark-it

1
ヒーロー!これは完璧な感謝です。私のPHPセッションは1時間後に期限切れになるように設定されていますが、これは1時間ちょっと更新されるように設定されています。これで、非アクティブな機能の後にログアウトできるようになると思います。
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 2016年

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か?
怖いウォンバット2017年

3
マウスが動かされたかどうかを毎秒チェックするため、間隔は1.000です。次に60.000を使用して、最後のマウス移動が少なくとも1分前に発生したかどうかを判断します。
Hannes Sachsenhofer 2017年

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 2017

1
あなたの権利、私は質問全体を読みませんでした。さて、それは正しい答えで編集されています。
SeekLoad

私は-1を取り、より良い答えを出すために+10を加えました!感謝
Braian Mellor 2017

機能する2番目の回答もありますが、今はこの回答を微調整します。これは、対象のソリューションを編集して今よりも改善できるためです。
SeekLoad

1
同じソリューションに対して、適用がより簡単に感じられるものとニーズに合っているものに応じて、3つの答えを示しました。3つのソリューションにはすべて、確認または警告の有無にかかわらずあります。3つの回答はコードが異なるため、3つの回答で回答しました。1つの回答にすべてのソリューションをまとめるのは長すぎるでしょう。また、一度使用したコードの編集方法の説明も追加しました。もちろん、すべての答えは完璧に機能します...ここに置く前にテストされました。
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に、またはインターネットブラウザ内のタブ1からタブ2に)、Webページは「フォーカスが外れています!」というコールバックを送信できます。または「フォーカス中です!」。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つの回答で回答しました。1つの回答にすべてのソリューションをまとめるのは長すぎるでしょう。また、一度使用したコードの編集方法の説明も追加しました。もちろん、すべての答えは完璧に機能します...ここに置く前にテストされました。
SeekLoad

0

警告の代わりにページ上の確認テキストを使用

これは、非アクティブな場合に自動ロードする別の方法なので、2番目の答えを示します。これはもっとシンプルで理解しやすいです。

ページのリロード確認あり

<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つの回答で回答しました。1つの回答にすべてのソリューションをまとめるのは長すぎるでしょう。また、一度使用したコードの編集方法の説明も追加しました。もちろん、すべての答えは完璧に機能します...ここに置く前にテストされました。
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()
}

次に、インタラクションの最後の時間をミリ秒単位で保存するアロー関数を作成します(文字列)

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 2013

適切な構文で上記の回答を使用してください。
FAISAL 2013

1
質問はページにアクティブ化がない場合のリロード方法に関するものであり、ソリューションはページにアクティビティがある場合でも自動的にリロードを強制するため、あなたが回答したこの方法は質問に答えません。ここで検索した答えは、一定時間内にページ上にマウスまたはキーボードを使用していない場合にリロードする方法です。注:私が前回答えたときに私も同じ間違いをしたので、これを伝えています。質問に合わせて答えを変更しました。
SeekLoad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.