Веб: система будет записывать время, в течение которого пользователь отображал каждую страницу. - PullRequest
5 голосов
/ 08 октября 2010

У меня есть это требование:

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

Хотя в приложении с расширенными возможностями клиент тривиален, я понятия не имею, как люди обычно отслеживают это.

Под редакцией: Джон Хартсок

Мне всегда было любопытно по этому поводу, и мне кажется, что это могло бы быть возможно с использованием событий document.onunload для точного определения времени звездочек и остановок для всех страниц. В основном, пока пользователь остается на вашем сайте, вы всегда сможете узнать время начала и окончания каждой страницы, кроме последней. Вот сценарий.

  • Пользователь заходит на ваш сайт. -- У меня есть время начала домашней страницы
  • Пользователь переходит на страницу 2 вашего сайта - у меня есть время остановки для домашней страницы и время начала для страницы 2
  • Пользователь покидает ваш сайт. - Как вы получаете окончательное время остановки для страницы 2

Возникает вопрос: можно ли отслеживать, когда пользователь закрывает окно или уходит с вашего сайта? Можно ли использовать события onunload? Если нет, то каковы другие возможности? Ясно, что AJAX будет одним маршрутом, но каковы другие маршруты?

Ответы [ 7 ]

5 голосов
/ 08 октября 2010

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

Создание таблицы базы данных со столбцами для: имени веб-страницы, имени пользователя, времени начала и времени окончания.

При загрузке страницы вставьте в таблицу запись, содержащую данные для первых трех полей. Верните идентификатор этой записи для будущего использования.

В любой навигации ОБНОВИТЬ запись в обработчике события навигации, используя идентификатор, возвращенный ранее.

У вас будет гораздо больше записей с временем начала, чем с начальным и конечным временем. Но вы можете сделать этот анализ из этих простых данных:

  • Вы можете посчитать количество посещений каждой страницы, посчитав время начала.
  • Вы можете рассчитать время, в течение которого пользователь отображал каждую страницу для записей, имеющих время начала и окончания.
  • Если у вас есть другая информация о пользователях, например, роли или местоположения, вы можете больше анализировать просмотр страниц. Например, если вы знаете роли, вы можете увидеть, какие роли используют какие страницы чаще всего.

Возможно, ваши данные будут искажены из-за того, что некоторые страницы заброшены чаще, чем другие.

Однако вы, безусловно, можете попытаться получить эти данные и посмотреть, насколько они разумны. Иногда в реальном мире нам приходится делать из-за неполной информации. Но этого может быть достаточно.


Редактировать: Любой из этих подходов может удовлетворить ваши потребности.

1) Вот HTML-часть решения Ajax . Это с этой страницы , в которой есть PHP-код для записи информации в текстовый файл - достаточно легко перейти на запись в базу данных, если хотите.

 <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) Другой сотрудник предлагает создать таймер в Page_Load. Напишите начальную запись базы данных в этот момент. Затем для события таймера Elapsed обновите эту запись. Сделайте окончательное обновление в onbeforeunload. Затем, если по какой-то причине вы пропустите самое последнее событие onbeforeunload, по крайней мере, вы будете записывать большую часть времени, проведенного пользователем на странице (в зависимости от таймера Interval). Конечно, это решение будет относительно ресурсоемким, если вы обновляете каждую секунду и у вас есть сотни или тысячи одновременно работающих пользователей. Таким образом, вы можете настроить его так, чтобы эта функция включалась и выключалась для приложения.

2 голосов
/ 01 февраля 2015

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

Как уже упоминали многие другие, ни одно решение не является идеальным. Но мы надеемся, что этот тоже дает ценность.

Редактировать: я обновил пример, чтобы включить текущее использование 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>

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

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.

2 голосов
/ 12 октября 2010

Это должно быть сделано с помощью некоторого JavaScript.Как сказал другой, это не совсем надежно.Но вы должны быть в состоянии получить более чем достаточно точных данных.

Для этого потребуется вызвать ваш сервер из кода JavaScript, когда страница выгружается.Событие javascript для подключения - это window.unload.Или вы можете использовать более приятный API, например jQuery .Или вы можете использовать готовое решение, например WebTrends или Google Analytics .Я думаю, что оба записывают продолжительность отображения страницы.

Хорошая веб-аналитика довольно сложна.И это становится сложнее, если вам приходится управлять большим трафиком.Вы должны попытаться найти существующее решение, а не изобретать свое собственное ...

1 голос
/ 12 октября 2010

Вы можете использовать onunload, чтобы делать то, что вам нужно. Пусть он отправит запрос AJAX на ваш сервер для обновления базы данных. Вы можете вернуть false, а затем выполнить document.close после завершения запроса AJAX, чтобы он не завершился преждевременно и ajax не был удален.

В базе данных вы просто захотите сохранить страницу, IP-адрес, время события, а также было ли это событие onload или onunload.

Вот и все.

1 голос
/ 08 октября 2010

А как насчет подхода на основе AJAX?Это будет работать только тогда, когда Javascript находится на стороне клиента, но отправка POST некоторому сценарию каждые 15 секунд даст вам разумную степень детализации.быть в состоянии сделать ... но я не знаю много о них.

1 голос
/ 08 октября 2010

В веб-системе нет надежного способа сделать это.Конечно, вы можете записывать каждую страницу, отображаемую пользователем, и записывать промежуток времени между каждым просмотром, но что произойдет, когда они закроют браузер на последней странице, на которой они отображаются?Это одна из десятков проблем, связанных с этим требованием.

0 голосов
/ 03 июля 2019

Я недавно сделал пример записи html-страницы, потраченной временем. обновление не прерывает запись, а закрытие

Я использую sessionStorage, чтобы сократить время, затраченное на эту страницу если обновить Я бы положил это в sessionStorage если близко Я не могу получить его из sessionSotrage, поэтому я установил время = 0

вот мой код

`

<body>
time spent  :<div id="txt"></div>
</body>
<script>
    $(function () {
        statisticsStay();
    })
    function statisticsStay(){
        var second=0;
        if(sessionStorage.getItem('testSecond')!=null)
            second=sessionStorage.getItem('testSecond');
        var timer = setInterval(function(){
            second++;
            document.getElementById('txt').innerHTML=second;
        },1000);
        window.onbeforeunload = function(){
            sessionStorage.setItem('testSecond',second);
        };
    }

</script>

`

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