I have this setup
1 2 3
Change the inline onclick to this:
onclick="SomeEvent(this, event)"
Then in SomeEvent
, do this:
function SomeEvent( el, event ) {
var target = event.srcElement || event.target;
if( el === target ) {
// run your code
}
}
This will only fire the code when you click on the div
element itself, instead of a descendant.
If there are other descendants that should fire the handler, then do this:
function SomeEvent( el, event ) {
var target = event.srcElement || event.target;
if( target.nodeName.toLowerCase() !== 'input' || !target.type || target.type !== 'checkbox' ) {
// run your code
}
}
This will fire the handler for any click except those on the checkboxes.
In the event bubbling model, the event propagation is from the inner elements to the outer elements.
This means that the event.stopPropagation(); should be in the inputs' events instead of the div.
<div onclick="SomeEvent">
<input type=checkbox value=1 onclick="stopPropagation()">1
<input type=checkbox value=2 onclick="stopPropagation()>2
<input type=checkbox value=3 onclick="stopPropagation()>3
</div>
Now the Javascript code:
function stopPropagation() {
//... do something.
//stop propagation:
if (!e) var e = window.event;
e.cancelBubble = true; //IE
if (e.stopPropagation) e.stopPropagation(); //other browsers
}
More info: http://www.quirksmode.org/js/events_order.html
EDIT: The above was a quick way to show how the bubbling model works, but a better answer to solve this problem using JQuery would be:
<div id="mydiv">
<input type="checkbox" value="1" /> 1
<input type="checkbox" value="2" /> 2
<input type="checkbox" value="3" /> 3
</div>
Now the Javascript code:
$('#mydiv').click(function(e) {
//do something
});
$('#mydiv input').click(function(e) {
//stop propagation:
if (!e) var e = window.event;
e.cancelBubble = true; //IE
if (e.stopPropagation) e.stopPropagation(); //other browsers
});