5

訪問者が特定のページに費やした時間をカウントし、MySQL DB に保存したいと考えています。

次のようにwindow.onloadでタイマーを開始することを考えました:

window.onload= startCount;
window.onunload= sendCount;

var b=0;
var y;
function startCount() {
    document.getElementById('livecount').innerHTML=b;
    b=b+1;
    y=setTimeout("startCount()",1000);
}

訪問者がページ (window.onunload) を離れた後、XMLHttpRequest を介して時間を PHP ファイルに送信し、DB に保存します。

function sendCount() {
    clearTimeout(y);    
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }  
xmlhttp.open("GET","count.php?q="+b,true);
xmlhttp.send();
}

問題は、それが常に機能するとは限らないことです。試してみると、10回のうち3回はうまくいくと思います。PHP と SQL を完全に実行するのに十分な時間が残っていないのでしょうか?

4

5 に答える 5

4

onunloadは信頼できないので、AJAXソリューションを検討します。私はこれについてはまったく専門家ではありませんが、頭に浮かぶ考えは、頻繁にカウンターにpingを送信することです。過度に思われるので、毎秒カウンターにpingを送信することはしません。

時間を<5秒、<30秒、<1分、<5分、5分以上などの気になる時間に分割します。

次に、次のようなJavaScriptを記述します。

window.onload = soCounter;

var iter=0;
var times=[0,5,30,60,300];  // Your duration choices

function doCounter() {

    sendCountPing(times(iter));

    iter++;

    if(iter < times.length) {
        setTimeout(doCounter, times[iter]*1000);
    }
} 

function sendCountPing(dur) {
    if (window.XMLHttpRequest)
    {  // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {  // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }  

    xmlhttp.open("GET","count.php?q="+b,true);
    xmlhttp.send();

}

秘訣は、送信されるすべてについて、カウントcount.php?q=30から1を引く必要があるということです。count.php?q=5これはプログラムである必要はなく、簡単に後処理されます。

明確にするために、3人の訪問者がいて、1人が3秒、1人が20秒、1人が30分を費やしている場合、次のカウントが表示されます。

  0:  3   // 3 people spent at least 0 seconds
  5:  2   // 2 people spent at least 5 seconds
 30:  1
 60:  1
300:  1   // 1 person spent at least 5 minutes

わかる?

于 2010-11-29T21:15:05.377 に答える
1

onload ハンドラーが実行されるまでに、ページは削除されます。DOM やその他のサービスの状態についてどのような保証があるかはわかりませんが、非同期イベントやタイムアウトが発生することは期待できません。標準の一部ではありませんが、今日のほとんどの (すべて?) ブラウザーは、他のイベント ハンドラーとほぼ同じように機能するonbeforeunloadフックを提供しますが、必要に応じて false を返してアンロードをキャンセルすることもできます。

于 2010-11-30T03:57:12.207 に答える
1

提案されているように、必要な回数 (数秒程度) 実行されるタイマーを設定し、その情報を Cookie (または Cookie) に保存することができます。ユーザーに値を表示する以上のことをしたい場合は、必要に応じてこの情報をサーバーに送信できます。したがって、サイクルごとにサーバーに送信するのではなく、その情報で何かをしたいときにサーバーに送信するだけです (ユーザーがサイトのさまざまなページに費やした時間のリストをユーザーに表示するなど)。

于 2010-11-30T03:59:01.537 に答える
0

onunload は追跡するための信頼できる方法ではありません...まあ、ほとんど何でも。たとえば、http://www.google.com/support/forum/p/Google+Analytics/thread?tid=6496cd5d4b627c0e&hl=en を参照してください。

問題を解決するための最良の方法は、ユーザーが最後にページにアクセスした時間を追跡することです。たとえば、クライアントから毎分トラッカーを呼び出します。Google Analytics などの分析システムは、実際には、ユーザーが最後に提供されたページの後に去ったと想定しているだけです。つまり、ページを読んで何かをクリックすると、カウンターが更新されます。しかし、その後のヒットがなければ、それは私が去ったことを意味します。

于 2010-11-29T19:35:52.453 に答える