checked、selected、indeterminate是检测表单元素选中状态的唯一可靠依据;js读取它们比监听事件更直接,比value更准确,尤其适用于radio和多选select。

checked、selected、indeterminate 这三个属性是检测表单元素选中状态的唯一可靠依据,JS 读取它们的值比监听事件更直接,也比检查 value 更准确——尤其对 radio 和多选 select。
radio 和 checkbox 用 checked 判断是否被选中
同一组 radio 共享 name,但只有当前被勾选的那个元素的 checked 属性为 true;checkbox 独立判断,每个都可单独读 element.checked。
- 别用
form.elements[name].value获取 radio 选中值——它只返回第一个(哪怕没勾选),或 undefined - 正确方式是:先用
document.querySelectorAll('input[name="gender"]:checked')拿到已勾选的节点,再取.value - 如果没匹配到任何节点,说明该组 radio 完全未选,此时
querySelectorAll(...).length === 0 - 注意:动态插入的 radio,需确保 DOM 已就绪再查询,否则返回空 NodeList
select(单选)用 selected 或 value 判断
单选 select 的当前选中项由其 options 集合中哪个 option.selected === true 决定,也可直接读 select.value——两者等价,但 value 更简洁。
-
select.value返回的是当前选中option的value属性值,若没设value,则返回文本内容(不推荐依赖此行为) - 如果想确认“是否选了非 placeholder 项”,可对比
select.value是否等于初始option[0]的value,或检查select.selectedIndex !== 0 - 禁用的
option即使带selected,也不会被浏览器当作有效选中项——select.value会跳过它,返回下一个可用项
select multiple 和 indeterminate 状态不能靠 value 判断
多选 select 的选中状态必须遍历 options 数组,逐个查 option.selected;而 checkbox 的半选态(indeterminate)和 checked 是两个正交布尔值,必须分开读。
- 不要写
if (select.value)来判断多选框是否“有选择”——它只返回第一个选中项的value,且无法反映多选事实 - 正确做法:
Array.from(select.options).filter(opt => opt.selected).map(opt => opt.value) -
indeterminate是只读视觉标记,不影响checked,也不参与表单提交;读取它只能用element.indeterminate,不能用getAttribute('indeterminate') - 即使
indeterminate = true,element.checked仍可能是false或true,二者无推导关系
最容易被忽略的是:框架(React/Vue)中,HTML 的 checked 和 selected 属性只是初始值占位符,运行时状态完全由组件数据驱动;直接读 DOM 属性可能得到过期结果。真要检测用户最终选择,应优先读框架绑定的数据源,而非原生属性。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











