Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверка активности движения мышью (https://javascript.ru/forum/misc/65992-proverka-aktivnosti-dvizheniya-myshyu.html)

spo 20.11.2016 04:45

Проверка активности движения мышью
 
Задача заключается в том, чтобы при отсутствии движения мышью над элементом, через N-ное количество времени вызывать функцию.

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

scene.addEventListener('mousemove', activity, false);

let move;

function activity(event) {
	if(event) {
		move = true;
		console.log(move);
		clearInterval(interval);
	}
}

setInterval(function() {
	interval= setTimeout(function() {
		move = false;
		console.log(move);
	}, 1000);
}, 1000);


UPD: Нашел следующее решение

let notActiveDelay = 5,
	timeNotActive = 0,
	interval1,
	interval2;

scene.addEventListener('mousemove', activity, false);

function activity() {
	console.log('timeNotActive: 0');
	timeNotActive = 0;
}

function intervals() {
	int1 = setInterval(function() {
		console.log('timeNotActive: ' + timeNotActive);
		timeNotActive++;
	}, 1000);

	int2 = setInterval(function() {
		if(timeNotActive >= notActiveDelay) {
			console.log('Простой');
			clearInterval(int1);
			clearInterval(int2);
			timeNotActive = 0;
			test();
		}
	}, 1000);
}

intervals();

function test() {
	setTimeout(function() {
		intervals();
	}, 5000);
}


Все ли в нем верно?

рони 20.11.2016 06:04

spo,
две строки всего нужно в функции,1 остановить таймер 2 запустить таймер и всё

рони 20.11.2016 06:10

spo,
scene.addEventListener('mousemove', activity, false);

var timer;

function activity(event) {
  window.clearTimeout(timer);
  timer = setTimeout(function() {
    console.log('test');
  }, 1000);
}

spo 20.11.2016 11:51

То что нужно.
Большое спасибо!

spo 28.12.2016 17:52

Задача усложнилась.
Необходимо, чтобы после остановки таймера единожды срабатывало некоторое действие.

Двигаем мышь, начинается отсчет и через N времени срабатывает событие.
Если снова двигаем мышь, то единожды срабатывает другое событие, и снова начинается отсчет.

рони 28.12.2016 18:05

spo,
уберите обнуление таймера, и событие сработает на любое передвижение, вас не понимаю или смотрите учебник там много чего
https://learn.javascript.ru/task/hoverintent
https://learn.javascript.ru/task/throttle

spo 28.12.2016 18:37

Объясню на примере.

На сцене есть персонаж.
Пока мы водим мышью ничего не происходит.
Как только мы прекратили двигать мышью пошел отсчет времени и по истечении N секунд единожды запустилось действие (анимация - персонаж сел отдохнуть).
При возобновлении движения мышью единожды запустилось другое действие (персонаж встал на ноги)

рони 28.12.2016 18:48

spo,
:)
scene.addEventListener('mousemove', activity, false);

var timer;

function activity(event) {
  if('персонаж сел отдохнуть')  console.log('персонаж встал на ноги');
  window.clearTimeout(timer);
  timer = setTimeout(function() {
    console.log('персонаж сел отдохнуть');
  }, 1000);
}

spo 29.12.2016 05:39

Тут проблема в том, что при движении мышью мы получим множество сообщений персонаж встал на ноги, а нужно только один раз.

Вроде так работает

var timer,
	flag = false;

function activity(event) {
	if (flag) {
		if('персонаж сел отдохнуть')  console.log('персонаж встал на ноги');
		flag = false;
	}
	window.clearTimeout(timer);
		timer = setTimeout(function() {
		console.log('персонаж сел отдохнуть');
		flag = true;
	}, 1000);
}

рони 29.12.2016 09:35

Цитата:

Сообщение от spo
множество сообщений персонаж встал на ноги,

значит персонаж не вставал, как лёг так и дрыхнет.


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