0

訪問者がページを読むのに費やした時間を追跡したいと考えています。ユーザーがタブを離したり、ウィンドウを最小化したりした場合、ユーザーが再びタブを見るまで、ページ滞在時間にカウントされるべきではありません。

JavaScript とサーバー側の作業の組み合わせが必要になると思います。

私が苦労しているいくつかの問題:

  1. この情報をデータベースに保存する最良の方法は何ですか?
  2. Javascript を使用して、適切な精度でページ滞在時間を取得するにはどうすればよいですか? 「ページのロード」、「ユーザーのアイドル状態」、「ユーザーの戻り」、「ページのアンロード」などのイベントを保存し、DB 内のすべてのイベントを個別に処理して、ページの時間を計算しますか?
4

2 に答える 2

4

ユーザーが Web ページに滞在している時間を計測する小さな JavaScript ライブラリーにいくつかの作業を加えました。これには、ユーザーが実際にページと対話している時間をより正確に (完全ではありませんが) 追跡できるという追加の利点があります。ユーザーが別のタブに切り替えたり、アイドル状態になったり、ブラウザーを最小化したりする時間を無視します。提案されている Google アナリティクスの方法には、新しいリクエストがドメインによって処理されたときのみチェックするという欠点があります (私が理解しているように)。以前のリクエスト時間と新しいリクエスト時間を比較し、それを「Web ページで費やされた時間」と呼びます。誰かがあなたのページを閲覧しているかどうか、ブラウザを最小化したかどうか、最後にあなたのページを読み込んでからタブを 3 つの異なる Web ページに切り替えたかどうか、実際にはわかりません。

https://github.com/jasonzissman/TimeMe.js

使用例:

ページの読み込み時:

document.onload = function() {
  TimeMe.setIdleDurationInSeconds(30);
  TimeMe.setCurrentPageName("my-home-page");
  TimeMe.initialize();  
}

ページで費やされた時間を取得し、ユーザーがページを離れたときにサーバーに送信します。

window.onbeforeunload = function (event) {
    xmlhttp=new XMLHttpRequest();
    xmlhttp.open("POST","ENTER_URL_HERE",false);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    var timeSpentOnPage = TimeMe.getTimeOnCurrentPageInSeconds();
    xmlhttp.send(timeSpentOnPage);
};
于 2015-02-04T01:25:43.870 に答える
0

まず、ユーザーがタブから離れたとき、または非アクティブになったときを検出する必要があります。これが発生したらタイマーを開始し、戻ってきたらタイマーを停止します。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 } として送信すると、分析を行っているときにサーバー側でデータを集計できます。

于 2013-01-23T01:13:21.743 に答える