Chosen: Wheel Scrolling ist in FireFox in Verbindung mit dem jquery-mousewheel Plugin zu langsam

Erstellt am 1. Juni 2017  ·  5Kommentare  ·  Quelle: harvesthq/chosen

Wird bei Verwendung in Verbindung mit dem jquery-mousewheel Plugin reproduziert.

Siehe https://jsfiddle.net/4Lba076o/

In Chrome ist das Scrollen OK.
In Firefox ist es sehr langsam (1px).

Grundsätzlich verwendet das Mausradverhalten nicht event.deltaFactor (was jedoch nicht standardmäßig ist).
In Firefox transformiert jquery-mousewheel event von {deltaY: -42} zu {deltaY: -1, deltaFactor: 42}

Hilfreichster Kommentar

Ich hatte das gleiche Problem, aber es hat nichts mit dem Mausrad zu tun, denke ich.

Ich habe festgestellt, dass Firefox einen deltaMode von 1 verwendet, was ein Scrollen pro Zeile ist. Ein Delta von 3 bedeutet also 3 Zeilen statt Pixel.

Ich habe dies in die selected.jquery.js gehackt und es hat das Scrollen viel schneller gemacht:

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());
      }
    };

Alle 5 Kommentare

Ich hatte das gleiche Problem, aber es hat nichts mit dem Mausrad zu tun, denke ich.

Ich habe festgestellt, dass Firefox einen deltaMode von 1 verwendet, was ein Scrollen pro Zeile ist. Ein Delta von 3 bedeutet also 3 Zeilen statt Pixel.

Ich habe dies in die selected.jquery.js gehackt und es hat das Scrollen viel schneller gemacht:

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());
      }
    };

Der von Storman vorgeschlagene Patch funktioniert perfekt für uns. Ist eine Veröffentlichung in einer zukünftigen Version geplant?

@storeman kannst du mit deinem Patch einen Pull-Request öffnen?

Ich kenne kein Coffeescript oder wie man es mit Grunt kompiliert/testet. Ich habe eine Lösung vorgenommen, von der ich denke, dass sie funktionieren sollte, aber ich kann sie nicht testen, daher möchte ich keine Pull-Anforderung erstellen. Mein Fix in Coffeescript ist hier zu finden:
https://github.com/tioga-tours/chosen/tree/faster-firefox-scroll

@lagermann
Tatsächlich hat es eine direkte Verbindung zu jquery mousewheel, denn wenn Sie beide Plugins haben, transformiert jquery mousewheel Mausereignisse wie ich erwähnt habe. Ohne jquery ist das Scrollverhalten des Mausrads in FF in Ordnung.

Also, wie ich das behoben habe, ohne den Quellcode beider Plugins zu ändern - ich mache einfach $(..).unmousewheel() an Stellen für jeden, den ich registriere .chosen(); Dafür könnte man ein einfaches Plugin schreiben :)

Wenn Sie das so beheben, wie Sie es hier getan haben
factor = evt.originalEvent.deltaMode === 1 /** DOM_DELTA_LINE */ ? 16 : 1;
dann würde ich es ändern
factor = evt.originalEvent.deltaFactor || 1;

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen