Considera di contrassegnare il gestore eventi come "passivo" per rendere la pagina più reattiva


217

Sto usando Hammer per trascinare e sta diventando instabile quando si carica altra roba, come mi dice questo messaggio di avviso.

La gestione dell'evento di input "touchstart" è stata ritardata di X ms a causa del thread principale occupato. Considera di contrassegnare il gestore eventi come "passivo" per rendere la pagina più reattiva.

Quindi ho provato ad aggiungere "passivo" all'ascoltatore in questo modo

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

ma sto ancora ricevendo questo avviso.

Risposte:


266

Per coloro che ricevono questo avviso per la prima volta, è dovuto a una funzionalità all'avanguardia chiamata Ascoltatori di eventi passivi che è stata implementata nei browser abbastanza di recente (estate 2016). Da https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md :

I listener di eventi passivi sono una nuova funzionalità nelle specifiche DOM che consente agli sviluppatori di optare per prestazioni di scorrimento migliori eliminando la necessità di scorrere per bloccare i listener di eventi touch e wheel. Gli sviluppatori possono annotare gli ascoltatori touch e wheel con {passive: true} per indicare che non invocheranno mai preventDefault. Questa funzione è stata fornita in Chrome 51, Firefox 49 ed è arrivata in WebKit. Per una spiegazione ufficiale completa leggi di più qui.

Vedi anche: Cosa sono i listener di eventi passivi?

Potrebbe essere necessario attendere che la libreria .js implementi il ​​supporto.

Se gestisci gli eventi indirettamente tramite una libreria JavaScript, potresti essere in balia del supporto di quella particolare libreria per la funzione. A dicembre 2019, non sembra che nessuna delle principali biblioteche abbia implementato il supporto. Qualche esempio:


16
che dire delle biblioteche ioniche?
circa il

10
Sto chiamando preventDefault(): è possibile sopprimere questo avviso?
Maja,


12
Anche l'API JavaScript di Google Maps versione 3 genera questi avvisi. Il problema è stato monitorato su issuetracker.google.com/issues/63211698 . (Un
po

6
per sopprimere questo avviso puoi `addEventListener ('touchstart', this.callPassedFuntion, {passive: false})`
Shlomi Schwartz,

9

Questo nasconde il messaggio di avviso:

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

6
L'obiettivo non sarebbe quello di fermare l'evento reale? Non vorrei nascondere il messaggio finché non avrò risolto il problema.
yardpenalty.com

1
Penso che sia un problema di libreria jquery. Penso che gli sviluppatori dovranno risolverlo. Ma se lo otterrai, fammi sapere come farlo per favore. Grazie mille.
Iván Rodríguez,

Di sicuro Ivan! Sì. Ehi, ora sono curioso ... Sto usando il plugin d3 e sto ricevendo come 2300 violazioni. Forse il tuo codice ti aiuterà! Vi terremo aggiornati!
yardpenalty.com

@ yardpenalty.com, no, fermare l'evento non è l'obiettivo! L'avviso indica che hai inserito il tuo listener senza specificare se potrebbe o meno impedire il comportamento predefinito sull'evento. Se si hanno casi in cui si desidera chiamare preventDefault(), è necessario specificare passive: false. In caso contrario, specificare passive: true. Ricevi l'avviso solo se non specifichi neanche uno. Se si specifica passive: truee preventDefault()viene chiamato, si verifica un errore e l'impostazione predefinita non viene impedita. Specificare passivenon è un trucco qui. È la soluzione . È ciò che chiede l'avvertimento!
Tao,

@tao grazie per il commento. Sono passati alcuni anni ma ricorderò sicuramente la soluzione in futuro!
yardpenalty.com il

1

Incontralo anche nel plugin a discesa select2 in Laravel. Modifica del valore come suggerito da Alfred Wallace da

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

per

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

risolve il problema. Perché abbia un voto negativo, non lo so, ma funziona per me.


0

Per quelli bloccati con problemi legacy, trova la riga che lancia l'errore e aggiungi {passive: true}- ad esempio:

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

diventa

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

0

Per jquery-ui-dragable con jquery-ui-touch-punch l'ho risolto in modo simile a Iván Rodríguez, ma con un altro evento override per touchmove:

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

-1

Ho trovato una soluzione che funziona su jQuery 3.4.1 slim

Dopo la disattivazione, aggiungi {passive: true}alla funzione addEventListener sulla riga 1567 in questo modo:

t.addEventListener(p, a, {passive: true}))

Nulla si rompe e gli audit del faro non si lamentano degli ascoltatori.


2
non modificare mai il codice sorgente di una libreria; dovresti sostituirlo invece.
Raptor il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.