2016-12-23 1 views
2

PHPとJavascriptとMAMPを使用してローカルにウェブサイトを構築しようとしています。ウェブサイト訪問中にユーザーが費やした時間を測定する

私が探しているのは、ウェブサイトのすべてのページにタイマーを置くことです。そのタイマーは、ウェブサイト全体でユーザーが費やした時間をカウントします。ユーザーがページを切り替える場合でも、タイマーは引き続き使用されます。私が見つけた解決策は、各ページに費やされた時間だけを示し、同じページを再び読み込んだときに、タイマーはゼロから再開します。

ここではJavascriptが私がやったタイマーのためだ:私は解決策のためにどこでも検索が、誰もがこれを行う方法を知っていれば運で、私に知らせてくださいました

window.onload=function(){ 
time=0; 
} 
window.onbeforeunload=function(){ 
timeSite = new Date()-time; 
window.localStorage['timeSite']=timeSite; 
} 

+1

をセッション変数を使用し、それはすべてのページで共有されます。 – Barmar

+0

純粋なjavascriptのソリューションでは、更新された答えを試してください...コーヒーはうまく働いた...さらに@Barmarはポイントがあります。つまり、あなたのケースでは、私はブラウザでjavascriptが無効になっている場合に備えて、セッションvarに基づいて同様のサーバサイドを作成しようとします。 (それはどれくらいの頻度です!!!)。 –

答えて

0

ここに実例があります。 Peterの答えとは異なり、ユーザーがウィンドウ/タブを閉じるとカウントが停止します。

var timer; 
var timerStart; 
var timeSpentOnSite = getTimeSpentOnSite(); 

function getTimeSpentOnSite(){ 
    timeSpentOnSite = parseInt(localStorage.getItem('timeSpentOnSite')); 
    timeSpentOnSite = isNaN(timeSpentOnSite) ? 0 : timeSpentOnSite; 
    return timeSpentOnSite; 
} 

function startCounting(){ 
    timerStart = Date.now(); 
    timer = setInterval(function(){ 
     timeSpentOnSite = getTimeSpentOnSite()+(Date.now()-timerStart); 
     localStorage.setItem('timeSpentOnSite',timeSpentOnSite); 
     timerStart = parseInt(Date.now()); 
     // Convert to seconds 
     console.log(parseInt(timeSpentOnSite/1000)); 
    },1000); 
} 
startCounting(); 

あなたは、ウィンドウ/タブがアクティブでないとき、タイマーを停止したい場合は、以下のコードを追加します。

var stopCountingWhenWindowIsInactive = true; 

if(stopCountingWhenWindowIsInactive){ 

    if(typeof document.hidden !== "undefined"){ 
     var hidden = "hidden", 
     visibilityChange = "visibilitychange", 
     visibilityState = "visibilityState"; 
    }else if (typeof document.msHidden !== "undefined"){ 
     var hidden = "msHidden", 
     visibilityChange = "msvisibilitychange", 
     visibilityState = "msVisibilityState"; 
    } 
    var documentIsHidden = document[hidden]; 

    document.addEventListener(visibilityChange, function() { 
     if(documentIsHidden != document[hidden]) { 
      if(document[hidden]){ 
       // Window is inactive 
       clearInterval(timer); 
      }else{ 
       // Window is active 
       startCounting(); 
      } 
      documentIsHidden = document[hidden]; 
     } 
    }); 
} 

JSFiddle

+0

は完璧に動作します、ありがとうございます! – Doudi

+0

私がhttps://jsfiddle.net/4e223aht/44/にアクセスした場合、私はコンソールにカウント秒を書いています。私は窓を閉める。私はjsfiddleのサンプルページに再度アクセスし、最後の訪問時から数えてコンソールを見ます。これは正しいです?再訪問時に始めから何度もカウントしてはいけませんか? –

+0

これは正しい動作です。それはまさにOPが求めていることをしています:ユーザー***がページ間で切り替わったとしても、***全体のウェブサイト***でユーザーが費やした時間を数えます。 –

0

使用するlocalStorageは、必要なものに最適ではありません。ただし、sessionStoragelocalStorageが最適です。 sessionStorage新しいタブを開くときに新しいセッションに解決することを覚えておいてください。localStorageを使用するのは、sessionStorageしか使用されておらず、ユーザーが新しいタブを並行して開き、そのブラウザのタブのセッションを開始し、その開始からtimeOnSiteとカウントします。次の例では、これを回避して正確な数を計算します。timeOnSite

sessionStorageプロパティを使用すると、現在のオリジンのセッションストレージ オブジェクトにアクセスできます。 sessionStorageは、唯一の違いは localStorageに格納されたデータがない期限が設定されていない間ページ・セッションが終了したときに、sessionStorageに格納されたデータを をクリアされますであり、 ​​と同様です。ページセッションは、ブラウザが開いているときに長く続き、ページの再読み込みとリストアに耐えられる限り長く続きます( )。 新しいタブまたはウィンドウでページを開くと、新しいセッションが になります。これはセッションクッキーの仕組みとは異なります。 fiddle

作業

function myTimer() { 
if(!sessionStorage.getItem('firstVisitTime')) { 
    var myDate = Date.now(); 
    if(!localStorage.getItem('timeOnSite')) { 
    sessionStorage.setItem('firstVisitTime',myDate); 
    } else { 
    if(localStorage.getItem('tabsCount') && parseInt(localStorage.getItem('tabsCount'))>1){ 
    sessionStorage.setItem('firstVisitTime',myDate-parseInt(localStorage.getItem('timeOnSite'))); 
    } else { 
    sessionStorage.setItem('firstVisitTime',myDate); 
    } 
} 
} 
var myInterval = setInterval(function(){ 
    var time = Date.now()-parseInt(sessionStorage.getItem('firstVisitTime')); 
    localStorage.setItem('timeOnSite',time); 
    document.getElementById("output").innerHTML = (time/1000)+' seconds have passed since first visit'; 
}, 1000); 
return myInterval; 
}  
window.onbeforeunload=function() { 
console.log('Document onbeforeunload state.'); 
clearInterval(timer); 
}; 
window.onunload=function() { 
var time = Date.now(); 
localStorage.setItem('timeLeftSite',time); 
localStorage.setItem("tabsCount",parseInt(localStorage.getItem("tabsCount"))-1); 
console.log('Document onunload state.'); 
}; 
if (document.readyState == "complete") { 
if(localStorage.getItem("tabsCount")){ 
localStorage.setItem("tabsCount",parseInt(localStorage.getItem("tabsCount"))+1); 
var timer = myTimer(); 
} else { 
localStorage.setItem("tabsCount",1); 
} 
    console.log("Document complete state."); 
} 

あなたは、サーバー側のソリューションをしたい場合は、$_SESSION['timeOnSite']変数を設定し、各ページのナビゲーションに応じて更新します。

+0

あなたのソリューションは、Webサイトでユーザーが費やした時間を提供しません。最初の訪問からの経過時間のみを返します。 –

+0

@EtienneMartin ....あなたがブラウザを閉じてもそれがlocalStorageキー 'firstVisitTime'を保持することを意味するならば、それは次の訪問時に新しい' firstVisitTime'ではなくその日付から数え始めます。いくつか...コーヒー! :) –

+0

@EtienneMartin 'sessionStorage'がこの質問のための最良の選択であるようです。あなたがウェブサイトで費やした時間を数えるのに問題が生じたくない場合に備えて。唯一の問題は、同じページの新しいブラウザのタブで、そのユーザーセッションだけの時間がカウントされることです。 –

関連する問題