Vorrei aggiungere alcune osservazioni e controargomenti alla risposta di jfriend00. (principalmente solo le mie opinioni basate sul mio intestino)
No: NON si devono associare tutti i gestori di eventi delegati all'oggetto documento. Questo è probabilmente lo scenario peggiore che potresti creare.
Innanzitutto, la delega degli eventi non rende sempre più veloce il codice. In alcuni casi, è vantaggioso e in alcuni casi no. È necessario utilizzare la delega degli eventi quando in realtà è necessaria la delega degli eventi e quando ne si beneficia. Altrimenti, è necessario associare i gestori di eventi direttamente agli oggetti in cui si verifica l'evento, in quanto ciò sarà generalmente più efficiente.
Sebbene sia vero che le prestazioni potrebbero essere leggermente migliori se si desidera registrarsi ed eventi solo per un singolo elemento, ritengo che non sia all'altezza dei vantaggi di scalabilità offerti dalla delega. Credo anche che i browser (lo saranno) gestiranno questo in modo sempre più efficiente, anche se non ne ho la prova. Secondo me, la delega degli eventi è la strada da percorrere!
In secondo luogo, NON è necessario associare tutti gli eventi delegati a livello di documento. Questo è esattamente il motivo per cui .live () è stato deprecato perché è molto inefficiente quando ci sono molti eventi associati in questo modo. Per la gestione degli eventi delegati è MOLTO più efficiente associarli al genitore più vicino che non sia dinamico.
Sono un po 'd'accordo su questo. Se sei sicuro al 100% che un evento accadrà solo all'interno di un contenitore, ha senso associare l'evento a questo contenitore, ma continuerei a contestare direttamente gli eventi vincolanti con l'elemento scatenante.
Terzo, non tutti gli eventi funzionano o tutti i problemi possono essere risolti con la delega. Ad esempio, se si desidera intercettare gli eventi chiave su un controllo di input e bloccare l'immissione di chiavi non valide nel controllo di input, non è possibile farlo con la gestione degli eventi delegati perché al momento in cui l'evento passa al gestore delegato, ha già è stato elaborato dal controllo di input ed è troppo tardi per influenzare quel comportamento.
Questo semplicemente non è vero. Si prega di vedere questo codicePen: https://codepen.io/pwkip/pen/jObGmjq
document.addEventListener('keypress', (e) => {
e.preventDefault();
});
Illustra come impedire a un utente di digitare registrando l'evento keypress sul documento.
Ecco i momenti in cui è richiesta o vantaggiosa la delega degli eventi:
Quando gli oggetti su cui si stanno acquisendo gli eventi vengono creati / rimossi in modo dinamico e si desidera ancora catturare gli eventi su di essi senza dover ricollegare esplicitamente i gestori di eventi ogni volta che si crea uno nuovo. Quando hai molti oggetti che vogliono tutti esattamente lo stesso gestore di eventi (dove i lotti sono almeno centinaia). In questo caso, potrebbe essere più efficiente al momento dell'installazione associare un gestore eventi delegato anziché centinaia o più gestori eventi diretti. Si noti che la gestione degli eventi delegati è sempre meno efficiente in fase di esecuzione rispetto ai gestori di eventi diretti.
Vorrei rispondere con questa citazione da https://ehsangazar.com/optimizing-javascript-event-listeners-for-performance-e28406ad406c
Event delegation promotes binding as few DOM event handlers as possible, since each event handler requires memory. For example, let’s say that we have an HTML unordered list we want to bind event handlers to. Instead of binding a click event handler for each list item (which may be hundreds for all we know), we bind one click handler to the parent unordered list itself.
Inoltre, cercare su Google performance cost of event delegation google
più risultati a favore della delega degli eventi.
Quando si tenta di acquisire (a un livello superiore nel documento) eventi che si verificano su qualsiasi elemento del documento. Quando il tuo progetto utilizza esplicitamente il bubbling di eventi e stopPropagation () per risolvere alcuni problemi o funzionalità nella tua pagina. Per capirlo un po 'di più, è necessario capire come funzionano i gestori di eventi delegati jQuery. Quando chiami qualcosa del genere:
$ ("# myParent"). on ('click', 'button.actionButton', myFn); Installa un gestore di eventi jQuery generico sull'oggetto #myParent. Quando un evento click arriva a questo gestore di eventi delegato, jQuery deve scorrere l'elenco dei gestori di eventi delegati collegati a questo oggetto e vedere se l'elemento di origine per l'evento corrisponde a uno dei selettori nei gestori di eventi delegati.
Poiché i selettori possono essere coinvolti in modo equo, ciò significa che jQuery deve analizzare ciascun selettore e quindi confrontarlo con le caratteristiche del target dell'evento originale per vedere se corrisponde a ciascun selettore. Questa non è un'operazione economica. Non è un grosso problema se ne esiste solo uno, ma se si posizionano tutti i selettori sull'oggetto documento e ci sono centinaia di selettori da confrontare con ogni singolo evento gorgogliante, questo può iniziare seriamente a ostacolare le prestazioni di gestione degli eventi.
Per questo motivo, si desidera impostare i gestori di eventi delegati in modo che un gestore di eventi delegato sia il più vicino possibile all'oggetto di destinazione. Ciò significa che un numero inferiore di eventi attraverserà ogni gestore di eventi delegato, migliorando così le prestazioni. Inserire tutti gli eventi delegati sull'oggetto documento è la peggiore prestazione possibile perché tutti gli eventi gorgogliati devono passare attraverso tutti i gestori di eventi delegati e essere valutati rispetto a tutti i possibili selettori di eventi delegati. Questo è esattamente il motivo per cui .live () è deprecato perché è ciò che ha fatto .live () e si è rivelato molto inefficiente.
Dove è documentato? Se questo è vero, allora jQuery sembra gestire la delega in un modo molto inefficiente, e quindi i miei contro-argomenti dovrebbero essere applicati solo a JS vanilla.
Tuttavia: vorrei trovare una fonte ufficiale a sostegno di questa affermazione.
:: MODIFICARE ::
Sembra che jQuery stia effettivamente facendo gorgogliare eventi in modo molto inefficiente (perché supportano IE8)
https://api.jquery.com/on/#event-performance
Quindi la maggior parte dei miei argomenti qui vale solo per JS vaniglia e browser moderni.