簡體   English   中英

是時候觸發iOS上的beforeunload和Pagehide了

[英]Time to fire for beforeunload vs. pagehide on iOS

我正在使用beforeunload事件作為代理來了解有關我的網站點擊的指標。 例如,如果在click事件后的約50ms內觸發beforeunload ,則可以確定用戶何時選擇了鏈接。

對於iOS,這變得很復雜,因為它不支持beforeunload 根據Apple文檔,我已經將pagehide替換為beforeunload ,但這沒有相同的功能。 好像pagehide替換了unload -NOT beforeunload 在我的測試中,它們的觸發時間平均相差約1500ms( pagehide觸發要比beforeunload遲得多)。 這使得將pagehide事件歸因於點擊非常困難。

iOS上Safari所支持的事件是否可以接近beforeunload的觸發時間?

注意:我知道這不是理想的選擇,還有其他更好的方法可能會最終使用,但是我對此仍然感到好奇。

從理論上講, pagehide可以代替beforeunload中的beforeunload ,但實際上不是。 正確觀察到的觸發pagehide事件的時間可能會有所不同,因為safari在后台獲取新頁面,並且當頁面可用時將觸發pagehide

如果您正在尋找一個事件,則不會發生任何事件,但是,一旦單擊發生,Safari就會停止運行requestAnimationFrame ,您可以嘗試使用這種hack。 因此,您可以嘗試類似的操作,在單擊發生時記錄clickTs並開始在requestAnimationFrame函數中記錄時間戳,現在,當pageHide觸發時,您只需檢查一下clickTseventlastReqAnimTime之間的時間差,應該大約在500毫秒之間。 這樣,您就可以將click歸因於pageHide

var w = window,
reqAnim = null,
clickTs = 'record this when click happens',
eventlastReqAnimTime = +new Date,
logReqAnim = function() {
    eventlastReqAnimTime = +new Date;
    reqAnim = w.requestAnimationFrame(logReqAnim)
};
reqAnim = w.requestAnimationFrame(logReqAnim);
setTimeout(function () {
    w.cancelAnimationFrame(reqAnim);
}, 1500)
w.addEventListener('pagehide', function(){
    if(Math.abs(clickTs - eventlastReqAnimTime) < 500 ){
        console.log('your link was chosen')
    }
})

注意:以上代碼只是偽代碼,請在運行前進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM