Me gustaría agregar algunos comentarios y argumentos en contra a la respuesta de jfriend00. (principalmente solo mis opiniones basadas en mi instinto)
No, NO debe vincular todos los controladores de eventos delegados al objeto del documento. Ese es probablemente el peor escenario que podría crear.
En primer lugar, la delegación de eventos no siempre acelera su código. En algunos casos, es ventajoso y en otros casos no. Debe usar la delegación de eventos cuando realmente necesite delegación de eventos y cuando se beneficie de ella. De lo contrario, debe vincular los controladores de eventos directamente a los objetos donde ocurre el evento, ya que esto generalmente será más eficiente.
Si bien es cierto que el rendimiento podría ser un poco mejor si solo va a registrarse y participar en un solo elemento, creo que no se compara con los beneficios de escalabilidad que brinda la delegación. También creo que los navegadores (van a estar) manejando esto de manera cada vez más eficiente, aunque no tengo pruebas de ello. ¡En mi opinión, la delegación de eventos es el camino a seguir!
En segundo lugar, NO debe vincular todos los eventos delegados a nivel de documento. Esta es exactamente la razón por la cual .live () fue desaprobado porque esto es muy ineficiente cuando tienes muchos eventos vinculados de esta manera. Para el manejo de eventos delegados, es MUCHO más eficiente vincularlos al elemento primario más cercano que no sea dinámico.
Estoy de acuerdo con esto. Si está 100% seguro de que un evento solo sucederá dentro de un contenedor, tiene sentido vincular el evento a este contenedor, pero aún argumentaría en contra de vincular eventos al elemento desencadenante directamente.
Tercero, no todos los eventos funcionan o todos los problemas pueden resolverse con delegación. Por ejemplo, si desea interceptar eventos clave en un control de entrada y bloquear el ingreso de claves no válidas en el control de entrada, no puede hacerlo con el manejo de eventos delegados porque para cuando el evento llegue al controlador delegado, ya ha procesado por el control de entrada y es demasiado tarde para influir en ese comportamiento.
Esto simplemente no es cierto. Consulte este código Pen: https://codepen.io/pwkip/pen/jObGmjq
document.addEventListener('keypress', (e) => {
e.preventDefault();
});
Ilustra cómo puede evitar que un usuario escriba escribiendo el evento de pulsación de tecla en el documento.
Aquí hay momentos en que la delegación de eventos es obligatoria o ventajosa:
Cuando los objetos en los que está capturando eventos se crean / eliminan dinámicamente y aún desea capturar eventos en ellos sin tener que volver a vincular explícitamente los controladores de eventos cada vez que crea uno nuevo. Cuando tiene muchos objetos que todos quieren exactamente el mismo controlador de eventos (donde lotes es al menos cientos). En este caso, puede ser más eficiente en el momento de la configuración enlazar un controlador de eventos delegado en lugar de cientos o más controladores de eventos directos. Tenga en cuenta que el manejo de eventos delegados siempre es menos eficiente en tiempo de ejecución que los controladores de eventos directos.
Me gustaría responder con esta cita de 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.
Además, buscar en Google performance cost of event delegation google
devuelve más resultados a favor de la delegación de eventos.
Cuando intentas capturar (en un nivel superior de tu documento) los eventos que ocurren en cualquier elemento del documento. Cuando su diseño utiliza explícitamente el burbujeo de eventos y stopPropagation () para resolver algún problema o característica en su página. Para entender esto un poco más, uno necesita entender cómo funcionan los controladores de eventos delegados de jQuery. Cuando llamas a algo como esto:
$ ("# myParent"). on ('click', 'button.actionButton', myFn); Instala un controlador de eventos genérico jQuery en el objeto #myParent. Cuando un evento de clic aparece en este controlador de eventos delegado, jQuery tiene que revisar la lista de controladores de eventos delegados adjuntos a este objeto y ver si el elemento de origen del evento coincide con alguno de los selectores en los controladores de eventos delegados.
Debido a que los selectores pueden estar bastante involucrados, esto significa que jQuery tiene que analizar cada selector y luego compararlo con las características del objetivo del evento original para ver si coincide con cada selector. Esta no es una operación barata. No es gran cosa si solo hay uno de ellos, pero si pones todos tus selectores en el objeto del documento y hay cientos de selectores para comparar con cada evento burbujeado, esto puede comenzar a obstaculizar el rendimiento del manejo de eventos.
Por esta razón, desea configurar sus controladores de eventos delegados para que un controlador de eventos delegado esté tan cerca del objeto de destino como sea práctico. Esto significa que menos eventos aparecerán en cada controlador de eventos delegado, mejorando así el rendimiento. Poner todos los eventos delegados en el objeto del documento es el peor rendimiento posible porque todos los eventos burbujeados tienen que pasar por todos los controladores de eventos delegados y ser evaluados contra todos los posibles selectores de eventos delegados. Esto es exactamente por qué .live () está en desuso porque esto es lo que hizo .live () y resultó ser muy ineficiente.
¿Dónde se documenta esto? Si eso es cierto, entonces jQuery parece estar manejando la delegación de una manera muy ineficiente, y luego mis contraargumentos solo deberían aplicarse a Vanilla JS.
Aún así: me gustaría encontrar una fuente oficial que respalde esta afirmación.
:: EDITAR ::
Parece que jQuery está haciendo burbujas de eventos de una manera muy ineficiente (porque son compatibles con IE8)
https://api.jquery.com/on/#event-performance
Entonces, la mayoría de mis argumentos aquí solo son válidos para Vanilla JS y los navegadores modernos.