Подтвердить что ты не робот

Как измерить время, проведенное на странице?

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

4b9b3361

Ответ 1

Если вы используете Google Analytics, они предоставляют эту статистику, хотя я точно не знаю, как они ее получают.

Если вы хотите выполнить свой собственный запрос, вам понадобится запрос AJAX, который будет отправлен на ваш сервер для регистрации.

В jQuery есть метод .unload(...), который вы можете использовать так:

$(document).ready(function() {
  var start = new Date();

  $(window).unload(function() {
      var end = new Date();
      $.ajax({ 
        url: "log.php",
        data: {'timeSpent': end - start},
        async: false
      })
   });
});

Подробнее здесь: http://api.jquery.com/unload/

Единственное предостережение здесь заключается в том, что он использует событие javascript beforeunload, которое не всегда запускается с достаточным количеством времени для выполнения AJAX-запроса, подобного этому, поэтому разумно вы потеряете много данных.

Другой метод заключается в том, чтобы периодически опрашивать сервер сообщениями типа "ОСТАЕТСЯ ЗДЕСЬ", которые можно обрабатывать более согласованно, но, очевидно, намного дороже.

Ответ 2

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

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

Редактировать 2: Обновление домена, где размещен проект

https://github.com/jasonzissman/TimeMe.js/

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

Включите на своей странице:

<!-- Download library from https://github.com/jasonzissman/TimeMe.js/ -->
<script src="timeme.js"></script>
<script type="text/javascript">
TimeMe.initialize({
    currentPageName: "home-page", // page name
    idleTimeoutInSeconds: 15 // time before user considered idle
});
</script>

Если вы хотите сообщить время самостоятельно бэкэнду:

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

Ответ 3

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

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

Ответ 4

Я думаю, что лучший способ - хранить время при загрузке и выгрузке обработчиков событий в файлах cookie, например. а затем анализировать их на серверных сценариях

Ответ 5

В дополнение к ответу Джейсона, здесь небольшой фрагмент кода, который должен делать трюк, если вы предпочитаете не использовать библиотеку, он учитывает, когда пользователь переключает вкладки или фокусирует другое окно.

let startDate = new Date();
let elapsedTime = 0;

const focus = function() {
    startDate = new Date();
};

const blur = function() {
    const endDate = new Date();
    const spentTime = endDate.getTime() - startDate.getTime();
    elapsedTime += spentTime;
};

const beforeunload = function() {
    const endDate = new Date();
    const spentTime = endDate.getTime() - startDate.getTime();
    elapsedTime += spentTime;

    // elapsedTime contains the time spent on page in milliseconds
};

window.addEventListener('focus', focus);
window.addEventListener('blur', blur);
window.addEventListener('beforeunload', beforeunload);

Ответ 6

Согласно правильному ответу, я думаю, что это не лучшее решение. Потому что согласно документам jQuery:

Точная обработка события разгрузки варьировалась от версии до версии браузеров. Например, некоторые версии Firefox запускают событие, когда выполняется ссылка, но не тогда, когда окно закрыто. В практическое использование, поведение должно проверяться на всех поддерживаемых браузерах и отличается от аналогичного события beforeunload.

Другое дело, что вы не должны использовать его после загрузки документов, потому что результат вычитания времени может быть поддельным.

Итак, лучшим решением является добавление его в событие onbeforeunload в конце раздела <head> следующим образом:

<script>
var startTime = (new Date()).getTime();

window.onbeforeunload = function (event) {
    var timeSpent = (new Date()).getTime() - startTime,
        xmlhttp= new XMLHttpRequest();
    xmlhttp.open("POST", "your_url");
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    var timeSpentOnPage = TimeMe.getTimeOnCurrentPageInSeconds();
    xmlhttp.send(timeSpent);
};
</script>

Конечно, если вы хотите подсчитать время с помощью детектора Idle, вы можете использовать:

https://github.com/serkanyersen/ifvisible.js/

TimeMe - это оболочка для пакета, который я вставляю выше.

Ответ 7

<body onLoad="myFunction()">
<script src="jquery.min.js"></script>
<script>
var arr = [];
window.onbeforeunload = function(){
var d = new Date();
var n = d.getTime();
arr.push(n);
var diff= n-arr[0];
var sec = diff/1000;
var r = Math.round(sec);
return "Time spent on page: "+r+" seconds";
};
function myFunction() {
var d = new Date();
var n = d.getTime();
arr.push(n);
}
</script>

Ответ 9

𝗨𝘀𝗲 𝗽𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲.𝗻𝗼𝘄()

Запуск встроенного кода, чтобы получить время, которое пользователь получил на страницу, блокирует загрузку страницы. Вместо этого используйте performance.now() который показывает, сколько миллисекунд прошло с момента первого перехода пользователя на страницу. Date.now измеряет время на часах, которое может отличаться от времени навигации на секунду или более из-за таких факторов, как повторная синхронизация времени и високосные секунды. performance.now() поддерживается в IE10+ и во всех вечнозеленых браузерах (evergreen = сделано для удовольствия, а не для получения прибыли). Самая ранняя версия Internet Explorer, которая существует сегодня, - это Internet Explorer 11 (последняя версия), так как Microsoft прекратила выпуск Windows XP в 2014 году.

(function(){"use strict";

var secondsSpentElement = document.getElementById("seconds-spent");
var millisecondsSpentElement = document.getElementById("milliseconds-spent");

requestAnimationFrame(function updateTimeSpent(){
    var timeNow = performance.now();
    
    secondsSpentElement.value = round(timeNow/1000);
    millisecondsSpentElement.value = round(timeNow);
    
    requestAnimationFrame(updateTimeSpent);
});
var performance = window.performance, round = Math.round;
})();
Seconds spent on page:&nbsp; <input id="seconds-spent" size="6" readonly="" /><br />
Milliseconds spent here: <input id="milliseconds-spent" size="6" readonly="" />