简短的回答:
使用点击事件,它不会触发,直到更新的值,并触发时,你希望它:
Checkbox
function handleClick(cb) {
display("Clicked, new value = " + cb.checked);
}
更长的答案:
更改事件处理程序不会被调用,直到检查状态已更新(live example | source),但是因为(作为TimBüthe在评论中指出)IE不会触发更改事件,直到复选框失去焦点, t主动获得通知。更糟糕的是,如果你点击复选框的标签(而不是复选框本身)来更新它,你可以得到你得到的旧值的印象(在IE这里尝试它通过点击标签:live example | source )。这是因为如果复选框具有焦点,单击标签会使焦点远离焦点,使用旧值触发更改事件,然后点击发生设置新值并将焦点置于复选框。非常混乱。
但你可以避免所有的不愉快,如果你使用click。
我使用DOM0处理程序(onxyz属性),因为这是你问的,但为了记录,我通常建议挂钩处理程序代码(DOM2的addEventListener或attachEvent在旧版本的IE),而不是使用onxyz属性。这允许您将多个处理程序附加到同一个元素,并让您避免使所有处理程序的全局函数。
此答案的早期版本使用此代码为handleClick:
function handleClick(cb) {
setTimeout(function() {
display("Clicked, new value = " + cb.checked);
}, 0);
}
目标似乎是允许点击完成,然后再查看值。据我所知,没有理由这样做,我不知道为什么我这样做。该值在调用点击处理程序之前已更改。实际上,规范是quite clear about that.没有setTimeout的版本在我尝试的每个浏览器(甚至IE6)中工作得很好。我只能假设我正在考虑一些其他平台,直到事件发生后才进行更改。在任何情况下,没有理由这样做与HTML复选框。