取消复选框的点击事件会阻止检查它?

Canceling checkbox's click event prevents checking it?

我需要一个复选框列表,条件是必须至少选中其中一个。
下面的代码产生了这种效果。

document.querySelector('div').addEventListener('click', function(evt){
    if( this.querySelectorAll('input:checked').length == 0 )
        evt.preventDefault() ;
}) ;
<div>
    <input type=checkbox checked>
    <input type=checkbox>
    <input type=checkbox>
</div>

很好,但是,我不明白为什么这段代码有效。

首先,只有在我检查了 没有选中复选框 的条件后,我才会对点击事件执行 .preventDefault()。所以此时取消点击事件应该没什么区别。

其次,即使您尝试使用键盘选中复选框,代码也能正常工作,这很奇怪,因为我只是取消了点击事件。

请解释为什么代码会这样工作。

虽然输入事件侦听器是 运行,但它对元素状态的影响实际上已经执行。如果调用 event.preventDefault(),则此更改会在侦听器 returns 时撤消。这允许复选框事件处理程序测试复选框的新状态,并允许文本输入上的键盘事件处理程序测试包含新输入的值。

它在您使用键盘时起作用的原因是 click 事件是一个高级事件,它包含单击复选框的所有不同方式:您可以使用鼠标来完成,使用它们是键盘,带有触摸屏等。如果您想听特定的点击模式,则必须使用 mousedownkeypress