6

Supponiamo di avere un'estensione del browser che esegue pagine JS che l'utente visita.È possibile sapere per quanto tempo un utente ha speso su una pagina?

C'è un evento "outLoad" o qualcosa del genere per iniziare a contare e vedere quanto tempo l'utente ha speso su una pagina?

+0

c'è un modo, non avete bisogno di un js per that..you può avviare un timer pageload e continua ad inserire valori nel tuo database. Ti darò solo una demo..attesa 10 min –

+2

L'approccio migliore non sarebbe il conteggio o l'esecuzione di un timer, ma per controllare l'ora su Load e OnBeforeUnload e calcolare la differenza. – Thor84no

risposta

5

Suppongo che l'utente apra una scheda, sfoglia una pagina Web, quindi passa a un'altra pagina Web, torna alla prima scheda, ecc. Si desidera calcolare il tempo esatto trascorso dall'utente. Si noti inoltre che un utente potrebbe aprire una pagina Web e mantenerla in esecuzione, ma andarsene. Torna un'ora dopo e poi ancora una volta accedi alla pagina. Non vorrai contare il tempo che è lontano dal computer come tempo trascorso sulla pagina web. Per questo, il codice seguente esegue un docus ogni 5 minuti. Pertanto, il tempo effettivo potrebbe essere disattivato per granularità di 5 minuti, ma è possibile regolare l'intervallo per verificare la messa a fuoco in base alle proprie esigenze. Si noti inoltre che un utente potrebbe semplicemente fissare un video per più di 5 minuti, nel qual caso il codice seguente non lo conterà. Dovresti eseguire un codice intelligente che controlli se c'è un flash in esecuzione o qualcosa del genere.

Ecco quello che faccio nello script contenuti (usando jQuery):

$(window).on('unload', window_unfocused); 
$(window).on("focus", window_focused); 
$(window).on("blur", window_unfocused); 
setInterval(focus_check, 300 * 1000); 

var start_focus_time = undefined; 
var last_user_interaction = undefined; 

function focus_check() { 
    if (start_focus_time != undefined) { 
     var curr_time = new Date(); 
     //Lets just put it for 4.5 minutes                     
    if((curr_time.getTime() - last_user_interaction.getTime()) > (270 * 1000)) { 
      //No interaction in this tab for last 5 minutes. Probably idle.            
      window_unfocused(); 
     } 
    } 
} 

function window_focused(eo) { 
    last_user_interaction = new Date(); 
    if (start_focus_time == undefined) { 
    start_focus_time = new Date();                
    } 
} 

function window_unfocused(eo) { 
    if (start_focus_time != undefined) { 
    var stop_focus_time = new Date(); 
    var total_focus_time = stop_focus_time.getTime() - start_focus_time.getTime(); 
    start_focus_time = undefined; 
    var message = {}; 
     message.type = "time_spent"; 
     message.domain = document.domain; 
     message.time_spent = total_focus_time; 
     chrome.extension.sendMessage("", message); 
    } 
} 
2
<script type="text/javascript"> 

function send_data(){ 
      $.ajax({ 
       url:'something.php', 
       type:'POST', 
       data:{data to send}, 
       success:function(data){ 
       //get your time in response here 
       } 
      }); 
     } 
//insert this data in your data base and notice your timestamp 


window.onload=function(){ send_data(); } 
window.onbeforeunload=function(){ send_data(); } 

</script> 

Ora calcola la differenza nel tuo tempo. Avrai il tempo speso dall'utente su una pagina.

+0

'setInterval' non garantisce che la tua funzione verrà chiamata esattamente' 'intervallo di tempo, fa il tentativo migliore. Veramente vorresti controllare l'ora, non dare per scontato che sia stato esattamente il tempo che ti aspetti. – Thor84no

+0

capito, modificherò la mia risposta –

+0

Mi preoccupo di martellare il mio server con richieste - non è quello che sta facendo? –

3

onbeforeunload dovrebbe soddisfare la vostra richiesta. Spara appena prima che le risorse della pagina vengano scaricate (pagina chiusa).

1

Il start_time è quando l'utente prima richiesta della pagina e si ottiene il end_time sparando una notifica ajax al server appena prima che l'utente chiude la pagina:

window.onbeforeunload = function() { 
    // Ajax request to record the page leaving event. 
    $.ajax({ 
     url: "im_leaving.aspx", cache: false 
    }); 
}; 

anche di tenere la sessione utente vivo per gli utenti che rimane molto tempo nella stessa pagina (keep_alive.aspx può essere una pagina vuota):

var iconn = self.setInterval(
    function() { 
    $.ajax({ 
     url: "keep_alive.aspx", cache: false }); 
    } 
    ,300000 
); 

allora, è possibile inoltre ottenere il tempo trascorso sul sito, controllando (ogni volta che l'utente congedo s una pagina) se sta navigando verso una pagina/dominio esterni.

+0

Questa soluzione funziona su browser? –

+0

Sì, è cross-browser. $ .ajax qui usa jquery, ma può essere fatto solo con javascript: http://stackoverflow.com/questions/8567114/how-to-make-an-ajax-call-without-jquery –

+1

Intendevo, finestra. onbeforeunload. Ho controllato su mozilla dev e sembra che tu abbia ragione. Per me va bene. –

2

Per chi fosse interessato, ho messo un po 'di lavoro in una piccola libreria JavaScript che i tempi per quanto tempo un utente interagisce con un web pagina. Ha il vantaggio aggiunto di tracciare con precisione (non perfettamente, però) il tempo di interazione di un utente con la pagina. Ignora volte che un utente passa a diverse schede, diventa inattivo, riduce il browser, ecc.

Modifica: ho aggiornato l'esempio per includere l'utilizzo dell'API corrente.

http://timemejs.com

Un esempio del suo utilizzo:

includere nella vostra pagina:

<script src="http://timemejs.com/timeme.min.js"></script> 
<script type="text/javascript"> 
TimeMe.initialize({ 
    currentPageName: "home-page", // page name 
    idleTimeoutInSeconds: 15 // time before user considered idle 
}); 
</script> 

Se si desidera segnalare i tempi di te al tuo back-end:

xmlhttp=new XMLHttpRequest(); 
xmlhttp.open("POST","ENTER_URL_HERE",true); 
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
var timeSpentOnPage = TimeMe.getTimeOnCurrentPageInSeconds(); 
xmlhttp.send(timeSpentOnPage); 

TimeMe.js supporta anche l'invio di dati di temporizzazione tramite websocket, quindi non è necessario provare a forzare una richiesta HTTP completa nell'evento document.onbeforeunload.

0

Rivisitare questa domanda, so che questo non sarebbe di grande aiuto in un env Chrome Ext, ma si potrebbe semplicemente aprire un websock che non fa altro che ping ogni 1 secondo e poi quando l'utente si chiude, sai con precisione di 1 secondo per quanto tempo hanno speso sul sito in quanto morirà la connessione che è possibile scappare come si desidera.

0

Prova active-timeout.js. Utilizza l'API Visibility per verificare quando l'utente è passato a un'altra scheda o ha ridotto a icona la finestra del browser.

Con esso, è possibile impostare un contatore che viene eseguito fino a quando una funzione predicato restituisce un valore falsy:

ActiveTimeout.count(function (time) { 
    // `time` holds the active time passed up to this point. 
    return true; // runs indefinitely 
});