LoginSignup
23
23

More than 5 years have passed since last update.

タブが隠れてるときはポーリングをやめる

Posted at

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'; // 必要に応じて他の確認と合わせる
}
23
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
23