Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.12.2022, 12:25
Интересующийся
Отправить личное сообщение для karnager Посмотреть профиль Найти все сообщения от karnager
 
Регистрация: 14.06.2019
Сообщений: 16

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

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

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


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

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

Спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 02.12.2022, 12:39
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

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

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

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

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

Последний раз редактировалось voraa, 02.12.2022 в 12:46.
Ответить с цитированием
  #3 (permalink)  
Старый 02.12.2022, 13:41
Интересующийся
Отправить личное сообщение для karnager Посмотреть профиль Найти все сообщения от karnager
 
Регистрация: 14.06.2019
Сообщений: 16

Я сохраняю начало сессии в 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 секунд:
Ответить с цитированием
  #4 (permalink)  
Старый 02.12.2022, 15:02
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Какой то такой скрипт вставляется на каждую страницу
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);
});
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить данные через AJAX и отобразить на странице skiller AJAX и COMET 2 17.06.2011 11:09
кеширование HTML переданого через ajax BorisBritva jQuery 6 02.04.2011 01:23
запуск функции через событие radio DmitryT Элементы интерфейса 5 05.03.2011 10:26
Добавить событие через mootools true Библиотеки/Тулкиты/Фреймворки 6 18.07.2010 23:17
переход по ссылке через N секунд jerryfish Events/DOM/Window 4 23.02.2010 17:05