<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
有時候,開發者需要知道,使用者正在離開頁面。常用的方法是監聽下面三個事件。
pagehide
beforeunload
unload
但是,這些事件在手機上可能不會觸發,頁面就直接關閉了。因為手機系統可以將一個程序直接轉入後臺,然後殺死。
上面這些情況,都會導致手機將瀏覽器程序切換到後臺,然後為了節省資源,可能就會殺死瀏覽器程序。
以前,頁面被系統切換,以及系統清除瀏覽器程序,是無法監聽到的。開發者想要指定,任何一種頁面解除安裝情況下都會執行的程式碼,也是無法做到的。為了解決這個問題,就誕生了 Page Visibility API。不管手機或桌面電腦,所有情況下,這個 API 都會監聽到頁面的可見性發生變化。
這個新的 API 的意義在於,通過監聽網頁的可見性,可以預判網頁的解除安裝,還可以用來節省資源,減緩電能的消耗。比如,一旦使用者不看網頁,下面這些網頁行為都是可以暫停的。
這個 API 主要在document
物件上,新增了一個document.visibilityState
屬性。該屬性返回一個字串,表示頁面當前的可見性狀態,共有三個可能的值。
hidden
:頁面徹底不可見。
visible
:頁面至少一部分可見。
prerender
:頁面即將或正在渲染,處於不可見狀態。
其中,hidden
狀態和visible
狀態是所有瀏覽器都必須支援的。prerender
狀態只在支援"預渲染"的瀏覽器上才會出現,比如 Chrome 瀏覽器就有預渲染功能,可以在使用者不可見的狀態下,預先把頁面渲染出來,等到使用者要瀏覽的時候,直接展示渲染好的網頁。
只要頁面可見,哪怕只露出一個角,document.visibilityState
屬性就返回visible
。只有以下四種情況,才會返回hidden
。
可以看到,上面四種場景涵蓋了頁面可能被解除安裝的所有情況。也就是說,頁面解除安裝之前,document.visibilityState
屬性一定會變成hidden
。
事實上,這也是設計這個 API 的主要目的。
另外,早期版本的 API,這個屬性還有第四個值unloaded
,表示頁面即將解除安裝,現在已經被廢棄了。
注意,document.visibilityState
屬性只針對頂層視窗,內嵌的<iframe>
頁面的document.visibilityState
屬性由頂層視窗決定。
使用 CSS 屬性隱藏<iframe>
頁面(比如display: none;
),並不會影響內嵌頁面的可見性。
由於歷史原因,這個 API 還定義了document.hidden
屬性。該屬性唯讀,返回一個布林值,表示當前頁面是否可見。
當document.visibilityState
屬性返回visible
時,document.hidden
屬性返回false
;其他情況下,都返回true
。
該屬性只是出於歷史原因而保留的,只要有可能,都應該使用document.visibilityState
屬性,而不是使用這個屬性。
只要document.visibilityState
屬性發生變化,就會觸發visibilitychange
事件。
因此,可以通過監聽這個事件(通過document.addEventListener()
方法或document.onvisibilitychange
屬性),跟蹤頁面可見性的變化。
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(); } }
下面專門討論一下,如何正確監聽頁面解除安裝。
頁面解除安裝可以分成三種情況。
這三種情況,都會觸發visibilitychange
事件。前兩種情況,該事件在使用者離開頁面時觸發;最後一種情況,該事件在頁面從可見狀態變為不可見狀態時觸發。
由此可見,visibilitychange
事件比pagehide
、beforeunload
、unload
事件更可靠,所有情況下都會觸發(從visible
變為hidden
)。因此,可以只監聽這個事件,執行頁面解除安裝時需要執行的程式碼,不用監聽後面那三個事件。
甚至可以這樣說,unload
事件在任何情況下都不必監聽,beforeunload
事件只有一種適用場景,就是使用者修改了表單,沒有提交就離開當前頁面。另一方面,指定了這兩個事件的監聽函數,瀏覽器就不會快取當前頁面。
參考連結
以上就是Page Visibility API 教學範例的詳細內容,更多關於Page Visibility API 教學的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45