La delega degli eventi può essere un argomento confuso per coloro che non hanno familiarità con il concetto. Ma, per fortuna, è davvero semplice. In questo video tutorial di punta veloce, dimostrerò il concetto in poco meno di quattro minuti.
Invece, con la delega degli eventi, aggiungiamo semplicemente un singolo listener di eventi a un elemento antenato, forse qualcosa come un "ul". Quindi, quando l'utente fa clic su uno dei suoi elementi figli, come un tag di ancoraggio, controlliamo solo se l'obiettivo del clic era, in realtà, un tag di ancoraggio. Se lo era, procediamo normalmente.
$ ('ul'). click (function (e) if ($ (e.target) .is ('a')) alert ('cliccato'););
Funziona a causa del modo in cui gli elementi vengono catturati (non IE) e si gonfiano. Ad esempio, considera la seguente struttura semplice.
Quando fai clic sul tag di ancoraggio, fai clic su "li" e su "ul" e persino sull'elemento "body". Questo si chiama bubbling up.
Si prega di tenere presente che questo è solo un semplice esempio per spiegare la funzionalità. Abbiamo usato jQuery, solo perché avevo quattro minuti per registrare! In questo particolare esempio (guarda prima lo screencast), avremmo potuto utilizzare due opzioni alternative:
Per lo più, questo era destinato a dimostrare l'idea. Con JavaScript normale, puoi fare qualcosa come:
// Ottieni un elenco non ordinato contenente tag di ancoraggio var ul = document.getElementById ('items'); // Gestore di eventi cross-browser semplice e veloce - per compensare la funzione addEvent di addEvent di 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) // Controlla se il nodo su cui è stato fatto clic è un tag di ancoraggio. Se è così, procedi come al solito. addEvent (ul, "click", function (e) // Firefox e IE accedono rispettivamente all'elemento target .e.target e event.srcElement var target = e? e.target: window.event.srcElement; if (target.nodeName.toLowerCase () === 'a') alert ("cliccato"); return false;);