默认选中状态必须由HTML属性checked、selected、value直接声明决定;JS赋值仅影响运行时状态,刷新即丢失,form.reset()也只恢复HTML初始值,不认JS修改。

默认选中状态必须靠 HTML 属性决定,checked、selected、value 这三类属性写在标签上才生效;JS 赋值只是运行时状态,刷新就丢,form.reset() 也回不到 JS 设的值。
单选框(radio)默认选中只看 checked 是否存在
同一组 radio 必须共用完全一致的 name(大小写敏感、无空格),且仅一个带 checked 属性:
-
checked="true"、checked="false"、checked=""都算“存在”,浏览器一律当默认选中——别信属性值,只看有没有这个单词 - 漏写
name或拼错(比如name="color"和name="colour"),会导致多个checked同时生效,提交时全发出去 - 服务端模板里避免直接拼字符串:
checked="{{ $user->is_admin }}"可能渲染出checked="0",结果还是选中;应改用条件判断是否插入checked
复选框(checkbox)可多个同时默认选中
每个 input[type="checkbox"] 独立判断,name 相同不影响默认状态互斥:
- 要默认勾选“邮件”和“站内信”,就分别给对应标签加
checked:<input type="checkbox" name="notify" value="email" checked>、<input type="checkbox" name="notify" value="inapp" checked> -
selected对 checkbox 完全无效——那是<option>的属性,写错标签会静默失败 - 若用 CSS 自定义样式(比如隐藏原生控件+伪元素),
checked属性仍是唯一触发视觉切换的依据,不能删
<select multiple> 里预选多个 <option>
必须同时满足两个条件:标签有 multiple 属性,且目标 <option> 带 selected:
立即学习“前端免费学习笔记(深入)”;
-
<select multiple><option value="a">A</option><option value="b" selected>B</option></select>—— B 默认高亮 - 不加
multiple,即使多个selected,浏览器也只认第一个 - React/Vue 中
selected属性会被框架状态覆盖,得靠数组绑定(如v-model="selectedValues")初始化,HTML 里的selected形同虚设
为什么 JS 设置 element.checked = true 不算“默认”
它改的是当前 DOM 状态,但绕过了浏览器初始渲染逻辑:
- 表单重置(
form.reset())后,该控件会回到 HTML 中定义的初始状态,不是 JS 设的那个值 - 如果依赖
change事件触发后续逻辑,单纯赋值不会触发事件,得手动dispatchEvent(new Event('change', { bubbles: true }))或调用click() - DOM 尚未挂载时执行 JS 赋值(比如在
<script>标签里直接写),会报Cannot set property 'checked' of null,得等DOMContentLoaded或用document.querySelector确保元素存在
最容易被忽略的一点:所有这些属性(checked、selected、value)必须在 HTML 字符串里硬编码或由服务端/模板引擎准确输出;任何靠 JS “补上”的行为,本质上都不是默认状态,只是用户看到的第一个运行时状态。



















