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); });
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      設置
-   Ruby on Rails 3.1を使用している場合、最も簡単な方法はあなたのためです。  
visibilityjs
gemをgemfileに接続します。
gem 'visibilityjs'
app/assets/javascripts/application.js.coffee
ライブラリを接続しapp/assets/javascripts/application.js.coffee
:
#= require visibility
 -   Jammitなどの静的コレクターを使用する場合
public/javascripts/lib
、プロジェクトのpublic/javascripts/lib
lib / visibility.jsをダウンロードし、config/assets.yml
パッケージ設定でVisibility.jsをconfig/assets.yml
にします。
javascripts: application: - public/javascripts/lib/visibility.js
 - 何らかの理由でクライアントの最適化を考慮せず、プロジェクトのすべてのJSファイルを組み合わせてさらに圧縮しない場合、Visibility.jsの既に圧縮されたバージョン-visibility.min.jsをダウンロードできます。