我在寻找如何为复选框添加事件,本以为人们会使用.change
来设置更改事件,但我发现人们使用的是.click
。
这是有原因的吗?它们似乎对于单击事件和键盘更改都能正常工作。我有什么遗漏的吗?
如果你不相信我可以自己试试。
我在寻找如何为复选框添加事件,本以为人们会使用.change
来设置更改事件,但我发现人们使用的是.click
。
这是有原因的吗?它们似乎对于单击事件和键盘更改都能正常工作。我有什么遗漏的吗?
如果你不相信我可以自己试试。
onchange
在IE中只有在复选框失去焦点时才会触发。因此,如果您使用Tab键到达它,按下空格键几次,然后再使用Tab键移开,您将只收到一个onchange
事件,但会收到多个onclick
事件。
注意:这是IE行为正确(根据规范),而其他浏览器错误的非常非常罕见的情况之一。
onclick
比onchange
更受欢迎的两个原因。
Internet Explorer only fires the onchange event when the checkbox loses the focus (onblur). So onclick
is more of a cross browser solution.
onchange
happens only after the element lose focus.(You wont see a difference since you are calling alert and losing focus on every change). The pseudo code on MDC pretty much explains the element.onchange
implementation.
control.onfocus = focus;
control.onblur = blur;
function focus () {
original_value = control.value;
}
function blur () {
if (control.value != original_value)
control.onchange();
}
.change在某些流行的浏览器中无法正确处理关键更改(用户使用上/下箭头键选择选项),但是.click也无法解决这个问题。有时需要结合keyup或keydown等来使用.change来解决此问题,但是当用户通过tab键访问文档时,如果回调函数中没有显式处理,可能会触发按键事件,因此情况会变得有些混乱。总的来说,很遗憾.change不能像您期望的那样工作,因为它可以解决一些耗时的问题。
是的,两者都可以使用,只有点击不会看到实际对象的变化(比如被选中的复选框),而改变则会。
从技术上讲,改变更可靠,但在实践中两者都可以使用。
它们默认情况下可能都会触发值的更改,但您可以覆盖onClick逻辑以不更改chackbox的值。您可以通过另一个入口点更改值。因此,需要具有.click和.change。
编辑-我也同意Dr Rob的观点
onchange
事件(连续单击两次会将其返回到初始值),但您将收到两个onclick
事件。 - user578895