![](/img/trans.png)
[英]IOS 10.3.3 Iphone Safari beforeunload, unload, pagehide wont work
[英]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
觸發時,您只需檢查一下clickTs
和eventlastReqAnimTime
之間的時間差,應該大約在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.