這是我參與8月更文挑戰的第 2 天,活動詳情查看: 8月更文挑戰html
贈人玫瑰,手有餘香。先點贊,再查看哇。ios
最近產品須要作一個埋點,不管是預覽商品仍是預覽企業信息都須要統計改用戶停留的時長,可是這個裏有個特色,就是商品和企業信息都是用H5寫的,最終這個H5頁面會嵌套自家產品小程序和本身產品安卓端和IOS端,因爲嵌套的緣由,須要處理的東西確實會比較複雜,而且仍是嵌套到三個不一樣的宿主環境裏,想一想都會頭疼,這樣會致使有些事件H5是沒法監聽到的。web
navigator.sendBeacon
發送接口及window.addEventListener('unload', function(){}, false)
來監聽是否關閉瀏覽器,更多詳情點我(new Date).getTime()
把它保存到全局,如何在要調接口統計時長時,咱們在(new Date).getTime()
弄一個時間戳減去進來時保存的時間戳便可獲得一個預覽時間,這裏相減是毫秒,本身轉化下便可。visibilitychange
,這個時間能夠監聽頁面是否隱藏,下面咱們詳細介紹:當其選項卡的內容變得可見或被隱藏時,會在文檔上觸發 visibilitychange
(能見度更改)事件。小程序
當 visibleStateState 屬性的值轉換爲
hidden
時,Safari不會按預期觸發visibilitychange
; 所以,在這種狀況下,您還須要包含代碼以偵聽pagehide
事件。瀏覽器
出於兼容性緣由,請確保使用
document.addEventListener
而不是window.addEventListener
來註冊回調。 Safari <14.0僅支持前者。服務器
document.addEventListener("visibilitychange", function() {
if (document.visibilityState === 'visible') {
// 頁面被顯示
// backgroundMusic.play();
} else {
// 頁面被隱藏
// backgroundMusic.pause();
}
});
複製代碼
全局設置一個變量用於記錄初始時間,當頁面隱藏(例如:切換後臺)監聽到visibilitychange
下的document.visibilityState === 'hidden'
時,咱們就把時間統計發送到服務器;當document.visibilityState === 'visible'
時,咱們又開始新的統計時間,這樣就能夠精準把須要統計的時間完成到服務器。微信
此時新的問題開始出現了,就是嵌套H5後,在ios系統中,直接點擊系統右上角的返回按鈕,是沒法觸發visibilitychange
事件的,這就讓咱們很困惑了,有人會提出,那不是能夠監聽關閉瀏覽器或者關閉網站事件,不就能夠解決?我只能說這些都沒法監聽的,你想到的事件基本都不會觸發H5頁面中的因此事件安靜的有點可怕,這種狀況也只有ios纔會出現,安卓手機和鴻蒙手機都不會出現這樣的狀況。markdown
若是嵌套ios的APP裏面,當用戶點擊左上角返回按鈕,由APP生命週期裏調用H5方法,在H5中window裏掛載本身寫好的一個函數,當調用本身掛載的函數時發送統計上傳到服務器;ide
若是嵌套到小程序的H5,咱們不能這麼寫了,由於小程序沒辦法在頁面銷燬時調用H5頁面的任何東西,這裏不止頁面銷燬調不了H5方法而是任什麼時候候都沒法調用直接調H5裏面的方法,因此這裏咱們須要使用微信提供的一個方法wx.miniProgram.postMessage
文檔詳情,咱們應該怎麼合理使用這個方法呢?個人想法是,每此進入須要記錄時間的頁面使用該方法,把須要上傳的參數及時間記錄並賦值給wx.miniProgram.postMessage({data:{}})
,如何當用戶點擊小程序原生返回時,咱們能夠在原生裏面寫一個方法用於接收該參數;函數
<web-view bindmessage="bindmessage"></web-view>
// js
bindmessage(){
// H5頁面接收發送回來的參數
}
wx.miniProgram.postMessage({ data: 'foo' })
複製代碼
咱們就能夠把拿到的參數直接在小程序內完成發送統計;
其實要解決這些問題也不難,難在怎麼跳出思惟,不能一成不變的認爲只能在H5監聽全部事件或者完成全部操做。 回顧一下:咱們使用的主要代碼有
// 在H5頁面中,監聽事件
document.addEventListener("visibilitychange", function() {
if (document.visibilityState === 'visible') {
// 頁面被顯示
// backgroundMusic.play();
} else {
// 頁面被隱藏
// backgroundMusic.pause();
}
});
// 用於H5頁面發送給小程序的內容
wx.miniProgram.postMessage({ data: 'foo' });
// 用於iosAPP端調用的方法
window.logData = function() {};
複製代碼
// 小程序原生代碼綁定監聽H5回傳參數
<web-view bindmessage="bindmessage"></web-view>
複製代碼
bindmessage(){
// H5頁面接收發送回來的參數
}
複製代碼
就這些代碼,咱們就完成咱們想要的效果了。
創做不易,喜歡記得點贊,若有錯誤請評論區留言。