まず、ユーザーがタブから離れたとき、または非アクティブになったときを検出する必要があります。これが発生したらタイマーを開始し、戻ってきたらタイマーを停止します。setTimeout/setInterval を使用した時間のカウントは、ブロックのために不正確になる可能性があるため、日時の実際の差に基づいて正確な JavaScript タイマーを作成しました: https://gist.github.com/4600726
したがって、コードは次のようになります。
timer = new Timer;
window.addEventListener('focus', function() {
timer.start();
}, false);
window.addEventListener('blur', function() {
timer.stop();
// send timer.msecs() to the server maybe??
// if so, also call timer.reset();
}, false);
window.addEventListener('beforeunload', function() {
timer.stop();
// send timer.msecs() to the server via jquery post, or better yet websocket
}, false);
その後、timer.secs() で経過時間を取得できます。サーバーに情報を送信する頻度は、好みに依存すると思います。ぼかしでそれを行うことができます。
もう 1 つのオプションは、マウスオーバーがないことは非アクティブであることを意味すると宣言することです。タイマーを開始してから setTimeout を実行し、ウィンドウの mousemove イベントで setTimeout をキャンセルして別の setTimeout を開始した後、タイマーを停止します。
サーバーにデータを送信する限り、私はおそらくぼかしで、もちろんアンロード前に送信することを選択します。私の好みの方法は、高速で常に接続されているため、socket.ioを使用することです。これを使用すると、多くのユーザー イベントをリアルタイムで追跡できますが、サーバーへの ajax 呼び出しだけを行うこともできます。それらをミニ ユーザー セッション { user: userId , page: pageId ,lapsedTime: msecs } として送信すると、分析を行っているときにサーバー側でデータを集計できます。