e_asphyx
@e_asphyx

Как отличить событие wheel от тачпада и мыши?

Задача следующая: сделать что-то типа переключения слайдов по вращению колеса мыши. Колесо мыши вращается дискретно, и разумно делать переключение по каждому событию wheel, которые соответствуют шагам энкодера колеса. Тачпад же работает непрерывно и генерирует длинную серию событий wheel, так что имеет смысл накапливать перемещение и переключать по превышению заданного смещения. Можно ли как-то различить?
  • Вопрос задан
  • 1189 просмотров
Пригласить эксперта
Ответы на вопрос 2
многие мыши не имеют шага у колесика
у некоторых есть переключатель между ступенчатым вращением колесика и гладким

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

надо реализовывать удобство, а не сложность скриптов
Ответ написан
e_asphyx
@e_asphyx Автор вопроса
Короче, я посмотрел существующие решения, не удовлетворился ими и сделал проще и надёжнее: медианный фильтр плюс таймаут:
this.wheelTimeStamp = 0;
		this.prevDelta = 0;
		this.filterBuf = [];

		this.wheel = function(e) {
			e.preventDefault();
			if(Math.abs(e.originalEvent.deltaY) <= Math.abs(e.originalEvent.deltaX)) return;
			var delta = e.originalEvent.deltaY;
			if(this.filterBuf.length == 15) {
				this.filterBuf.shift();
			}
			this.filterBuf.push(Math.abs(delta) - Math.abs(this.prevDelta));
			var tmpBuf = this.filterBuf.slice();
			tmpBuf.sort();
			var dd = tmpBuf[Math.floor(this.filterBuf.length / 2)];
			this.prevDelta = delta;
			if(dd > 0) {
				if(e.timeStamp - this.wheelTimeStamp > Phy.WheelTimeDelta) {
					this.filterBuf = [];
					this.wheelTimeStamp = e.timeStamp;
					this.scroll(delta < 0 ? "up" : "down");
				}
			}
		};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы