HTML 复选框:多个值、required 与 indeterminate
HTML <input type="checkbox"> 允许每个选项独立选择或清除。仅提交已选中的复选框的名称和值;未选中的选项不会作为 false 或空字符串发送,而是从提交数据中省略。
读取具有相同名称的多个值
与单选按钮不同,可以一起选择具有相同 name 的复选框。它们的值在同一个名称下重复,因此需要读取全部值。在 JavaScript 的 FormData 实例上使用 getAll,并检查服务器框架处理多个值的规则。
name 用于标识字段;value 是在选中时提交的内容。省略 value 将使用默认字符串 on,因此应指定值以区分选项。为每个复选框提供唯一的 id 以标注其标签。
完整示例:多选、必选项检查,以及排除条目
将此代码保存为 checkbox-demo.html 并在浏览器中打开。它显示实际的表单条目,而不是将它们发送到服务器。比较即使选中,禁用选项如何被排除。
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>复选框提交值</title>
<style>pre { white-space: pre-wrap; overflow-wrap: anywhere; }</style>
</head>
<body>
<h1>复选框练习</h1>
<form id="demo">
<fieldset>
<legend>偏好的颜色(可多选)</legend>
<input type="checkbox" id="blue" name="color" value="blue" checked>
<label for="blue">蓝色</label>
<input type="checkbox" id="red" name="color" value="red">
<label for="red">红色</label>
<input type="checkbox" id="locked" name="color" value="green" checked disabled>
<label for="locked">绿色(禁用)</label>
</fieldset>
<p>
<input type="checkbox" id="ready" name="ready" value="yes" required>
<label for="ready">练习准备完成(必选)</label>
</p>
<button type="submit">查看值</button>
<button type="reset">重置</button>
<button type="button" id="partial">将蓝色显示为部分选择</button>
</form>
<pre id="result" aria-live="polite"></pre>
<script>
const form = document.getElementById('demo');
const result = document.getElementById('result');
const blue = document.getElementById('blue');
form.addEventListener('submit', (event) => {
event.preventDefault();
result.textContent = JSON.stringify(Array.from(new FormData(form).entries()), null, 2);
});
document.getElementById('partial').addEventListener('click', () => {
blue.indeterminate = true;
});
form.addEventListener('reset', () => {
result.textContent = '';
blue.indeterminate = false;
});
</script>
</body>
</html>
- 未选择准备就绪复选框时提交:必填验证会阻止提交。
- 选择准备就绪和红色,然后提交。输出包含 color=blue, color=red 和 ready=yes;禁用的绿色被排除。
- 取消选择蓝色和红色后再次提交,color 条目消失,只剩下
ready=yes。 - 重置会将蓝色和绿色恢复为选中,而红色和准备就绪恢复为未选中。
区分选中、必填和不确定状态
checked 属性提供初始选择。使用 JavaScript 的 checked 属性读取当前状态。checked="false" 属性仍然存在;对于初始未选中的框,请省略该属性。重置会恢复初始值,而不是清除每一个框。
带有 required 的复选框本身必须被选中。这并不意味着共享同一名称的任何一个复选框就足够了。“至少选中一个”的条件需要单独的验证和指导。
indeterminate 是一个 JavaScript 属性,用于显示部分选择状态。它不能通过 HTML 属性设置,并且独立于决定提交的 checked 属性。重置后,按部分显示按钮,选择所需的就绪框,然后检查值:蓝色仍然会被提交。部分显示不会清除 checked,也不会创建第三个提交值。
在服务器上处理缺失和多个值
将每个未选中缺失选项视为错误,或者仅读取重复名称的最后一个值,可能会改变原本的含义。使用应用程序的规则区分“未选择”与无效请求,并在服务器上验证允许的值。
PHP 可以将 name="color[]" 接收为数组,但这需要遵循服务器解析器的规则。浏览器不会为每种编程语言发送通用数组对象。请检查接收到的值是否为数组,并处理缺失值、嵌套数组和不允许的值。有关解析规则,请参阅 PHP 文档中的外部变量 ,关于复选框行为,请参阅 MDN 复选框参考 。




