空格键触发单击事件复选框
Spacebar triggering click event on checkbox?
如果在复选框上空格键,它会选中该框。一切都很好,直到我决定禁用父div 上的单击事件,我意识到这也禁用了复选框上的空格键!
div1.addEventListener("click",function (e) {
if (e.preventDefault) e.preventDefault();
e.cancelBubble = true;
return false;
}, true);
<div id="div1">
<input id="chk1" type="checkbox">
</div>
http://jsfiddle.net/0t01252x/1/
我怎样才能防止这种情况发生?对我来说,这似乎是一种非常奇怪的行为。点击事件是点击事件,而不是键盘事件...
注意:使用铬和FF测试
编辑:最差:在控制台中输出事件会给出...鼠标事件!
怪癖模式 - 单击、鼠标向下、鼠标向上、dblclick
当用户单击元素或通过其他方式(即键盘)激活元素时,单击事件将触发..."点击"事件确实用词不当:它应该被称为"激活"事件。
若要解决此问题,可以将click
和keyup
事件附加到复选框。
checkbox.addEventListener("click", handleCheckboxEvent, true);
checkbox.addEventListener("keyup", handleCheckboxEvent, true);
侦听这两个事件,并始终禁用默认行为。从那里,您可以确定如果按下键32
,空格键是否触发了keyup
事件 ( e.keyCode === 32
)。
,请取消选中它。
function handleCheckboxEvent(e) {
e.preventDefault();
if (e.keyCode === 32) { // If spacebar fired the event
this.checked = !this.checked;
}
}
更新的示例 - 在最新版本的Chrome/FF/IE中测试。
(function () {
var checkbox = document.getElementById('checkbox');
function handleCheckboxEvent(e) {
e.preventDefault();
if (e.keyCode === 32) { // If spacebar fired the event
this.checked = !this.checked;
}
}
checkbox.addEventListener("click", handleCheckboxEvent, true);
checkbox.addEventListener("keyup", handleCheckboxEvent, true);
})();
<input id="checkbox" type="checkbox" />
Kaiido 似乎有一个很好的解决方案。至于行为,这显然是意料之中的。根据:
W3C - SCR35:通过使用定位点和按钮的 onclick 事件使操作键盘可访问
出于辅助功能目的,onclick
事件由键盘触发。浏览器使用 click 事件,即使该事件在鼠标不存在的情况下从键盘触发:
虽然"onclick"听起来像是与鼠标绑定的,但onclick事件 实际上映射到链接或按钮的默认操作。这 当用户用鼠标单击元素时发生默认操作, 但当用户聚焦元素并点击 Enter 或 空间,以及何时通过辅助功能 API 触发元素。
- 如果选中了多个复选框,如何添加事件
- 复选框,然后单击事件处理
- Firefox:点击并更改未附加到文档树中的复选框元素上的事件
- 选中javascript中的属性集时,复选框更改事件未触发
- jQuery复选框(在ul>li下)检查事件
- 如何禁用自定义复选框的单击事件
- 将函数事件绑定到更改函数的复选框/标签
- 当通过选择页面上所有复选框的 jQuery 脚本选中复选框时,如何触发自定义 javascript 事件
- 选中/取消选中某些事件的复选框
- Javascript,表单中任何复选框的事件处理程序
- Jquery复选框更改事件未激发
- jQuery复选框和span共享一个单击事件
- 带有复选框的jQuery更改事件处理程序
- 复选框上的点击捕捉事件
- 使用 JavaScript 更改复选框 OnClick 事件的值
- 空格键触发单击事件复选框
- 更改 Chrome 扩展程序中未触发的事件复选框
- 在AJAX插入的动态创建元素上绑定事件(复选框)
- 单击“事件”复选框将不会触发
- 动态添加点击事件复选框,只适用于第一个复选框JQUERY