trigger stop immediate event bubbling all javascript jquery events event-bubbling

javascript - immediate - stop all events jquery



Dominio del evento burbujeante (3)

No estoy seguro de cuál trabajo es más rápido, pero tiene sentido que el próximo código sea mejor:

$("#container").click(function (e) { if (e.target.id && e.target.id !== "container") return false; });

Digamos que tenemos una estructura HTML como esta

<div id="container"> <div id="nested"> <span id="someElement"></span> </div> </div>

... y nuestro objetivo es tener un oyente de eventos en el #container solamente ! Entonces, unimos un oyente (código jQuery)

$("#container").on(''click'', function(event) { alert("container was clicked"); });

Eso funciona, por supuesto, pero mi problema con este enfoque es que, dado que los eventos suelen brotar, ese oyente también se activará si hacemos clic en #nested o #someElement . Mi solución actual para manejar solo el clic cuando se hace clic en #container es comparar this con event.target

$("#container").on(''click'', function(event) { if(this === event.target) { alert("container was clicked"); } });

Mi pregunta: ¿eso se considera "mejor práctica"? ¿Hay una mejor manera con jQuery para lograr el mismo resultado "fuera de la caja"?

Ejemplo en acción: http://jsfiddle.net/FKX7p/


Solución alternativa:

$("#container").click(function(){ alert("container was clicked"); }).children().click(function(e) { return false; });

Pero tu solución es mejor. jsfiddle.net/FKX7p/2/ (con return false) O jsfiddle.net/FKX7p/3/ (usando stopPropagation)

Prefiero el uso de retorno en tu ejemplo (el código se vuelve más fácil de leer):

if(this !== event.target) return;


Una forma alternativa de evitar el burbujeo de eventos es usar event.stopPropagation ();

$("#container").on(''click'', function(event) { alert("container was clicked"); }) .children().on(''click'', function(event) { event.stopPropagation(); });

Creo que la ventaja de utilizar este enfoque es que si desea adjuntar otro evento al div anidado, puede simplemente usar

$("#nested").on(''click'', function(event) { event.stopPropagation(); // some action }); $("#container").on(''click'', function(event) { alert("container was clicked"); });​