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.