Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Таймер по событиям


Автор: evilelf 13.9.2010, 15:47
Здравствуйте.
Нужно запустить таймер на странице после прекращения каких-либо действий пользователя (клики, движение курсора, ввод данных в поля и т.п.). Скажем, пользователь вводит некую информацию, и если какие либо действия с его стороны прекращаются более чем на несколько секунд - запускается таймер. 
Как реализовать саму "считалку", я знаю (setTimeout), а вот как отследить прекращение каких-либо действий пользователя и уже по этому событию запускать таймер?

Приветствуются варианты с использованием фреймворков smile

Автор: magelan 13.9.2010, 17:15
висят функции на событиях

document.onmousemove = f;
document.onclick = f;
document.onkeydown = f;

функция f сбрасывает глобальную переменную flag в 0.

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

как только переменная достигла определенного значения, начинается шангри-ла.

"Определенное значение" зависит от того, как часто работает setTimeout, определяется славным методом "научного тыка".


Автор: ksnk 13.9.2010, 17:20
Цитата(magelan @  13.9.2010,  17:15 Найти цитируемый пост)
висят функции на событиях

document.onmousemove = f;
document.onclick = f;
document.onkeydown = f;

Код

function f(){
  if(f.time) clearTimeout(f.time);
  f.time= setTimeout(user_looks_like_sleeping,30000); // 30000 - 30 секунд 
}
function user_looks_like_sleeping(){
   alert('не спи, замерзнешь!');
}


magelan, научный тык не нужен  smile 

Автор: evilelf 13.9.2010, 17:45
Оу, спасибо за солюшен, работает!

Код

document.onmousemove = timer;
document.onclick = timer;
document.onkeydown = timer;

function timer(){
  if(timer.time) clearTimeout(timer.time);
  timer.time = setTimeout(function(){alert('ололо!!!11');}, 1000);
}

Автор: magelan 13.9.2010, 17:48
ksnk,
 
Цитата

magelan, научный тык не нужен 

как же без него то? без него скушно.

Я немного опасаюсь вашего решения, из-за частоты вызывания onmousemove.
Мне кажется, что setTimeout лучше пусть живет отдельно.

Впрочем выбор решения все равно за автором темы.

Автор: ksnk 13.9.2010, 18:24
Цитата(magelan @  13.9.2010,  17:48 Найти цитируемый пост)
Я немного опасаюсь вашего решения, из-за частоты вызывания onmousemove. Мне кажется, что setTimeout лучше пусть живет отдельно.

если в onmosemove будет делаться что-то тяжелое - он просто будет вызыватся с меньшей частотой, так что производительность не сильно пострадает. Вот только события могут начать пропадать. А насчет реальности задержки - можно прогнать такой тестик
Код

window.time=0;
var date = new Date(),t;

function xxx(){alert(window.time);}

for(i=0;i<1000;i++){
  clearTimeout(t);
//  t=setTimeout(xxx,1000);
  t=setTimeout("alert(window.time)",1000);
}
date2 = new Date();
time=date2.getMilliseconds()-date.getMilliseconds();

у меня в хроме выдает 4-6, в IE6 - 31. Тоесть в секунду вполне могут уместится 30000 итераций на моем компутере на IE6. Стоит ли переживать из-за такого замедления?

Автор: evilelf 13.9.2010, 20:22
Вообще, сей таймер пишется под машины с тачскрином...так что там будут только клики: по кнопкам формы, виртуальной клавиатуры... Кстати, хороший скрипт последней не подскажете? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)