2017-06-20 97 views
0

私はbeforeunloadイベントを自分のサイトのクリックに関する指標に代入する手段として使用しています。たとえば、beforeunloadclickイベントの約50ms以内に発生した場合、ユーザーがいつリンクを選択したかを判断できます。iOSのbeforeunloadとpagehideの起動時間

これは、beforeunloadをサポートしていないため、iOSではこれが複雑になります。アップルのドキュメントでは、beforeunloadの代わりにpagehideを使用しましたが、これは同じ機能を持ちません。 unload - beforeunloadの代わりにpagehideのように見えます。私のテストでは、火災の時間は平均で1500ミリメートル(pagehidebeforeunloadよりもはるかに後にトリガ)によって異なります。これにより、クリック数がpagehideのイベントが非常に難しくなっています。

iOSのサファリでサポートされているイベントは、トリガー時間がbeforeunloadに近づくことはありますか?

注:私はこれが理想的ではないことを知っています。追求する可能性のある他のより良いアプローチがありますが、私はまだこれについて興味があります。

答えて

2

理論的にはpagehideはサファリのbeforeunloadの代わりですが、実際はそうではありません。 pagehideイベントをトリガーする正確な時刻は、サファリが新しいページをバックグラウンドで取得し、ページが利用可能なときにpagehideが呼び出されるため、変化する可能性があります。

使用すると、1つを探しているなら、何のイベントはありませんが、あなたはできるだけ早くクリックが​​を実行しているサファリ停止を起こるように、試すことができ、このハックがあります。あなたはclickTsというレコードが発生し、​​の内部にタイムスタンプの録音を開始するので、今度はclickTseventlastReqAnimTimeの間の時間差を確認するだけで、pageHideが起動すると、約500ミリ秒になるはずです。あなたはclick

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') 
    } 
}) 

pageHideにメモを属性することができますこの方法:上記のコードは、単に擬似、実行する前にテストです。

関連する問題