最准的方法是 document.querySelectorAll('input[name="xxx"]:not([disabled])').length,因其能精准筛选单选按钮且排除禁用项,而 form.elements["name"] 仅返回单个元素或 undefined,getElementsByName 则混入非 radio 元素且不自动过滤 disabled。

直接用 document.querySelectorAll('input[name="xxx"]:not([disabled])').length 最准,别数 form.elements 或遍历 getElementsByName 返回的 NodeList。
为什么不能用 form.elements["name"] 获取数量
当 name 相同的单选按钮被放在同一个 <form> 里时,form.elements["name"] 返回的是**单个 HTMLInputElement 对象**(即当前选中的那个),不是列表。即使没选中,也只返回 undefined 或第一个(行为不一致,IE/Edge 旧版尤其坑)。它根本不反映“有多少个选项”,只是快捷取当前值的入口。
- 想靠
form.elements["gender"].length得到 2(男/女)?会报Cannot read property 'length' of undefined或undefined - 哪怕有 5 个
name="mode"的 radio,form.elements.mode也永远不是数组
document.getElementsByName("name") 的陷阱
getElementsByName 确实返回 NodeList,但问题在于:它包含所有匹配 name 的元素,不管是否是 type="radio",也不过滤 disabled。 比如页面里有个 <input name="theme" type="text"> 和三个 radio,结果就是 4 个节点。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 必须手动过滤:用
.filter(el => el.type === "radio")(但 NodeList 没 filter,得先转数组) - 更麻烦的是
disabled:用户不可操作的选项不该计入“可选项数量”,但getElementsByName不区分 - 推荐写法:
[...document.getElementsByName("plan")].filter(el => el.type === "radio" && !el.disabled).length
最简、最稳、带语义的写法
用 querySelectorAll 一步到位,选择器自带类型和状态过滤能力:
立即学习“前端免费学习笔记(深入)”;
const count = document.querySelectorAll('input[name="payment"]:radio:not([disabled])').length;
-
:radio伪类确保只匹配单选按钮(比[type="radio"]更可靠,兼容性也够) -
:not([disabled])排除禁用项,符合“用户实际可选”的统计意图 - 不依赖 form 结构,哪怕 radio 散落在不同
<div>或表格里也能查全 - 返回的是静态 NodeList,长度不会因 DOM 变动意外改变
注意:如果 name 值含特殊字符(如点号、中括号),必须对 name 做 CSS 选择器转义,比如 name="user[role]" 要写成 input[name="user\[role\]"];否则查询结果为空——这个细节在调试时最容易被忽略。


















