This is caused by a JavaScript trait called event bubbling. By default, your events will 'bubble up' into the DOM.
When clicking a child node, you would automatically trigger a click event for it's parent node(s).
By default, when clicking an element, bubbling happens from the inside out: this means that first the child element's click()
event will be trigged, then it's parent, etc.
You can solve the problem by adding a secondary click handler to your child element as well and telling the browser to stop bubbling in a cross-browser compatible way like so (see live example):
<script language="javascript">
function parentHandler(e) {
alert('parent clicked');
};
function childHandler(e) {
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
alert('child clicked');
};
</script>
<div id="parent" onclick="parentHandler(event);">
Foo
<div id="child" onclick="childHandler(event)">
Bar
</div>
</div>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…