La delegación de eventos puede ser un tema confuso para aquellos que no están familiarizados con el concepto. Pero, por suerte, es muy simple. En este video tutorial de consejos rápidos, demostraré el concepto en menos de cuatro minutos..
En cambio, con la delegación de eventos, simplemente agregamos un único detector de eventos a un elemento ancestro, tal vez algo como una "ul". Luego, cuando el usuario hace clic en uno de sus elementos secundarios, como una etiqueta de anclaje, solo verificamos si el objetivo del clic era, de hecho, una etiqueta de anclaje. Si así fuera, procedemos según lo habitual..
$ ('ul'). click (función (e) if ($ (e.target) .is ('a')) alert ('clicked'););
Funciona debido a la forma en que se capturan los elementos (no IE) y se hacen burbujas. Por ejemplo, considere la siguiente estructura simple.
Al hacer clic en la etiqueta de anclaje, también se hace clic en el elemento 'li' y 'ul' e incluso en el elemento 'body'. Esto se conoce como burbujeo.
Tenga en cuenta que este es solo un ejemplo simple para explicar la funcionalidad. Utilizamos jQuery, solo porque tenía cuatro minutos para grabar. En ese ejemplo en particular (mire primero el screencast), podríamos haber usado dos opciones alternativas:
Sobre todo, esto estaba destinado a demostrar la idea. Con JavaScript regular, podrías hacer algo como:
// Obtenga un poco de lista desordenada, que contiene etiquetas de anclaje var ul = document.getElementById ('elementos'); // Controlador de eventos de navegador cruzado rápido y simple: para compensar la función del controlador addEvent de IE addEvent (obj, evt, fn, capture) if (window.attachEvent) obj.attachEvent ("on" + evt, fn); else if (! capture) capture = false; // capture obj.addEventListener (evt, fn, capture) // Compruebe si el nodo en el que se hizo clic es una etiqueta de ancla. Si es así, proceda según lo habitual. addEvent (ul, "click", function (e) // Firefox e IE acceden al elemento de destino diferente. e.target y event.srcElement, respectivamente. var target = e? e.target: window.event.srcElement; if (target.nodeName.toLowerCase () === 'a') alert ("clicked"); devolver falso;);