【发布时间】:2020-01-20 19:29:33
【问题描述】:
我有一个表格。如果用户准确地选中了 8 个可用复选框中的 4 个,我只想允许表单提交;一旦用户选中了 4 个复选框,我想禁用其余未选中的复选框。
我应该给click 事件添加一个钩子吗?或者input 事件?或者change 事件?
我对似乎重复彼此功能的事件数量感到不知所措。
我也对文档感到困惑。
对于带有
type=checkbox或type=radio的<input>元素,只要用户切换控件,HTML5 specification 就会触发input事件。然而,从历史上看,情况并非总是如此。检查兼容性,或使用change事件代替这些类型的元素。
与
input事件不同,change事件不一定会在每次更改元素的value时触发。
以下:
根据要更改的元素类型和用户与元素交互的方式,
change事件会在不同的时刻触发:
- 当元素为
:checked(通过单击或使用键盘)时,对于<input type="radio">和<input type="checkbox">;
当指针位于元素内部时同时按下和释放定点设备按钮(例如鼠标的主鼠标按钮)时,元素会收到
click事件。
练习:
下面的 JS fiddle 似乎暗示所有 3 个事件都是等价的。单击复选框、单击标签、选中复选框和按键盘上的空格键似乎都会触发所有三个事件。
const checkbox = document.querySelector('input[type=checkbox]');
for (const event of ['input', 'click', 'change']) {
checkbox.addEventListener(event, () => {
log.textContent = `${event}\n${log.textContent}`
})
}
<label>Toggle <input type="checkbox" name="" id="">
</label>
<pre id="log"></pre>
根据文档 change 和 input 似乎是等效的;根据文档,click 似乎不等同于其他 3 个,但实际上它似乎等同。
我们真的有 3 个事件可以重复彼此的功能吗?我使用哪个事件有什么关系吗?
还是我错过了什么?
【问题讨论】:
标签: javascript events checkbox click onchange