Нормализация скорости вращения мыши в браузерах

Для другой вопрос Я написал этот ответ , включая этот пример кода .

В этом коде я использую колесо мыши, чтобы увеличивать или уменьшать масштаб HTML5-холста. Я нашел код, который нормализует разницу в скорости между Chrome и Firefox. Однако обработка масштабирования в Safari намного, намного быстрее, чем в любом из них.

Вот код, который у меня сейчас есть:

var handleScroll = function(e){
  var delta = e.wheelDelta ? e.wheelDelta/40 : e.detail ? -e.detail/3 : 0;
  if (delta) ...
  return e.preventDefault() && false;
};
canvas.addEventListener('DOMMouseScroll',handleScroll,false); // For Firefox
canvas.addEventListener('mousewheel',handleScroll,false);     // Everyone else

Какой код я могу использовать, чтобы получить одинаковое значение «delta» для одинакового количества прокрутки колеса мыши по Chrome v10 / 11, Firefox v4, Safari v5, Opera v11 и IE9?

Этот вопрос связан, но не имеет хорошего ответа.

Редактировать : Дальнейшие исследования показывают, что одно событие прокрутки «вверх» имеет вид:

                  | evt.wheelDelta | evt.detail
------------------+----------------+------------
  Safari v5/Win7  |       120      |      0
  Safari v5/OS X  |       120      |      0
  Safari v7/OS X  |        12      |      0
 Chrome v11/Win7  |       120      |      0
 Chrome v37/Win7  |       120      |      0
 Chrome v11/OS X  |         3 (!)  |      0      (possibly wrong)
 Chrome v37/OS X  |       120      |      0
        IE9/Win7  |       120      |  undefined
  Opera v11/OS X  |        40      |     -1
  Opera v24/OS X  |       120      |      0
  Opera v11/Win7  |       120      |     -3
 Firefox v4/Win7  |    undefined   |     -3
 Firefox v4/OS X  |    undefined   |     -1
Firefox v30/OS X  |    undefined   |     -1

Кроме того, использование трекпада MacBook в OS X дает разные результаты даже при медленном движении:

  • В Safari и Chrome wheelDelta имеет значение 3 вместо 120 для колеса мыши.
  • В Firefox значение detail обычно равно 2, иногда 1, но при очень медленной прокрутке НИКАКОГО СОБЫТИЯ HANDLER СОБЫТИЯ ВСЕГО .

Таким образом, вопрос:

Каков наилучший способ дифференцировать это поведение (в идеале, без какого-либо агента пользователя или прослушивания ОС)?

139
задан Community 23 May 2017 в 12:34
поделиться