--- title: Page Visibility API slug: Web/API/Page_Visibility_API tags: - DOM - Intermediate - Tutorials translation_of: Web/API/Page_Visibility_API original_slug: Web/Guide/User_experience/Using_the_Page_Visibility_API ---
タブを使って閲覧している場合、どのウェブページもバックグラウンドにあってユーザーから見えていない場合があります。 Page Visibility API では、現在ページが見えているかどうかを調べる機能とともに、文書が表示されたり非表示になったりした時を監視することができるイベントを提供します。
メモ: The Page Visibility API は、文書が表示されていない時に不必要なタスクの実行を抑止することで、リソースを節約したり実行効率を上げたりするために特に有用です。
ユーザーがウィンドウを最小化したり他のタブに切り替えたりした時、 API は {{event("visibilitychange")}} イベントを送信してリスナーにページの状態が変化したことを知らせます。イベントを検出していくつかの操作を実行したり、様々な動作をしたりすることができます。例えば、ウェブアプリで動画を再生している場合、ユーザーがタブをバックグラウンドにした場合に動画を一時停止させ、ユーザーがこのタブに戻ったときに再生を再開させたりすることができます。ユーザーは動画の位置に迷うことがなく、動画の音声が新しく前景になったタブの音声を邪魔せず、ユーザーがその間に動画を見落とすことがなくなります。
{{HTMLElement("iframe")}} の可視状態は、親文書と同じになります。 CSS プロパティにより ({{cssxref("display", "display: none;")}} のように) <iframe>
を隠しても visibility のイベントは発生せず、またフレームに含まれる文書の状態も変わりません。
Page Visibility API の使用例をいくつか考えてみましょう。
以前、開発者はこれを検出するために不完全な代替手段を使用していました。例えば window で onblur/onfocus ハンドラーを登録することでページがアクティブではないときを知る助けになりますが、ページがユーザーから隠された状態であることは知らせてくれません。 Page Visibility API はこれを解決します。
メモ: {{domxref("GlobalEventHandlers.onblur", "onblur")}} 及び {{domxref("GlobalEventHandlers.onfocus", "onfocus")}} はユーザーがウィンドウを切り替えたことを教えてくれますが、非表示にしたという意味になるとは限りません。ページが非表示になるのは、ユーザーがタブを切り替えたり、タブを含むブラウザーウィンドウを最小化したりした時だけです。
Separately from the Page Visibility API, user agents typically have a number of policies in place to mitigate the performance impact of background or hidden tabs. These may include:
Some processes are exempt from this throttling behavior. In these cases, you can use the Page Visibility API to reduce the tabs' performance impact while they're hidden.
ライブサンプルをご覧ください (音声つき動画あり)。
この例では別のタブに切り替えたときに動画再生を一時停止、また元のタブに戻った時に再生を再開しており、以下のコードで作られました:
// hidden プロパティおよび可視性の変更イベントの名前を設定 var hidden, visibilityChange; if (typeof document.hidden !== "undefined") { // Opera 12.10 や Firefox 18 以降でサポート hidden = "hidden"; visibilityChange = "visibilitychange"; } else if (typeof document.msHidden !== "undefined") { hidden = "msHidden"; visibilityChange = "msvisibilitychange"; } else if (typeof document.webkitHidden !== "undefined") { hidden = "webkitHidden"; visibilityChange = "webkitvisibilitychange"; } var videoElement = document.getElementById("videoElement"); // ページが隠れたとき、動画再生を一時停止する。 // ページが表示されたとき、動画を再生する。 function handleVisibilityChange() { if (document[hidden]) { videoElement.pause(); } else { videoElement.play(); } } // ブラウザーが addEventListener または Page Visibility API をサポートしない場合に警告 if (typeof document.addEventListener === "undefined" || hidden === undefined) { console.log("This demo requires a browser, such as Google Chrome or Firefox, that supports the Page Visibility API."); } else { // Page Visibility の変更を扱う document.addEventListener(visibilityChange, handleVisibilityChange, false); // 動画が一時停止されたときに、タイトルを設定する。 // 一時停止したことを示す。 videoElement.addEventListener("pause", function(){ document.title = 'Paused'; }, false); // 動画を再生するときに、タイトルを設定する。 videoElement.addEventListener("play", function(){ document.title = 'Playing'; }, false); }
The Page Visibility API adds the following properties to the {{domxref("Document")}} interface:
true
を、そうでない場合に false
を返します。visible
hidden
prerender
document.hidden
では隠されているとみなされます)。文書は prerender
の状態から始まるかもしれませんが、プリレンダリングは1つの文書は1回しか行われないので、他の状態からこの状態に移ることはありません。
unloaded
unloaded
の値に対応しているわけではありません。//startSimulation および pauseSimulation は別途定義される function handleVisibilityChange() { if (document.hidden) { pauseSimulation(); } else { startSimulation(); } } document.addEventListener("visibilitychange", handleVisibilityChange, false);
仕様書 | 状態 | 備考 |
---|---|---|
{{SpecName('Page Visibility API')}} | {{Spec2('Page Visibility API')}} | 初回定義 |
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
基本対応 | 13 {{property_prefix("webkit")}} 33 |
{{CompatGeckoDesktop(18)}}[2] | 10 | 12.10[1] | 7 |
onvisibilitychange |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop(56)}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
Budget-based background timeout throttling | 57 | {{CompatGeckoDesktop(58)}} | {{CompatNo}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
機能 | Android | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
基本対応 | 5.0[3] | {{CompatGeckoMobile(18)}}[2] | 10 | 12.10[1] | 7[4] |
onvisibilitychange |
{{CompatVersionUnknown}} | {{CompatGeckoMobile(56)}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
Budget-based background timeout throttling | {{CompatNo}} | {{CompatGeckoMobile(58)}} | {{CompatNo}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
[1] ブラウザーウィンドウを最小化しても visibilitychange
イベントは発生せず、また hidden
は true
に変わりません。
[2] Firefox 10 から Firefox 51 まで、このプロパティは -moz-
接頭辞を使用することができました。
[3] Android 4.4 はこの機能に webkit
の接頭辞付きで対応しています。
[4] From iOS 11.0.2 onwards, the values are not correct in standalone mode (when you press "Add to Homescreen") and when the screen is locked (you pressed the power button). The value for hidden
is false
and visibilityState
is visible
.