Howto: div with onclick inside another div with onclick javascript

JavascriptHtmlOnclick

Javascript Problem Overview


just a quick question. I'm having a problem with divs with onclick javascript within each other. When I click on the inner div it should only fire it's onclick javascript, but the outer div's javascript is also being fired. How can the user click on the inner div without firing the outer div's 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>

Javascript Solutions


Solution 1 - Javascript

Basically there are two event models in javascript. Event capturing and Event bubbling. In event bubbling, if you click on inside div, the inside div click event fired first and then the outer div click fired. while in event capturing, first the outer div event fired and than the inner div event fired. To stop event propagation, use this code in your click method.

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

Solution 2 - Javascript

Check out the info on event propagation http://www.quirksmode.org/js/events_order.html">here</a>

In particular you'll want some code like this in your event handlers to stop events from propagating:

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();
}

Solution 3 - Javascript

Just add this code :

window.event.stopPropagation();

Solution 4 - Javascript

return false; from the inner div's onclick function:

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

What you're dealing with is called event propagation.

Solution 5 - Javascript

This is a case of event bubbling.

You can use

e.cancelBubble = true; //IE

and

e.stopPropagation(); //FF

Solution 6 - Javascript

One more way for webkit based browsers:

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

Solution 7 - Javascript

This worked for me in Jquery:

$('#outer_element').click(function(event) {
    if(event.target !== event.currentTarget) return;
    alert("Outer element is clicked")                  	    
});

This way, if the current target is not the same as the outer div, it will do nothing. You can implement normal functions on the child elements.

Solution 8 - Javascript

Here is some more reference to help you in understanding javascript event bubbling.

Solution 9 - Javascript

you have two 'div' and three '/div'.

Solution 10 - Javascript

This was very helpful, but it didn't work for me.

What i did is described here.

So I put a condition to the outer onclick event:

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

Solution 11 - Javascript

You can use

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDaniel BrinkView Question on Stackoverflow
Solution 1 - JavascriptAdeelView Answer on Stackoverflow
Solution 2 - JavascriptTim GoodmanView Answer on Stackoverflow
Solution 3 - Javascriptuser3438083View Answer on Stackoverflow
Solution 4 - JavascriptTatu UlmanenView Answer on Stackoverflow
Solution 5 - JavascriptrahulView Answer on Stackoverflow
Solution 6 - JavascriptJuliano MoraesView Answer on Stackoverflow
Solution 7 - JavascriptRamtinView Answer on Stackoverflow
Solution 8 - JavascriptBenView Answer on Stackoverflow
Solution 9 - JavascriptfreddieView Answer on Stackoverflow
Solution 10 - JavascriptshoobyView Answer on Stackoverflow
Solution 11 - JavascriptAngelQuesadaView Answer on Stackoverflow