Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Запустить событие на странице через X секунд (https://javascript.ru/forum/events/84734-zapustit-sobytie-na-stranice-cherez-x-sekund.html)

karnager 02.12.2022 12:25

Запустить событие на странице через X секунд
 
Всем привет. Мне необходимо после определенного времени, проведенного пользователем на сайте (например, 5 секунд), запускать событие "vasyaPupkin". Как можно это сделать?

Пример моего кода:

if ( timer_var > 5) 
// запустить событие vasyaPupkin


Но поскольку пользователь ничего не делает на странице, то триггера на выполнение кода никакого нет. А как его задать, чтобы он сработал?

Пользователь может при этом перемещаться по сайту и тогда в timer_var записывается его общее время пребывания, и оно не обнуляется после перезагрузки страницы, поэтому setTimeout и setInterval, как я понимаю, не подойдут. Если поставить timer_var > 90, то событие должно сработать на сайте через полторы минуты, не важно на какой странице находится пользователь и что он при этом делает - сидит и ничего не делает, скроллит, смотрит видео и т.д.

Спасибо

voraa 02.12.2022 12:39

В sessionStorage записываешь время прихода на первую страницу сайта

https://developer.mozilla.org/en-US/...sessionStorage

На каждой странице должен работать таймер (каждую секунду) и проверяешь, если текущее время больше времени прихода на условно 90сек, то вызываешь событие. Но это придется делать на каждой странице.
Единственное, надо предусмотреть, что пользователь может открыть другую страницу в новой вкладке. Поэтому надо останавливать таймеры на неактивных вкладках. А когда вкладка стала активной снова запускать.

https://developer.mozilla.org/en-US/...tychange_event

karnager 02.12.2022 13:41

Я сохраняю начало сессии в cookie session-start (см. скрин) в формате Unix. Текущее время тоже могу извлечь да, с помощью Date.now()

Разница session-start - Date.now() / 1000 даст нам количество секунд с момента начала сессии?

То есть у меня должно быть условие вида:

function TimeEvent() {
  var Date.now();
  var session-start;
  var topTime = (session-start - Date.now() / 1000);
  if (time_var > 5)
 // запустить событие vasyaPupkin
}
 
setTimeout(TimeEvent, topTime);


Про активность вкладок узнал, это на данный момент не нужно учитывать. Просто если старт сессии начался, то фиксируем это время и от него X секунд:

voraa 02.12.2022 15:02

Какой то такой скрипт вставляется на каждую страницу
window.addEventListener('load', () => {
	const DEADLINE = 10 * 1000;
	
	// Если нет записи, пишем в sessionStorage
	if (!sessionStorage.getItem('timebeg'))
		sessionStorage.setItem('timebeg', Date.now() + '');

	// Вызов события
	const timerevent = (d) => {
		alert('TIMEREVENT ' + d);
	};

	// Функция таймера
	const timerfun = () => {
		const t0 = +sessionStorage.getItem('timebeg');
		const t1 = Date.now();
		const d = t1 - t0;
		if (d < DEADLINE) {
			timer = setTimeout(timerfun, 1000);
		} else {
			// время истекло
			// пишем запись wasevent, что бы не вызывать повторно
			sessionStorage.setItem('wasevent', 'true');
			timerevent(d);
		}
	};

	let timer;

	const stateChange = () => {
		// событие уже вызывалось
		if (sessionStorage.getItem('wasevent')) return;

		if (document.visibilityState === 'visible') {
			// страница стала видимой - запустить таймер
			timer = setTimeout(timerfun, 1000);
		} else {
			// страница стала не видимой - отключаем таймер
			clearTimeout(timer);
		}
	};

	document.addEventListener('visibilitychange', stateChange);

	//запускаем таймер первый раз, если еще не сработал
	if (!sessionStorage.getItem('wasevent')) timer = setTimeout(timerfun, 1000);
});


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