Chosen: Прокрутка колеса замедляется в FireFox в сочетании с плагином jquery-mousewheel.

Созданный на 1 июн. 2017  ·  5Комментарии  ·  Источник: harvesthq/chosen

Воспроизводится при использовании совместно с плагином jquery-mousewheel.

См. https://jsfiddle.net/4Lba076o/

В Chrome прокрутка в порядке.
В Firefox это очень медленно (1px).

По сути, поведение колесика мыши не использует event.deltaFactor (что, однако, нестандартно).
В Firefox jquery-mousewheel преобразует событие из {deltaY: -42} в {deltaY: -1, deltaFactor: 42}

Самый полезный комментарий

У меня была такая же проблема, но я думаю, что это не имеет ничего общего с колесиком мыши.

Я обнаружил, что Firefox использует deltaMode, равный 1, что означает прокрутку каждой строки. Таким образом, дельта, равная 3, означает 3 строки вместо пикселей.

Я взломал это в selected.jquery.js, и прокрутка стала намного быстрее:

Chosen.prototype.search_results_mousewheel = function(evt) {
     /** Added the factor var and set it's value to 16 when scrolling is line scrolling */
      var delta, factor;
      if (evt.originalEvent) {
        factor = evt.originalEvent.deltaMode === 1 /** DOM_DELTA_LINE */ ? 16 : 1;
        delta = factor * evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail;
      }

      if (delta != null) {
        evt.preventDefault();
        if (evt.type === 'DOMMouseScroll') {
          delta = delta * 40;
        }
        return this.search_results.scrollTop(delta + this.search_results.scrollTop());
      }
    };

Все 5 Комментарий

У меня была такая же проблема, но я думаю, что это не имеет ничего общего с колесиком мыши.

Я обнаружил, что Firefox использует deltaMode, равный 1, что означает прокрутку каждой строки. Таким образом, дельта, равная 3, означает 3 строки вместо пикселей.

Я взломал это в selected.jquery.js, и прокрутка стала намного быстрее:

Chosen.prototype.search_results_mousewheel = function(evt) {
     /** Added the factor var and set it's value to 16 when scrolling is line scrolling */
      var delta, factor;
      if (evt.originalEvent) {
        factor = evt.originalEvent.deltaMode === 1 /** DOM_DELTA_LINE */ ? 16 : 1;
        delta = factor * evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail;
      }

      if (delta != null) {
        evt.preventDefault();
        if (evt.type === 'DOMMouseScroll') {
          delta = delta * 40;
        }
        return this.search_results.scrollTop(delta + this.search_results.scrollTop());
      }
    };

Патч, предложенный storman, у нас отлично работает. Планируется ли публикация в будущем релизе?

@storeman , вы можете открыть запрос на включение с вашим патчем?

Я не знаю coffeescript или как его скомпилировать/протестировать с помощью grunt. Я сделал исправление, которое, по моему мнению, должно работать, но я не могу проверить его, поэтому я не хочу создавать запрос на вытягивание. Мое исправление в coffeescript можно найти здесь:
https://github.com/tioga-tours/chosen/tree/faster-firefox-scroll

@storeman
На самом деле он имеет прямую связь с jquery mousewheel, потому что, если у вас есть оба плагина, jquery mousewheel преобразует события мыши, как я уже упоминал. Без jquery поведение прокрутки колесика мыши прекрасно работает в FF.

Итак, как я это исправил без изменения исходного кода обоих плагинов - я просто делаю $(..).unmousewheel() в местах для каждого регистра .chosen(); Для этого можно написать простой плагин :)

Если исправить это так, как вы сделали здесь
factor = evt.originalEvent.deltaMode === 1 /** DOM_DELTA_LINE */ ? 16 : 1;
то я бы изменил его на
factor = evt.originalEvent.deltaFactor || 1;

Была ли эта страница полезной?
0 / 5 - 0 рейтинги