2011-09-16 13 views
7

Cuando uso .bind para vincular el evento en el elemento secundario y secundario, el evento secundario puede detener la propagación del evento con return false; Pero cuando uso delegate, devuelvo falso; no detiene la propagación de eventos.¿Cómo detener la propagación de eventos cuando se usa delegate?

http://jsfiddle.net/J3EAQ/

html:

<div class="parent"> 
    <div class="child"></div> 
    <div class="child"></div> 
</div> 

JS:

$('.parent').delegate('.child','click',function(e){ 
    alert('child click'); 
    return false; 
}); 
$('.parent').bind('click',function(e){ 
    alert('parent click'); 
}); 
+0

¿Es posible el duplicado? http://stackoverflow.com/questions/1357118/javascript-event-preventdefault-vs-return-false –

Respuesta

1

Debería utilizar e.stopPropagation() para evitar la propagación, no devolviendo falsa.

return false es técnicamente dos cosas; 1) prevenir la acción predeterminada, y 2) detener la propagación. Intente cambiar a la invocación de método en e y vea si eso soluciona su problema.

+0

Todavía no resuelve este problema –

+0

@ Intercostel_Coder - Correcto, su solución es mejor. Nunca supe sobre 'stopImmediatePropagation()'. ¡Gracias! – Tejs

4

¿Por qué dos manipuladores de clic cuando se puede tener uno:

$('.parent').click(function (e) { 
    if ($(e.target).is('.child')) { 
     alert('child click'); 
    } else { 
     alert('parent click'); 
    }  
}); 

Demostración en directo:http://jsfiddle.net/J3EAQ/2/


Una generalización de este patrón:

$(element).click(function (e) { 
    if (e.target === this) { 
     // this element was clicked directly 
    } else { 
     // this element was NOT clicked directly 
     // a descendant of this element was clicked 
    }  
}); 

¿Manejadores separados?

$('.parent').click(function (e) { 
    if (this ==== e.target) { 
     parentClicked.call(e.target, e); 
    } else { 
     childClicked.call(e.target, e); 
    }  
}); 

function childClicked(e) { 
    // child click handler 
} 

function parentClicked(e) { 
    // parent click handler 
} 
+0

técnicamente soluciona el problema, pero me gusta separar la funcionalidad de los diferentes elementos, por lo que necesito una solución con 2 controladores de eventos. – codez

+0

Entonces no use '.delegate', simplemente use' .click' en ambos lugares. – Blazemonger

+0

@codez También puedes tener eso. Ver mi actualización –

0

Se puede utilizar siempre e.stopPropagation()

+0

No funciona: http://jsfiddle.net/J3EAQ/3/ – codez

-1

su evento no está siendo propagado. está vinculando un controlador de clic al .parent y está haciendo clic en .parent

0

Lo que funcionó para mí fue verificar el nombre de clase del clic objetivo en el controlador de clic que no desea que se active por otro evento de clic. Algo como esto.

if(e.target.className.toString().indexOf("product-row") > -1){ 
     // Only do stuff if the correct element was clicked 
    } 
Cuestiones relacionadas