
Page Visibility APIはJavaScriptの新しいAPIであり、ユーザーがサイトを見るか、たとえば別のタブを開いたかを確認できます。
このAPIを使用すると、Webがより使いやすくなり、快適になりますか? まあ最も明白な:
- サイトをより使いやすくするため、 「使いやすさを高める」ため。 たとえば、別のタブに切り替えたときにスライドショーをオフにするか、ビデオを一時停止します(たとえば、YouTubeでビデオを視聴し、緊急のメールを受信します)。
- 余分なリソースを消費しないでください。 ユーザーにはサイトが表示されないため、不要なロジックは不要なときにオフにします。 たとえば、バックグラウンドタブで、複雑なJS計算を無効にするか、AJAXを使用して新しいメッセージをチェックする頻度を減らします。
- より正確な統計を読む。 たとえば、新しいタブでサイトを開いて見ずに閉じたユーザーをカウントしないでください。
- ブラウザが指定されたページをプリロードしてレンダリングし、すぐに開くときに、 Google Chromeの新しいレンダリングテクノロジーをサポートします。 たとえば、Google検索では、最初の検索結果に前処理のマークが付けられます。
- Schrodinger猫エミュレーター(図)を作成します。これは、ユーザーがバックグラウンドで読み込まれたタブを開いたときにのみ、生きている猫または死んだ猫を表示します。
Page Visibility APIの操作をより便利にするために、私は(
邪悪な火星人の栄光のために)
Visibility.jsライブラリを開発しました。 ベンダープレフィックスを忘れて、高レベルの関数に「シュガー」を追加して短いクリーンなコードを記述できます(たとえば、
Visibility.every
は
setInterval
に類似してい
setInterval
が、サイトが開いているタブにある場合のみ機能します)。
ページが見えなくなったときにビデオを停止
するビデオプレーヤーの良い例 (Google Chrome 13で開きます)。
ブラウザのサポート
Page Visibility APIがGoogle Chrome 13およびIE 10でサポートされるようになりました
。Firefox5以降では、Page Visibilty APIをエミュレートするprivate_faceから
MozVisibilityハックがあります(このハックはVisibility.jsの前にページに接続する必要があります)。
W3C
Page Visibility API標準の
ドラフトが既に存在するため、他のブラウザーでのサポートは時間の問題です。
ただし、すべてのユーザーのブラウザがこのAPIをサポートしている必要はまったくありません。単なる改善であり、
<video>
などの新しい機能の追加ではありません。 サポートがある場合、ユーザーにとってより便利になります。そうでない場合、サイトは通常のサイトのように機能し、ユーザーは常にサイトを表示すると考えます。 Visibility.jsの高レベル関数は特別に作成されているため、開発者はAPIのサポートがあるかどうかについて考えることができません。
州
現在、標準には4つのページ可視性状態があります。
visible
-ユーザーにはページが表示されます。hidden
ブラウザで別のタブが開いているか、ブラウザウィンドウが最小化されているか、OSが画面を完全にブロックしているため、ページはユーザーには表示されません。 確かに、実際には、Chromeは現在のタブが開いているかどうかを確認するだけで、ブラウザを最小化しても影響はありません。prerender
ブラウザはページを事前にロードしてレンダリングしているため、ユーザーに即座に表示できます。 つまり、ユーザーにはページが表示されないため、不必要な計算とマルチメディアを削除する必要があり、統計ではそのような表示はまだ考慮すべきではありません。 すべてのテクノロジーはGoogle Chromeでのみサポートされていますが、既に標準になっています。preview
サイトは小さなプレビューウィンドウで開いています。 たとえば、頻繁に開かれるサイトのジグソーパズルの新しいタブ。 どのブラウザでもまだサポートされていないため、標準の理論上のプロパティ。
そして、別の状態が標準に追加されたときに何が起こるか、そしてサイトがユーザーに見えるかどうかを確認する必要があります。 これを行うには、
document.hidden
プロパティ(ベンダープレフィックスを忘れないでください。Chromeでは
document.webkitHidden
になり
document.webkitHidden
)または
Visibility.hidden()
メソッドがあります。 サイトが表示されているかどうかを確認する必要がある場合は、このプロパティを使用し、状態の名前を
"hidden"
と比較しないでください。
Visibility.js
ベンダープレフィックスのチェックの束で低レベルのコードを怖がらないように、Visibility.jsの例を使用してすぐにPage Visibility APIを操作する方法を示します。記事の最後で、API標準の低レベルメソッドについて説明します。
ライブラリコードはユニット
テストで完全にカバーされ、文書化されており、ライブラリは
ロシアグルーポンですでに正常に使用されています。 圧縮バージョンでは、わずか1 KBの重さですが、余分なコードの束からあなたを救います。
Visibility.every
Visibility.every(interval, callback)
は
setInterval(callback, interval)
に類似してい
setInterval(callback, interval)
が、ユーザーがページを表示した場合にのみ
callback
開始します。
たとえば、ユーザーにページが表示されたときにのみカウントダウンアニメーションを表示します。
Visibility.every(1000, function() { updateCountdownAnimation(); });
Visibility.every(visible, hidden, callback)
は2時間間隔をとることができます-ページがユーザーに表示されるときは可視、
hidden
時には非表示になります。
たとえば、ユーザーがサイトを開くたびに新しいメッセージをチェックできます(つまり、ユーザーにとって重要です)。 また、ユーザーがサイトを表示しない(別のページを読む)場合、トラフィックを保存し、5分ごとにメールをチェックします。
var minute = 60 * 1000; Visibility.every(minute, 5 * minute, function () { checkForEmail(); });
しかし、一般的にミリ秒単位で時間を示します-人のm笑。 したがって、Visibility.jsは
jQuery Chronoプラグインとの統合をサポートし
ます (Visibility.jsの前に接続する必要があります)。 コードが明確になり、甘く甘くなります:
Visibility.every('minute', '5 minutes', function () { checkNewMails(); });
Visibility.every
を使用して開始されたタイマーを停止するには、
Visibility.stop(timerID)
を使用する必要があります(
clearInterval
は機能しません)。
var slideshow = Visibility.every(5 * 1000, function () { nextSlide(); }); $('.stopSlideshow').click(function () { Visibility.stop(slideshow); });
ブラウザーがPage Visibility APIをサポートしていない場合、
Visibility.every
はユーザーが常にサイトを見ると想定します(つまり、
setInterval
完全な類似物になり
setInterval
、悪いことは何も起こりません)。
Visibility.onVisible
別の標準的な状況は、ユーザーがサイトを見るまで待つときです(たとえば、バックグラウンドタブでリンクを開いたため)。 これを行うには、ページが表示されたときにのみコードを実行する
Visibility.onVisible(callback)
メソッドがあります。 ページがすでに表示されている場合、
callback
すぐ
callback
呼び出されます。
たとえば、サイトにアクセスすると、何らかの通知が表示され、10秒後にそれが美しく表示されます。 ただし、ユーザーがバックグラウンドタブですぐにサイトを開いた場合、通知をスキップできます。 ユーザーが実際にサイトを閲覧してから10秒後にカウントダウンします。
Visibility.onVisible(function () { setTimeout(function() { Notification.hide(); }, 10 * 1000); });
ブラウザがPage Visibility APIをサポートしていない場合、
Visibility.onVisible(callback)
はすぐにコール
callback
を呼び出し
callback
。
Visibility.afterPrerendering
Firefoxには
rel="prefetch"
rel="prefetch"
は、ユーザーが後でこのリンクを開く可能性が高いことをブラウザーに伝えるため、ブラウザーはそのコンテンツをプリロードします。 これは、たとえば記事の次の章をダウンロードしたり、検索結果の最初の結果を得るために必要です。
Google Chromeはさらに進んで
rel="prerender"
rel="prerender"
-ロードするだけでなく、事前にページをレンダリングしてすぐに開くことができます(Googleの
ビデオ例)。
ただし、ページがレンダリングされない場合、多くの制限があります。 AJAXリクエストの作成、オーディオまたはビデオの投稿、ポップアップのオープン、重い計算の実行は禁止されています。 さらに、ユーザーが実際にサイトを開くまで、ユーザーを統計に考慮しないことをお勧めします。
これらのすべてのタスクには
Visibility.afterPrerendering(callback)
があり
Visibility.afterPrerendering(callback)
。これは、ページが実際に開いたときにのみ
callback
実行し
callback
(つまり、事前レンダリング状態を終了します)。
callback
AJAXを介して自動更新を有効にし、
<video>
ページに追加して、統計でユーザーをカウントできます。
Visibility.afterPrerendering(function () { Statistics.countVisitor(); });
ブラウザがPage Visibility APIまたは事前レンダリングをサポートしていない場合、
Visibility.afterPrerendering(callback)
はすぐにコール
callback
を呼び出し
callback
。
低レベル関数
上記の例のすべての「砂糖」がどのように機能するかを理解したい場合、またはより複雑なことをしたい場合は、Visibility.jsの低レベル関数が必要になります。 すぐに、Page Visibility APIの仕組みを示します。
ブラウザがPage Visibility APIをサポートしている場合、
Visibility.isSupported()
は
true
返します。 Page Visibility APIをサポートしていないブラウザーは簡単に認識できます-document.hidden
undefined
を持ち、
true
または
false
ではありません(例えば、
document.webkitHidden
などのベンダープレフィックスがあることに注意してください)。
Visibility.state()
は、状態の名前(
"visible"
、
"hidden"
または
"prerenderer"
)を返します。 このメソッドは、ベンダープレフィックス(
document.webkitVisibilityState
)を考慮して、
document.visibilityState
プロパティを単純に調べます。 固定する小さな例:
if( Visibility.isSupported() ) { if ( 'hidden' == Visibility.state() ) { Statistics.userOpenPageInBackgroundTab(); } if ( 'prerender' == Visibility.state() ) { Statistics.pageIsPrerendering(); } })
ユーザーにページが表示されるかどうかを確認するだけの場合は、
Visibility.hidden()
を使用することをお勧めします(状態のリストは将来補充される可能性があるため)。
document.hidden
プロパティを調べるだけです。 次の例は、ページがアクティブなタブですぐに開く場合にのみ、新しい背景ではなくビデオの自動再生を有効にします。
$(document).load(function () { if ( !Visibility.hidden() ) { VideoPlayer.play(); } });
ページの状態を監視するために、
document
には
visibilitychange
イベント(Chromeでは
webkitvisibilitychange
)があります。
Visibility.change(callback)
はもっと短い方法があり
Visibility.change(callback)
メソッドはイベントハンドラー自体をハングさせ、ページの可視性が変わるたびにコール
callback
を呼び出し
callback
。
callback
の最初の引数はイベントオブジェクトになり、2番目は状態の名前になります。 例:
Visibility.change(function (e, state) { Statistics.trackChangeVisibility(state); });
設置
参照資料