Ein kleines Beispiel soll zeigen, wie diese beiden Ausbreitungsstopps funktionieren.
var state = {
stopPropagation: false,
stopImmediatePropagation: false
};
function handlePropagation(event) {
if (state.stopPropagation) {
event.stopPropagation();
}
if (state.stopImmediatePropagation) {
event.stopImmediatePropagation();
}
}
$("#child").click(function(e) {
handlePropagation(e);
console.log("First event handler on #child");
});
$("#child").click(function(e) {
handlePropagation(e);
console.log("Second event handler on #child");
});
// First this event will fire on the child element, then propogate up and
// fire for the parent element.
$("div").click(function(e) {
handlePropagation(e);
console.log("Event handler on div: #" + this.id);
});
// Enable/disable propogation
$("button").click(function() {
var objectId = this.id;
$(this).toggleClass('active');
state[objectId] = $(this).hasClass('active');
console.log('---------------------');
});
div {
padding: 1em;
}
#parent {
background-color: #CCC;
}
#child {
background-color: #000;
padding: 5em;
}
button {
padding: 1em;
font-size: 1em;
}
.active {
background-color: green;
color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="parent">
<div id="child"> </div>
</div>
<button id="stopPropagation">Stop Propogation</button>
<button id="stopImmediatePropagation" ">Stop Immediate Propogation</button>
Es sind drei Ereignishandler gebunden. Wenn wir keine Weitergabe stoppen, dann sollte es vier Warnungen geben - drei auf dem untergeordneten Div und eine auf dem übergeordneten Div.
Wenn wir das Ereignis von der Ausbreitung zu stoppen, dann wird es 3 Warnungen (alle auf der inneren Kind div). Da das Ereignis nicht propagieren bis die DOM-Hierarchie, die übergeordnete div wird nicht sehen, und seine Handler wird nicht ausgelöst.
Wenn die Ausbreitung sofort gestoppt wird, gibt es nur noch eine Meldung. Obwohl es drei Event-Handler gibt, die an das innere Child-Div angehängt sind, wird nur einer ausgeführt und jede weitere Ausbreitung wird sofort beendet, sogar innerhalb desselben Elements.
12 Stimmen
Ich ermutige den Leser, sich nicht nur an die akzeptierte Antwort zu halten, sondern auch die anderen Antworten zu lesen, insbesondere die von Robert Siemer, die sehr aufschlussreich ist. Um sie zu verstehen, ist eine gute Kenntnis der Funktionsweise der Ausbreitung erforderlich.