2010-10-08 15 views
5

ho questa esigenza:Web: il sistema registrerà il tempo in cui l'utente visualizza ogni pagina

Il sistema registrerà il tempo in cui l'utente visualizzato ogni pagina.

Mentre è banale in un'app rich-client, non ho idea di come la gente di solito vada a tracciare questo.

Modificato: Di John Hartsock

Sono sempre stato incuriosito da questo e sembra a me che questo potrebbe essere possibile con l'utilizzo di eventi document.onunload, con precisione Caputure stella e l'ora di tutti i pagine. Fondamentalmente, finché un utente rimane sul tuo sito, sarai sempre in grado di ottenere l'ora di inizio e di fine per ogni pagina tranne l'ultima. Ecco lo scenario.

  • L'utente entra nel tuo sito. - Ho un momento inizio per la home page
  • utente va alla pagina 2 del vostro sito - ho un tempo di arresto per la home page e di un orario di inizio per la pagina 2
  • utente esce tuo sito. - Come si ottiene l'orario di fine ultimo per la pagina 2

La domanda diventa è possibile tenere traccia di quando un utente chiude la finestra o si allontana dal proprio sito? Sarebbe possibile utilizzare gli eventi onunload? Se no, allora quali sono altre possibilità? Chiaramente AJAX sarebbe un percorso, ma quali sono altri percorsi?

risposta

5

Non penso che sia possibile catturare ogni singola pagina di visualizzazione, ma penso che si possa essere in grado di acquisire informazioni sufficienti per essere utili per l'analisi dell'utilizzo del sito Web.

Creare una tabella di database con colonne per: nome della pagina Web, nome utente, ora di inizio e ora di fine.

Al caricamento della pagina, INSERIRE un record nella tabella contenente i dati per i primi tre campi. Restituire l'ID di quel record per uso futuro.

Su qualsiasi navigazione, AGGIORNA il record nel gestore eventi di navigazione, utilizzando l'ID restituito in precedenza.

Ci si ritroverà con molti più record con orari di inizio rispetto ai record con ora di inizio e di fine. Ma puoi fare queste analisi da questi semplici dati:

  • È possibile contare il numero di visite a ciascuna pagina contando i tempi di inizio.
  • È possibile calcolare il periodo di tempo in cui l'utente visualizza ciascuna pagina per i record che hanno sia l'ora di inizio che quella di fine.
  • Se si dispone di altre informazioni sugli utenti, ad esempio ruoli o posizioni, è possibile eseguire ulteriori analisi della visualizzazione delle pagine. Ad esempio, se conosci i ruoli, puoi vedere quali ruoli utilizzano maggiormente le pagine.

È possibile che i dati vengano distorti dal fatto che alcune pagine vengono abbandonate più spesso di altre.

Tuttavia, si può certamente provare ad acquisire questi dati e vedere come appare ragionevole. A volte nel mondo reale, dobbiamo rendere debito con un'informazione meno che perfetta. Ma potrebbe essere abbastanza.


Edit: Uno di questi approcci potrebbe soddisfare le vostre esigenze.

1) Ecco la parte HTML di una soluzione Ajax . È dal this page, che ha il codice PHP per la registrazione delle informazioni in un file di testo - abbastanza facile da passare alla scrittura in un database, se lo si desidera.

<html> 
<head> 
<title>Duration Logging Demo</title> 
<script type=”text/javascript”> 
var oRequest; 
var tstart = new Date(); 

// ooooo, ajax. ooooooo … 
if(window.XMLHttpRequest) 
oRequest = new XMLHttpRequest(); 
else if(window.ActiveXObject) 
oRequest = new ActiveXObject(“Microsoft.XMLHTTP”); 

function sendAReq(sendStr) 
// a generic function to send away any data to the server 
// specifically ‘logtimefile.php’ in this case 
{ 
oRequest.open(“POST”, “logtimefile.php”, true); //this is where the stuff is going 
oRequest.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); 
oRequest.send(sendStr); 
} 

function calcTime() 
{ 
var tend = new Date(); 
var totTime = (tend.getTime() – tstart.getTime())/1000; 
msg = “[URL:" location.href "] Time Spent: ” totTime ” seconds”; 
sendAReq(‘tmsg=’ msg); 
} 
</script> 
</head> 

<body onbeforeunload=”javascript:calcTime();”> 
Hi, navigate away from this page or Refresh this page to find the time you spent seeing 
this page in a log file in the server. 
</body> 
</html> 

2) Another fellow propone la creazione di un timer in Page_Load. Scrivi il record del database iniziale a quel punto. Quindi, sull'evento Elapsed del timer, eseguire un aggiornamento di tale record. Effettuare un aggiornamento finale in onbeforeunload. Quindi, se per qualche motivo perdi l'ultimo evento onbeforeunload, almeno avrai registrato la maggior parte del tempo trascorso dall'utente sulla pagina (a seconda del timer Interval). Naturalmente, questa soluzione sarà relativamente ricca di risorse se si aggiorna ogni secondo e si hanno centinaia o migliaia di utenti simultanei. Pertanto, è possibile rendere configurabile l'attivazione e la disattivazione di questa funzione per l'applicazione.

+0

Il "gestore di eventi di navigazione" è disponibile in JavaScript? (Scusate, sono un programmatore di Windows. Non faccio molto lavoro sul web.) –

+0

@ Jonathan Allen: ho usato "gestore di eventi di navigazione" come termine generale per un numero di eventi incluso cose come un clic del pulsante o il collegamento ipertestuale che porta l'utente a un'altra pagina. Questo potrebbe accadere su un menu. Ogni volta che l'utente fa clic su qualcosa che si sposta su un'altra pagina, lascia la pagina corrente. A quel punto, puoi catturare il tempo in cui hanno lasciato la pagina e registrarla. Se si dispone di collegamenti costituiti da tag di ancoraggio, potrebbe essere necessario cambiarli in LinkButtons in modo da poter acquisire l'evento sul lato server. – DOK

+0

il "gestore eventi di navigazione" può essere javascript. Un buon candidato è window.unload. – Guillaume

1

In un sistema basato sul Web, non c'è modo di farlo in modo affidabile. Certo, puoi registrare ogni pagina che un utente visualizza e registra il periodo di tempo che intercorre tra ciascuna vista, ma cosa succede quando chiudono il browser nell'ultima pagina che stanno visualizzando? Questo è solo uno dei dozzine di problemi con questo requisito.

+0

Considerando le sue metriche, ritengo che l'affidabilità non sia importante. –

+0

@Jonathan - Yeh, chi basa le decisioni aziendali su metriche o fatti accurati? Non è che siano utili o qualcosa del genere. –

+1

Esistono molte soluzioni esistenti che registrano questo tipo di dati. Finché gli utenti non disattivano javascript, puoi ottenere un'affidabilità piuttosto buona. E per la maggior parte dei siti, questa è una percentuale piuttosto piccola. – Guillaume

1

Che dire di un approccio basato su AJAX? Funzionerebbe solo quando Javascript è sul lato client, ma l'invio di un POST a qualche script ogni 15 secondi ti darà una quantità ragionevole di granularità.

Ci sono anche cose "reverse-AJAX" più complicate che potresti essere in grado di fare ... ma non ne so molto.

+0

Non lo so. 15 secondi non sono molto granulari, e niente di meno causerà troppa volatilità nel database a meno che non costruisca una sorta di scrittore pigro ... –

2

Questo deve essere fatto con qualche javascript. Come detto l'altro, non è completamente affidabile. Ma dovresti essere in grado di ottenere dati accurati più che sufficienti.

Sarà necessario chiamare il server dal codice javascript quando la pagina viene scaricata. L'evento javascript da agganciare è window.unload. Oppure puoi utilizzare un'API più carina, come jQuery. Oppure puoi utilizzare una soluzione pronta, come WebTrends o Google Analytics. Penso che entrambi registrino il tempo di visualizzazione della pagina.

Una buona analisi del Web è piuttosto difficile. E diventa più difficile se devi gestire molto traffico. Dovresti provare a trovare una soluzione esistente e non reinventare la tua ...

+0

sebbene non sia specificato qui, forse questo è un caso limite - uno in cui l'uso del il sito Web sarà un browser di solo testo o un dispositivo di assistenza. come funziona la soluzione javascript in questo caso? dal momento che il PO ha affermato che un mondo ricco di clienti non era il suo dominio, questo non sembra essere troppo lontano dal suo mondo. – KevinDTimm

1

Puoi utilizzare onunload per fare ciò che ti serve. Invia una richiesta AJAX al tuo server per aggiornare un database. È possibile che si desideri restituire false, quindi document.close una volta completata la richiesta AJAX in modo tale che non si interrompa prematuramente e l'ajax non venga scartato.

Nel database, si desidera solo memorizzare la pagina, l'indirizzo IP, l'ora dell'evento e se si è verificato un evento onload o onunload.

Questo è tutto quello che c'è.

2

Ho messo un po 'di lavoro in una piccola libreria JavaScript che calcola la durata di un utente su una pagina web.Ha il vantaggio aggiunto di tracciare con precisione (non perfettamente, però) il tempo di interazione di un utente con la pagina. Ignora il tempo in cui un utente passa a diverse schede, diventa inattivo, riduce al minimo il browser, ecc. Il metodo di Google Analytics suggerito ha la mancanza (a quanto ho capito) che controlla solo quando una nuova richiesta viene gestita dal tuo dominio. Confronta il tempo di richiesta precedente con il nuovo orario di richiesta e chiama il "tempo trascorso sulla tua pagina web". In realtà non sa se qualcuno sta visualizzando la tua pagina, ha minimizzato il browser, ha cambiato scheda in 3 diverse pagine web dall'ultimo caricamento della pagina, ecc.

Come molti altri hanno menzionato, nessuna soluzione è perfetta. Ma spero che anche questo fornisca un valore.

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.

Problemi correlati