Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Время пребывания на странице (https://javascript.ru/forum/events/85085-vremya-prebyvaniya-na-stranice.html)

ureech 02.04.2023 20:47

Время пребывания на странице
 
Привет. Хочу отправлять запрос со временем пребывания юзера на странице. Пришёл к этому
var old = "";
var current = window.location.href;
 var vt = (new Date).getTime();
 var ts = Math.round(vt/1000);
 var sec = ts % 60;
function changeUrl(current){
    if(current != old){
        alert(sec);
        old = current;
    }

    old = window.location.href;
    setInterval(function() {
        changeUrl(window.location.href);
    }, 1000);
}
changeUrl();


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

voraa 03.04.2023 07:15

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

voraa 03.04.2023 07:41

Цитата:

Сообщение от ureech
Хочу отправлять запрос

А в какой момент запрос будет отправляться?

ureech 03.04.2023 09:46

Я думаю в момент перехода на другую страницу

ureech 03.04.2023 10:07

Цитата:

Сообщение от voraa
setInterval каждый раз запускает бесконечную последовательность вызовов функций.

Ок. Поменял на так

var old = "";
var current = window.location.href;
function changeUrl(current,sec){
    if(current != old){
        
        alert(sec);
        old = current;
    }
    
    old = window.location.href;

    setTimeout(function() {
        var vt = (new Date).getTime();
        var ts = Math.round(vt/1000);
        var sec = ts % 60;
        changeUrl(window.location.href,sec);
    }, 1000);
}

changeUrl();


Теперь sec undrfined)

ureech 03.04.2023 10:44

Ну вроде что то получается.

date = new Date();
start = date.getTime();
function init() {
    var time = new Date();
    return (time.getTime() - start) / 1000;
}

function getTime() {
    var ts = Math.round(init());
    var sec = ts % 60;
var this_sec = "" + ((sec > 9) ? sec : "0" + sec);
    changeUrl(window.location.href, this_sec);
    setTimeout(function () {
        getTime(this_sec)
        
    }, 1000);
}
var old = "";
var current = window.location.href;
function changeUrl(current, this_sec) {
    if (current != old) {
        var sec = localStorage.getItem('lsec')
       alert(sec)// тут вместо alert() отправлю запрос       
        old = current;
    }
   localStorage.setItem('lsec',this_sec);
    old = window.location.href;
}
getTime()

ureech 03.04.2023 11:39

Один баг. old всегда пустая. И получается, что при перезагрузки страницы запрос тоже отправляется. А не должен.

voraa 03.04.2023 12:06

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

voraa 03.04.2023 12:14

Цитата:

Сообщение от ureech
Один баг. old всегда пустая

Конечно. Ведь новый window.location будет только когда новая страница загрузится. Старой и скрипта уже не будет.

voraa 03.04.2023 12:29

Если надо учитывать сколько времени пользователь просматривал страницу, то наверно надо учитывать только то время, когда вкладка была активна. Если пользователь смотрел другую вкладку, минимизировал окно, переключился на другую задачу, то это не то время, что он смотрел страницу.
Что бы учесть все эти варианты надо использовать событие visibilitychange и смотреть когда вкладка становится активной и когда становится невидимой.
https://developer.mozilla.org/en-US/...tychange_event
Ну и если надо послать запрос на сервер с указанием сколько времени пользователь провел на странице, то это можно по событию unload послать запрос с помощью navigator.sendBeacon
https://developer.mozilla.org/en-US/...tor/sendBeacon


Часовой пояс GMT +3, время: 06:51.