1. 程式人生 > 實用技巧 >JavaScript 頁面可見性 Page Visibility API 監聽使用者離開頁面

JavaScript 頁面可見性 Page Visibility API 監聽使用者離開頁面

一、API 簡介

Page Visibility API 用來檢測頁面當前是否可見,以及開啟網頁的時間等

以前監聽使用者正在離開頁面常用的方法是下面三個事件:

1、pagehide
2、beforeunload
3、unload

但這些事件在手機上不觸發,因為手機系統可以將程序直接轉入後臺,然後殺死,為了解決這個問題,就誕生了 Page Visibility API
不管手機或桌面電腦,所有情況下,這個 API 都會監聽到頁面的可見性發生變化
這個 API 常用於頁面被切換到其他後臺程序時,自動暫停音樂或視訊的播放,達到節省資源,減緩電能消耗等效果

二、document.visibilityState

這個 API 主要在 document 物件上,新增了一個 document.visibilityState 屬性,該屬性返回一個字串,表示頁面當前的可見性狀態,共有三個可能的值:

1、hidden:頁面徹底不可見
2、visible:頁面至少一部分可見
3、prerender:頁面即將或正在渲染,處於不可見狀態

關於 hidden & visible,

hidden 狀態和 visible 狀態是所有瀏覽器都支援的
只要頁面可見,哪怕只露出一個角,document.visibilityState 屬性就返回 visible,只有以下四種情況,才會返回 hidden:

1、瀏覽器最小化
2、瀏覽器沒有最小化,但是當前頁面切換成了背景頁
3、瀏覽器將要解除安裝(unload)頁面
4、作業系統觸發鎖屏螢幕

關於 prerender,

prerender 狀態只在支援"預渲染"的瀏覽器上才會出現,比如 Chrome,可以在使用者不可見的狀態下,預先把頁面渲染出來,等到使用者要瀏覽的時候,直接展示渲染好的網頁

可以看到,上面四種場景涵蓋了頁面可能被解除安裝的所有情況
也就是說,頁面解除安裝之前,document.visibilityState 屬性一定會變成 hidden

三、visibilitychange 事件

只要 document.visibilityState 屬性發生變化,就會觸發 visibilitychange 事件
因此,可以通過監聽這個事件跟蹤頁面可見性的變化,舉個例子:

document.addEventListener('visibilitychange', function () {
  // 使用者離開了當前頁面
  if (document.visibilityState === 'hidden') {
    document.title = '頁面不可見';
  }

  // 使用者開啟或回到頁面
  if (document.visibilityState === 'visible') {
    document.title = '頁面可見';
  }
});

上面程式碼是 Page Visibility API 的最基本用法,可以監聽可見性變化
下面是另一個例子,一旦頁面不可見,就暫停視訊播放:

var vidElem = document.getElementById('video-demo');
document.addEventListener('visibilitychange', startStopVideo);

function startStopVideo() {
  if (document.visibilityState === 'hidden') {
    vidElem.pause();
  } else if (document.visibilityState === 'visible') {
    vidElem.play();
  }
}