Можно ли узнать, сколько времени пользователь провел на странице?

скажем, у меня есть расширение браузера, которое запускает JS-страницы, которые посещает пользователь.

есть ли событие" outLoad " или что-то подобное, чтобы начать подсчет и посмотреть, как долго пользователь провел на странице?

7 ответов


Я предполагаю, что ваш пользователь открывает вкладку, просматривает некоторую веб-страницу, затем переходит на другую веб-страницу, возвращается на первую вкладку и т. д. Вы хотите рассчитать точное время, проведенное пользователем. Также обратите внимание, что пользователь может открыть веб-страницу и сохранить ее, но просто уйти. Вернитесь через час и снова откройте страницу. Вы не хотите считать время, которое он находится вдали от компьютера, Как время, проведенное на веб-странице. Для этого, следующий код выполняет проверку docus каждые 5 минут. Таким образом, ваше фактическое время может быть отключено на 5 минут, но вы можете настроить интервал для проверки фокуса в соответствии с вашими потребностями. Также отметим, что пользователь может просто смотреть на видео более 5 минут, то в этом случае следующий код не будет считать, что. Вам нужно будет запустить интеллектуальный код, который проверяет, работает ли вспышка или что-то еще.

вот что я делаю в скрипте содержимого (используя 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);
    }
}

onbeforeunload должны соответствовать вашему запросу. Он срабатывает прямо перед выгрузкой ресурсов страницы (страница закрыта).


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

теперь посчитайте разницу во времени.вы получите время, проведенное пользователем на странице.


для тех, кто заинтересован, я поместил некоторую работу в небольшую библиотеку JavaScript, которая показывает, как долго пользователь взаимодействует с веб-страницей. Он имеет дополнительное преимущество более точного (не идеально, хотя) отслеживания того, как долго пользователь фактически взаимодействует со страницей. Он игнорирует время, когда пользователь переключается на разные вкладки, простаивает, минимизирует браузер и т. д.

Edit: я обновил пример, чтобы включить текущее использование API.

http://timemejs.com

пример использования:

включить в свою страницу:

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

если вы хотите сообщить о себе раз в ваших 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 также поддерживает отправку данных синхронизации через websockets, поэтому вам не нужно пытаться заставить полный http-запрос в document.onbeforeunload событие.


на start_time - это когда пользователь сначала запрашивает страницу, и вы получаете end_time путем запуска уведомления ajax на сервер непосредственно перед тем, как пользователь покидает страницу:

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

также вы должны сохранить сеанс пользователя для пользователей, которые остаются долгое время на одной странице (keep_alive.aspxможет быть пустая страница) :

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

затем вы можете дополнительно получить время, проведенное на сайте, проверив (каждый раз, когда пользователь покидает страницу), если он переходит на внешний страница / домен.


возвращаясь к этому вопросу, я знаю, что это не будет большой помощью в Chrome Ext env, но вы можете просто открыть websock, который ничего не делает, кроме ping каждые 1 секунду, а затем, когда пользователь завершает работу, вы знаете с точностью до 1 секунды, сколько времени они потратили на сайте, поскольку соединение умрет, которое вы можете избежать, как хотите.


попробовать active-тайм-аут.js. Он использует API видимости, чтобы проверить, когда пользователь переключился на другую вкладку или свернул окно браузера.

С его помощью вы можете настроить счетчик, который работает до тех пор, пока функция предиката не вернет ложное значение:

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