javascript - Ia în considerare marcarea gestionatorului de evenimente ca 'passiv' pentru a face pagina mai receptivă


Folosesc ciocanul pentru tragere și devine sacadat când încarc alte lucruri, așa cum acest mesaj de avertizare îmi spune.

Gestionarea evenimentului de intrare 'touchstart' a fost întârziată cu X ms deoarece firul principal era ocupat. Luați în considerare marcarea handler-ului evenimentului ca 'passive' pentru a face pagina mai receptivă.

Așa că am încercat să adaug 'passive' la ascultător astfel

Hammer(element[0]).on("touchstart", function(ev) {
  // stuff
}, {
  passive: true
});

dar încă primesc acest avertisment.

Răspuns #1

Pentru cei care primesc acest avertisment pentru prima dată, acesta se datorează unei funcții de ultimă generație numită Ascultători de Evenimente Pasivi care a fost implementată în browsere în vara anului 2016. De la https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md:

Ascultători de evenimente pasivi sunt o caracteristică nouă în specificația DOM care permite dezvoltatorilor să opteze pentru o performanță mai bună la derulare prin eliminarea necesității ca derularea să fie blocată de ascultătorii de evenimente de tip touch și wheel. Dezvoltatorii pot adnota ascultătorii touch și wheel cu {passive: true} pentru a indica faptul că nu vor apela niciodată preventDefault. Această caracteristică a fost lansată în Chrome 51, Firefox 49 și a ajuns în WebKit. Pentru o explicație oficială completă citiți mai multe aici.

Vezi și: Ce sunt ascultătorii de evenimente pasivi?

Este posibil să trebuiască să așteptați ca biblioteca dvs. .js să implementeze suportul.

Dacă gestionați evenimentele indirect printr-o bibliotecă JavaScript, este posibil să depindeți de suportul acelei biblioteci pentru funcționalitate. Începând cu decembrie 2019, nu pare ca vreo bibliotecă majoră să fi implementat suportul. Câteva exemple:

  • jQuery.js - problem în desfășurare: https://github.com/jquery/jquery/issues/2871
  • React.js - problemă în desfășurare: https://github.com/facebook/react/issues/6436
    Discuție React 17: https://github.com/facebook/react/issues/19651
  • Hammer.js - închis din lipsă de urmărire: https://github.com/hammerjs/hammer.js/pull/987
  • perfect-scrollbar - închis: https://github.com/noraesae/perfect-scrollbar/issues/560
  • AngularJS - închis din cauza „nu se va rezolva”: https://github.com/angular/angular.js/issues/15901

Răspunsul #2

Următoarea bibliotecă a rezolvat problema.
Pur și simplu adăugați acest cod în proiectul vostru.

<script type="text/javascript" src="https://unpkg.com/default-passive-events"></script>

Dacă ai nevoie de mai multe informații, vizitează această bibliotecă.

Răspunsul #3

Acest lucru ascunde mesajul de avertizare:

jQuery.event.special.touchstart = {
  setup: function( _, ns, handle ) {
      this.addEventListener("touchstart", handle, { passive: !ns.includes("noPreventDefault") });
  }
};

Răspunsul #4

Pentru cei blocați cu probleme moștenite, găsiți linia care generează eroarea și adăugați {passive: true} - de exemplu:

this.element.addEventListener(t, e, !1)

devine

this.element.addEventListener(t, e, { passive: true} )