Можно ли узнать, сколько времени пользователь провел на странице?
скажем, у меня есть расширение браузера, которое запускает 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.
пример использования:
включить в свою страницу:
<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
});