2013-07-23 10 views
6

Powiedz, że mam rozszerzenie przeglądarki, które uruchamia strony JS odwiedzane przez użytkownika.Czy można dowiedzieć się, ile czasu spędził użytkownik na stronie?

Czy istnieje zdarzenie "outLoad" lub coś podobnego do rozpoczęcia liczenia i zobaczenia, ile czasu użytkownik spędził na stronie?

+0

Jest na to sposób, to nie potrzebują js dla that..you może zainicjować timer pageload i kontynuuj wstawianie wartości do bazy danych. Po prostu damy ci wersję demonstracyjną ... odczekaj 10 minut. –

+2

Najlepszym rozwiązaniem byłoby zliczanie lub uruchamianie stopera, ale aby sprawdzić czas onLoad i onBeforeUnload i obliczyć różnicę. – Thor84no

Odpowiedz

5

Zakładam, że Twój użytkownik otwiera zakładkę, przegląda jakąś stronę internetową, a następnie przechodzi na inną stronę, wraca do pierwszej zakładki itp. Chcesz obliczyć dokładny czas spędzony przez użytkownika. Zwróć też uwagę, że użytkownik może otworzyć stronę internetową i utrzymywać ją w ruchu, ale po prostu odejść. Wróć po godzinie, a następnie ponownie wejdź na stronę. Nie chcesz liczyć czasu, w którym jest on poza komputerem, ponieważ czas spędzony na stronie internetowej. W tym celu poniższy kod wykonuje kontrolę dokumentu co 5 minut. W związku z tym rzeczywisty czas może być wyłączony przez 5-minutową ziarnistość, ale można dostosować interwał w celu sprawdzenia ostrości zgodnie z własnymi potrzebami. Pamiętaj też, że użytkownik może po prostu gapić się na wideo przez ponad 5 minut, w którym to przypadku poniższy kod się nie liczy. Będziesz musiał uruchomić inteligentny kod, który sprawdzi, czy działa flash lub coś takiego.

Oto co mam zrobić w skrypcie zawartości (przy użyciu 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> 

Teraz obliczyć różnicę w swoim czasie. Otrzymasz czas spędzony przez użytkownika na stronie.

+0

'setInterval' nie gwarantuje, że twoja funkcja będzie nazywać się dokładnie' 'ilość czasu od siebie, robi to próbę najlepszego wysiłku. Naprawdę chcesz sprawdzić czas, nie zakładaj, że to dokładnie tyle czasu, ile się spodziewasz. – Thor84no

+0

zrozumiał, zmodyfikuje moją odpowiedź –

+0

Jestem zaniepokojony uderzaniem mojego serwera o żądania - czy to nie to, co robi? –

3

onbeforeunload powinien odpowiadać Twojej prośbie. Wystrzeliwuje tuż przed rozładowaniem zasobów strony (strona zamknięta).

1

start_time jest, gdy użytkownik pierwszy wniosek strony i masz end_time przez wypalanie powiadomienie ajax do serwera tuż przed użytkownikiem Zamyka strony:

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

też trzeba utrzymać sesję użytkownika żyje dla użytkowników, którzy długo pozostaje na tej samej stronie (keep_alive.aspx może być puste strony):

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

następnie można dodatkowo uzyskać czas spędzony na stronie, sprawdzając (za każdym razem gdy użytkownik urlopu s strony), jeśli nawiguje do zewnętrznej strony/domeny.

+0

Czy to rozwiązanie działa w różnych przeglądarkach? –

+0

Tak, jest to przeglądarka. $ .ajax tutaj używa jquery, ale można to zrobić tylko za pomocą javascript: http://stackoverflow.com/questions/8567114/how-to-make-an-ajax-call-without-jquery –

+1

Miałem na myśli okno. onbeforeunload. Sprawdziłem w dev mozilla i wygląda na to, że masz rację. Pracuje dla mnie. –

2

Dla zainteresowanych mam włożyć trochę pracy w małej biblioteki JavaScript, który czasy jak długo użytkownik współdziała z sieci strona. Dodatkową zaletą jest dokładniejsze (nie perfekcyjne) śledzenie czasu interakcji użytkownika ze stroną. Ignoruje czasy, w których użytkownik przełącza się na różne karty, przechodzi w stan bezczynności, minimalizuje przeglądarkę itp.

Edytuj: Zaktualizowałem przykład, aby uwzględnić bieżące użycie interfejsu API.

http://timemejs.com

Przykładem jego użytkowania:

Dołącz na stronie:

<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> 

Jeśli chcesz zgłosić samemu razy do backend:

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 obsługuje również wysyłanie danych czasowych za pośrednictwem stron internetowych, więc nie trzeba próbować wymuszać pełnego żądania http w zdarzeniu document.onbeforeunload.

0

Odnosząc się do tego pytania, wiem, że to nie pomogłoby w dodatku do Chrome Ext, ale mógłbyś po prostu otworzyć websock, który nie robi nic oprócz pingowania co 1 sekundę, a kiedy użytkownik rezygnuje, wiesz o precyzji 1 sekundy, ile czasu spędzili na stronie, ponieważ połączenie umrze, ale możesz uciec, jak chcesz.

0

Wypróbuj active-timeout.js. Korzysta z interfejsu Visibility API, aby sprawdzić, kiedy użytkownik przełączył się na inną kartę lub zminimalizował okno przeglądarki.

Dzięki niemu można założyć licznik, który biegnie aż funkcja predykat zwraca wartość falsy:

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