Webで疑似ストリームを実現するために高頻度のポーリングを使用することはあると思いますが、そのタブがアクティブでないときはサーバーにも閲覧者のブラウザにも無駄なコストになりかねないので停止したいものです。
でも、アクティブでないといっても複数の窓を並べて見るような場合ならばフォーカスが当たって無くても更新されてほしいもの。
ちゃんと対応できるAPIがあります。Page Visibility APIがね。
ポーリング程度であれば、以下のようなメソッドや関数を用意しておけば充分でしょう。
function shouldPoll() {
return !document.hidden; // 必要に応じて他の確認と合わせる
}
非対応ブラウザを考慮するんであればちゃんと対応確認すべきかかもしれませんが、モダンブラウザならまず対応してます。(Android4.3以前AOSP?そんなものは知らない。)
もちろん動画、音声等のメディアの再生停止やWebSocket等の接続切断だってvisibilitychangeイベントで対応可能です。
他の窓で当該のタブが完全に隠れて(覆いかぶさられて)いたり、他のタブの背後に回っている場合、最小化されている場合やアクティブなワークスペースに当該の窓がない場合はhidden
、少しでも見えていればvisible
として扱われるようです。(細かい挙動はOS、ブラウザに依存するかもしれませんが)
なお、document.hidden
は歴史的な理由により維持されていますがそれよりもdocument. visibilityState
を使え、とW3C勧告に記載されています。
こちらを使う場合はこう。
function shouldPoll() {
return document.visibilityState === 'visible'; // 必要に応じて他の確認と合わせる
}