2009-07-13 13 views
22

Mi manca totalmente cosa dovrebbe fare? Mi aspetto che se chiamo stopPropagation() su un evento, i gestori di quell'evento non vengano attivati ​​sugli elementi antenati, ma l'esempio seguente non funziona in questo modo (almeno in FireFox 3).jquery Event.stopPropagation() sembra non funzionare

<script type="text/javascript"> 
    $("input").live("click", function(event){ 
     console.log("input click handler called") 
     event.stopPropagation() 
    }); 

    $("body").live("click", function(event){ 
     console.log("body was click handler called. event.isPropagationStopped() returns: " + event.isPropagationStopped()); 
    }) 

</script> 

... 

<body> 
    <input type="text" > 
</body> 

risposta

50

Gli eventi live non seguono le stesse regole bubbling degli eventi. Vedere la documentazione su live event handling.

Citazione di riferimento di cui sopra:

eventi live non fanno bolla in modo tradizionale e non possono essere arrestata utilizzando stopPropagation o stopImmediatePropagation. Ad esempio, prendere il caso di due eventi click - uno legato a "li" e un altro "li a". Se si verifica un clic sull'ancoraggio interno , gli eventi BOTH verranno attivati. Questo perché quando un $ ("li"). Bind ("clic", fn); è legato al numero in realtà "Ogni volta che si verifica un evento su un elemento LI - o all'interno di un elemento LI - attiva questo evento di clic ". Per interrompere ulteriormente l'elaborazione di per un evento dal vivo, fn deve restituire falso .

+0

Impressionante. Grazie mille per la clarificatin. – morgancodes

+1

Sto ponendo la stessa domanda qui: http://stackoverflow.com/questions/7961418/is-it-possible-to-stop-child-click-events-propagating-to-parents-when-handled-by the cosa è, cosa si fa quando si deve interrompere la propagazione su eventi live, non ho la possibilità di rimuovere il gestore dal vivo dato che ho a che fare con elementi caricati dinamicamente. – RGBK