マイナー・マイナー

隠れた名作の発掘が生きがい。

ページの表示/非表示状態を検知して定期処理を開始/停止する


スポンサードリンク

HTMLでJavaScriptのsetIntervalを使った定期処理をしていると、ページを非表示にしても定期処理が続いていたりします。タブを切り替えて他ページを表示した時などに明示的に定期処理を開始/停止したいときは、visibilitychangeでページの可視性を検知して開始/停止すれば良さそうです。

var intervalId
var count = 0;

// 定期実行する何らかの処理
function doSomething() {
     var date = new Date();
     count++;
     console.log(date.toString() + " count=" + count.toString());
}

// 表示・非表示切り替わり時のイベントハンドラ
function visibilityChangeHandler() {
     var date = new Date();
     // ページの表示・非表示状態を判断
     if (document.hidden) {
          console.log(date.toString() + " hidden");
          clearInterval(intervalId);  // 定期処理停止
     } else {
          console.log(date.toString() + " visible");
          intervalId = window.setInterval(doSomething, 1000);  // 定期処理開始
     }
}

// 定期処理開始
intervalId = window.setInterval(doSomething, 1000);

// ページの可視性が変化した時のイベントを登録
document.addEventListener('visibilitychange', visibilityChangeHandler, false);

ページの可視性が変化したとき、visibilitychangeイベントを送信します。その時にdocument.hiddenを条件にしてページがユーザから見えているかどうかを判定し、定期処理の開始/停止を行っています。*1


ページを表示して、タブの切り替え・再表示を行った結果は下記の通りとなりました。ページを離れて(hidden)、再度表示(visible)したときに1秒ごとの定期処理が止まっていることを確認できました。

Sun Feb 14 2016 22:34:41 GMT+0900 (JST) count=1
Sun Feb 14 2016 22:34:42 GMT+0900 (JST) count=2
Sun Feb 14 2016 22:34:43 GMT+0900 (JST) count=3
Sun Feb 14 2016 22:34:43 GMT+0900 (JST) hidden
Sun Feb 14 2016 22:34:48 GMT+0900 (JST) visible
Sun Feb 14 2016 22:34:49 GMT+0900 (JST) count=4
Sun Feb 14 2016 22:34:50 GMT+0900 (JST) count=5
Sun Feb 14 2016 22:34:51 GMT+0900 (JST) count=6

*1:document.visibilityStateも可視性を表すプロパティで、これを使うとより詳細な状態が得られます。