Terminologia
Da quirksmode.org :
Cattura di eventi
Quando si utilizza l'acquisizione di eventi
| |
--------------- | | -----------------
| element1 | | |
| ----------- | | ----------- |
| | element2 \ / | |
| ------------------------- |
| Evento CATTURAZIONE |
-----------------------------------
il gestore eventi di element1 viene attivato per primo, il gestore eventi di element2 viene attivato per ultimo.
Bolle di eventi
Quando si utilizza il gorgoglio degli eventi
/ \
--------------- | | -----------------
| element1 | | |
| ----------- | | ----------- |
| | element2 | | | |
| ------------------------- |
| Evento BUBBLING |
-----------------------------------
il gestore di eventi di element2 viene attivato per primo, il gestore di eventi di element1 viene attivato per ultimo.
Qualsiasi evento che si svolge nel modello di eventi W3C viene prima catturato fino a quando non raggiunge l'elemento di destinazione e quindi bolle di nuovo .
| | / \
----------------- | | - | | -----------------
| element1 | | | | |
| ------------- | | - | | ----------- |
| | element2 \ / | | | |
| -------------------------------- |
| Modello di eventi W3C |
------------------------------------------
Interfaccia
Da w3.org , per l' acquisizione di eventi :
Se l'acquisizione EventListener
desidera impedire l'ulteriore elaborazione dell'evento, può chiamare il stopPropagation
metodo
Event
dell'interfaccia. Ciò impedirà un ulteriore invio dell'evento, anche se ulteriori EventListeners
registrazioni allo stesso livello gerarchico riceveranno comunque l'evento. Una volta stopPropagation
chiamato il metodo di un evento , ulteriori chiamate a quel metodo non hanno alcun effetto aggiuntivo. Se non esistono altri catturatori e
stopPropagation
non è stato chiamato, l'evento attiva l'appropriato EventListeners
sul bersaglio stesso.
Per il gorgoglio degli eventi :
Qualsiasi gestore di eventi può scegliere di impedire un'ulteriore propagazione degli eventi chiamando il stopPropagation
metodo Event
dell'interfaccia. Se qualcuno
EventListener
chiama questo metodo, verranno attivati tutti gli ulteriori EventListeners
sulla corrente EventTarget
ma il gorgoglio cesserà a quel livello. È necessaria una sola chiamata stopPropagation
per evitare ulteriori bolle.
Per la cancellazione di eventi :
Annullamento si ottiene chiamando il Event
's preventDefault
metodo. Se una o più EventListeners
chiamate preventDefault
durante qualsiasi fase del flusso di eventi, l'azione predefinita verrà annullata.
Esempi
Negli esempi seguenti, un clic sul collegamento ipertestuale nel browser Web attiva il flusso dell'evento (vengono eseguiti i listener di eventi) e l'azione predefinita della destinazione dell'evento (viene aperta una nuova scheda).
HTML:
<div id="a">
<a id="b" href="http://www.google.com/" target="_blank">Google</a>
</div>
<p id="c"></p>
JavaScript:
var el = document.getElementById("c");
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
}
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
}
function bubblingOnClick1(ev) {
el.innerHTML += "DIV event bubbling<br>";
}
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
}
// The 3rd parameter useCapture makes the event listener capturing (false by default)
document.getElementById("a").addEventListener("click", capturingOnClick1, true);
document.getElementById("b").addEventListener("click", capturingOnClick2, true);
document.getElementById("a").addEventListener("click", bubblingOnClick1, false);
document.getElementById("b").addEventListener("click", bubblingOnClick2, false);
Esempio 1 : risulta nell'output
DIV event capture
A event capture
A event bubbling
DIV event bubbling
Esempio 2 : aggiunta stopPropagation()
alla funzione
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.stopPropagation();
}
risulta nell'output
DIV event capture
Il listener di eventi ha impedito un'ulteriore propagazione verso il basso e verso l'alto dell'evento. Tuttavia, non ha impedito l'azione predefinita (apertura di una nuova scheda).
Esempio 3 : aggiunta stopPropagation()
alla funzione
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
ev.stopPropagation();
}
o la funzione
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
ev.stopPropagation();
}
risulta nell'output
DIV event capture
A event capture
A event bubbling
Questo perché entrambi i listener di eventi sono registrati sullo stesso target dell'evento. I listener di eventi hanno impedito un'ulteriore propagazione verso l'alto dell'evento. Tuttavia, non hanno impedito l'azione predefinita (apertura di una nuova scheda).
Esempio 4 : aggiunta preventDefault()
a qualsiasi funzione, ad esempio
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.preventDefault();
}
impedisce l'apertura di una nuova scheda.
event.stop
funzione ... Strano anche che non ho mai avuto problemi con quello. Uso molto il gorgoglio. Grazie per l'esempio!