Una lista puede contener muchos controles repetidos y se pueden agregar nuevas filas después de que se carga la página. En lugar de adjuntar un oyente a cada botón, escuche su padre compartido e identifique el control activado.

list.addEventListener("click", (event) => {
  if (!(event.target instanceof Element)) return;
  const button = event.target.closest("button[data-action]");
  if (!button || !list.contains(button)) return;
  handleAction(button.dataset.action, button.dataset.id);
});

Mantenga la verificación del objetivo específica

  • Use el más cercano para que los clics en un ícono dentro de un botón aún lleguen a ese botón.
  • Confirme que la coincidencia pertenece a la lista prevista antes de actuar.
  • Mantenga los datos de la acción en el control propietario de la acción.

No delegues todo

Un oyente directo es más sencillo para un conjunto de controles pequeño y estable o cuando cada elemento necesita una configuración distinta. La delegación es más útil cuando los elementos se repiten o se crean dinámicamente.

Pruebe los clics en contenido anidado, activación del teclado y controles fuera de la lista. El controlador de eventos debe responder una vez a la acción prevista e ignorar los clics no relacionados.