Risposte:
stopPropagation
impedirà qualsiasi genitore gestori vengano eseguiti stopImmediatePropagation
impedirà eventuali gestori genitore e anche eventuali altri gestori di eseguire
Esempio rapido dalla documentazione di jquery:
$("p").click(function(event) {
event.stopImmediatePropagation();
});
$("p").click(function(event) {
// This function won't be executed
$(this).css("background-color", "#f00");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>example</p>
Si noti che l'ordine dell'associazione di eventi è importante qui!
Un piccolo esempio per dimostrare come funzionano entrambe queste interruzioni della propagazione.
Esistono tre gestori di eventi associati. Se non fermiamo alcuna propagazione, dovrebbero esserci quattro avvisi: tre sul div figlio e uno sul div genitore.
Se fermiamo la propagazione dell'evento, allora ci saranno 3 allarmi (tutti sul div figlio interno). Poiché l'evento non si propagherà nella gerarchia DOM, il div padre non lo vedrà e il suo gestore non si attiverà.
Se interrompiamo immediatamente la propagazione, ci sarà solo 1 avviso. Anche se ci sono tre gestori di eventi collegati al div figlio interno, solo 1 viene eseguito e ogni ulteriore propagazione viene uccisa immediatamente, anche all'interno dello stesso elemento.
stopPropagation()
varianti smetteranno anche di propagarsi nella gerarchia DOM. Non solo. Si prega di controllare la mia risposta per i dettagli con la fase di cattura.
Dalla API jQuery :
Oltre a impedire l'esecuzione di eventuali gestori aggiuntivi su un elemento, questo metodo interrompe anche il bubbling chiamando implicitamente event.stopPropagation (). Per impedire semplicemente all'evento di gorgogliare agli elementi antenati ma consentire ad altri gestori di eventi di essere eseguiti sullo stesso elemento, possiamo invece utilizzare event.stopPropagation ().
Utilizzare event.isImmediatePropagationStopped () per sapere se questo metodo è mai stato chiamato (su quell'oggetto evento).
In breve: event.stopPropagation()
consente l'esecuzione di altri gestori sullo stesso elemento, event.stopImmediatePropagation()
impedendo l' esecuzione di ogni evento.
event.stopImmediatePropagation
non smette di gorgogliare giusto?
stopImmediatePropagation
impedisce all'evento di essere periodo propagato, entrambi dovrebbero prevenire il gorgoglio, non vale nulla che puoi anche cambiare la modalità di acquisizione che attiverà prima gli elementi più esterni e solo allora scendi ai bambini (il gorgoglio è l'impostazione predefinita e funziona nella direzione opposta)
event.stopPropagation
impedirà l'esecuzione di gestori su elementi padre.
La chiamata event.stopImmediatePropagation
impedirà anche l'esecuzione di altri gestori sullo stesso elemento.
Sono in ritardo, ma forse posso dirlo con un esempio specifico:
Di ', se hai un <table>
, con <tr>
, e poi <td>
. Ora, supponiamo che tu abbia impostato 3 gestori di eventi per l' <td>
elemento, quindi se lo fai event.stopPropagation()
nel primo gestore di eventi per cui hai impostato <td>
, tutti i gestori di eventi per <td>
verranno comunque eseguiti , ma l'evento non si propaga a <tr>
o <table>
(e non lo farà andare su e fino a <body>
, <html>
, document
, e window
).
Ora, però, se si utilizza event.stopImmediatePropagation()
nel tuo primo gestore di eventi, poi, gli altri due gestori di eventi per <td>
non funzionerà , e non si propagano fino a <tr>
, <table>
(e non saliranno e fino a <body>
, <html>
, document
, e window
).
Si noti che non è solo per <td>
. Per altri elementi, seguirà lo stesso principio.
1) event.stopPropagation():
=> Viene utilizzato per interrompere solo le esecuzioni del relativo gestore genitore corrispondente.
2) event.stopImmediatePropagation():
=> Viene utilizzato per interrompere l'esecuzione del relativo gestore genitore corrispondente e anche del gestore o della funzione collegata a se stesso tranne il gestore corrente. => Arresta anche tutto il gestore collegato all'elemento corrente dell'intero DOM.
Ecco l'esempio: Jsfiddle !
Grazie -Sahil
event.stopPropagation () consente l' esecuzione di altri gestori sullo stesso elemento, mentre event.stopImmediatePropagation () impedisce l'esecuzione di ogni evento. Ad esempio, vedi sotto il blocco di codice jQuery.
$("p").click(function(event)
{ event.stopImmediatePropagation();
});
$("p").click(function(event)
{ // This function won't be executed
$(this).css("color", "#fff7e3");
});
Se event.stopPropagation è stato utilizzato nell'esempio precedente, il successivo evento click sull'elemento p che modifica il css verrà generato , ma nel caso event.stopImmediatePropagation () , il successivo evento p click non verrà generato .
Sorprendentemente, tutte le altre risposte dicono solo metà della verità o sono in realtà sbagliate!
e.stopImmediatePropagation()
impedisce a qualsiasi altro gestore di essere chiamato per questo evento, senza eccezionie.stopPropagation()
è simile, ma chiama comunque tutti i gestori per questa fase su questo elemento se non già chiamatoQuale fase?
Ad esempio, un evento clic scenderà sempre fino in fondo al DOM (chiamato "fase di acquisizione"), infine raggiungerà l'origine dell'evento ("fase di destinazione") e quindi tornerà indietro ("fase di bolla"). E con addEventListener()
te puoi registrare più gestori per entrambe le fasi di acquisizione e bolla. (La fase target chiama gestori di entrambi i tipi sul target senza distinguere.)
E questo è ciò su cui le altre risposte sono errate:
Una spiegazione della fase dell'evento di violino e mozilla.org con demo.
Qui sto aggiungendo il mio esempio JSfiddle per stopPropagation vs stopImmediatePropagation. JSFIDDLE
let stopProp = document.getElementById('stopPropagation');
let stopImmediate = document.getElementById('stopImmediatebtn');
let defaultbtn = document.getElementById("defalut-btn");
stopProp.addEventListener("click", function(event){
event.stopPropagation();
console.log('stopPropagation..')
})
stopProp.addEventListener("click", function(event){
console.log('AnotherClick')
})
stopImmediate.addEventListener("click", function(event){
event.stopImmediatePropagation();
console.log('stopimmediate')
})
stopImmediate.addEventListener("click", function(event){
console.log('ImmediateStop Another event wont work')
})
defaultbtn.addEventListener("click", function(event){
alert("Default Clik");
})
defaultbtn.addEventListener("click", function(event){
console.log("Second event defined will also work same time...")
})
div{
margin: 10px;
}
<p>
The simple example for event.stopPropagation and stopImmediatePropagation?
Please open console to view the results and click both button.
</p>
<div >
<button id="stopPropagation">
stopPropagation-Button
</button>
</div>
<div id="grand-div">
<div class="new" id="parent-div">
<button id="stopImmediatebtn">
StopImmediate
</button>
</div>
</div>
<div>
<button id="defalut-btn">
Normat Button
</button>
</div>