2010-03-05 101 views
37

solo una pregunta rápida. Tengo un problema con los divs con onclick javascript dentro de cada uno. Cuando hago clic en el div interno, solo debo activarlo onclick javascript, pero el javascript del div externo también se activa. ¿Cómo puede el usuario hacer clic en el div interno sin activar javascript div externo?Howto: div con onclick dentro de otro div con onclick javascript

<html> 
<body> 
<div onclick="alert('outer');" style="width:300px;height:300px;background-color:green;padding:5px;">outer div 
    <div onclick="alert('inner');" style="width:200px;height:200px;background-color:white;" />inner div</div> 
</div> 
</div> 
</body> 
</html> 
+1

Duplicado. http://stackoverflow.com/questions/2015041/two-differents-onclick-on-two-divs-one-over-the-other – vpram86

+4

Pregunta duplicada, pero mejores respuestas. –

Respuesta

70

Básicamente hay dos modelos de eventos en Javascript. Evento que captura y Evento burbujeando. En el caso de borboteo de eventos, si hace clic en el interior de div, el evento de clic de div interno se dispara primero y luego se activa el clic externo de div. mientras que en la captura de eventos, primero se activa el evento div externo y luego se dispara el evento div interno. Para detener la propagación de eventos, use este código en su método de clic.

if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
+0

gracias, una respuesta clara simple y funciona perfectamente –

+1

Gracias. Excelente respuesta; justo lo que estaba buscando. –

5

return false; de la función onclick del div interior:

<div onclick="alert('inner'); return false;" ... 

Lo que se está tratando es llamado event propagation.

+0

El método que sugieres en realidad no funciona. (Al menos no en ninguno de los navegadores en los que lo he comprobado por primera vez - Firefox 3.6, IE8.) Tenga en cuenta que su enlace realmente dice que use un método diferente, que di en mi respuesta. –

17

Mira la información sobre la propagación de eventos here

En particular, usted querrá algo de código como este en sus controladores de eventos para detener la propagación de eventos:

function myClickHandler(e) 
{ 
    // Here you'll do whatever you want to happen when they click 

    // now this part stops the click from propagating 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 
+0

¡Gracias! esto funcionó para mí – CraZyDroiD

2

Este es un caso de burbujeo de eventos .

Puede utilizar

e.cancelBubble = true; //IE 

y

e.stopPropagation(); //FF 
+0

me tomó un tiempo para entender, pero lo conseguí, thx –

0

Here es alguna referencia más para ayudarle en la comprensión Javascript a la propagación de eventos.

0

tiene dos 'div' y tres '/ div'.

2

una forma más para los navegadores basados ​​en webkit:

<div onclick="alert('inner'); event.stopPropagation;" ... 
+1

esto funciona pero así: onclick = "alert ('inner'); event.stopPropagation();" –

+0

Esto funcionó para mí y lo probé en Opera (46), Chrome (59.0.3071.115), FireFox Developer (55.0b9 (32 bits)), Internet Explorer 11 –

0

Esto fue muy útil, pero no funcionó para mí.

Lo que hice se describe here.

por lo que poner una condición al exterior onclick evento:

if(!event.isPropagationStopped()) { 
    window.location.href = url; 
} 
4

Sólo agregue este código:

window.event.stopPropagation(); 
+0

Esto no funcionó para mí. La respuesta principal es más precisa. –

0

Usted puede utilizar

$("divOrClassThatYouDontWantToPropagate").click(function(event) { 
 
     event.stopPropagation(); 
 
    });

Cuestiones relacionadas