<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
From within onClickHandler
and/or onChangeHandler
, how can I determine whether the new state of the checkbox?
<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
From within onClickHandler
and/or onChangeHandler
, how can I determine whether the new state of the checkbox?
The short answer:
Use the
click
event, which won't fire until after the value has been updated, and fires when you want it to:Live example | Source
The longer answer:
The
change
event handler isn't called until thechecked
state has been updated (live example | source), but because (as Tim Büthe points out in the comments) IE doesn't fire thechange
event until the checkbox loses focus, you don't get the notification proactively. Worse, with IE if you click a label for the checkbox (rather than the checkbox itself) to update it, you can get the impression that you're getting the old value (try it with IE here by clicking the label: live example | source). This is because if the checkbox has focus, clicking the label takes the focus away from it, firing thechange
event with the old value, and then theclick
happens setting the new value and setting focus back on the checkbox. Very confusing.But you can avoid all of that unpleasantness if you use
click
instead.I've used DOM0 handlers (
onxyz
attributes) because that's what you asked about, but for the record, I would generally recommend hooking up handlers in code (DOM2'saddEventListener
, orattachEvent
in older versions of IE) rather than usingonxyz
attributes. That lets you attach multiple handlers to the same element and lets you avoid making all of your handlers global functions.An earlier version of this answer used this code for
handleClick
:The goal seemed to be to allow the click to complete before looking at the value. As far as I'm aware, there's no reason to do that, and I have no idea why I did. The value is changed before the
click
handler is called. In fact, the spec is quite clear about that. The version withoutsetTimeout
works perfectly well in every browser I've tried (even IE6). I can only assume I was thinking about some other platform where the change isn't done until after the event. In any case, no reason to do that with HTML checkboxes.Use this