
Bootstrap 中原生 checkbox 开关未正确传递选中状态,因未区分 value 属性与实际勾选状态;应使用 .prop('checked') 获取布尔值,而非 .val() 读取默认 'on' 字符串。
bootstrap switch 值始终为 'on' 的原因与解决方案:bootstrap 中原生 checkbox 开关未正确传递选中状态,因未区分 `value` 属性与实际勾选状态;应使用 `.prop('checked')` 获取布尔值,而非 `.val()` 读取默认 'on' 字符串。
在使用 Bootstrap 5 的 form-switch(基于原生 <input type="checkbox">)时,一个常见误区是直接调用 $("#id").val() 获取开关值。由于 HTML 规范规定:未显式设置 value 属性的 checkbox,默认 value 恒为字符串 "on"——无论其是否被勾选(见 MDN checkbox value)。因此,即使开关处于关闭状态,$("#minutes").val() 仍返回 "on",导致后端无法准确判断用户意图。
✅ 正确做法是读取元素的 checked 状态属性,它真实反映用户交互结果(true 表示已勾选,false 表示未勾选)。jQuery 中应使用 .prop("checked")(而非 .attr("checked")),因其直接映射 DOM 属性的当前布尔状态。
以下是修正后的完整代码示例:
<!-- HTML 结构(保持不变,但建议为 checkbox 显式添加 value 提升语义性) -->
<div class="row mt-5">
<div class="col-xl-3">
<h5>Minutes</h5>
<div class="div ml-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="minutes" name="minutes" value="1">
</div>
</div>
</div>
<div class="col-xl-3">
<h5>Accounts</h5>
<div class="div ml-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="accounts" name="accounts" value="1">
</div>
</div>
</div>
<div class="col-xl-6 pt-3">
<button class="btn btn-success btn-lg float-end" type="button" onclick="addEntry();">
<i class="fas fa-save"></i> Record
</button>
</div>
</div>// JavaScript:使用 .prop("checked") 获取真实状态
function addEntry() {
const accountsChecked = $("#accounts").prop("checked");
const minutesChecked = $("#minutes").prop("checked");
$.ajax({
url: "do-add-data.php",
method: "POST",
data: {
accounts: accountsChecked, // 发送 true/false
minutes: minutesChecked // 后端可直接用 bool 类型处理
},
success: function(data) {
$("#addrecord").html(data);
},
error: function(xhr, status, error) {
console.error("AJAX 请求失败:", error);
}
});
}? 关键注意事项:
- ❌ 避免使用 $("#id").val() 读取 checkbox 状态——它只返回 value 属性值(默认 "on"),与勾选无关;
- ✅ 必须使用 $("#id").prop("checked") 获取实时布尔状态;
- ⚠️ 若需兼容原生表单提交(非 AJAX),可保留 value 属性(如 value="1"),此时勾选时会提交该值,未勾选则不提交字段(PHP 中 isset($_POST['minutes']) 判断即可);
- ? 安全提示:后端务必对布尔参数做类型校验(如 PHP 中 (bool)$_POST['minutes'] 或严格验证),不可直接信任前端传入的字符串。
通过此方案,服务端将稳定接收到 true/false 布尔值,彻底解决“开关未开启却传 'on'”的问题,提升数据准确性与逻辑健壮性。


















