全选与单选联动需通过JavaScript实现双向绑定:全选变化时批量设置商品复选框checked状态,任一商品变化时统计选中数并动态设置全选框checked和indeterminate属性,同时实时更新选中数量与总金额。

全选与单选联动的关键在于用 JavaScript 监听复选框状态变化,动态同步“全选”按钮和所有商品项的勾选状态,并实时更新结算数据(如总金额、选中数量)。核心是双向绑定逻辑:全选变化 → 更新所有商品项;任一商品项变化 → 反推全选状态。
全选复选框控制所有商品项
给“全选”复选框绑定 change 事件,获取其 checked 状态,遍历所有商品行的复选框(例如 class="item-check"),统一设置它们的 checked 属性。
- 确保每个商品行的复选框有唯一标识或统一 class,方便批量操作
- 不要只改视觉(如 addClass),必须操作原生
checked属性,否则表单提交时不会生效 - 触发后建议调用一次更新结算数据的函数,保证金额/数量即时刷新
商品单选变化反推全选状态
为每个商品复选框绑定 change 事件。每次触发时,统计当前有多少个商品被选中:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 若选中数等于商品总数 → 全选框设为
true - 若选中数为 0 → 全选框设为
false - 若介于两者之间 → 全选框设为
false(即“不完全选中”状态,部分 UI 会用 indeterminate 表示) - 要支持
indeterminate,需手动设置checkbox.indeterminate = true,注意它不影响checked值
HTML 结构建议(精简可运行)
结构清晰有助于 JS 操作。推荐如下最小可行结构:
| 商品 | 单价 | 数量 | 小计 | |
|---|---|---|---|---|
| iPhone | 5999 | 1 | 5999 | |
| AirPods | 1299 | 2 | 2598 |
JS 核心逻辑片段(无框架)
以下为可直接嵌入的轻量逻辑(ES5 兼容):
const checkAll = document.getElementById('check-all');
const itemChecks = document.querySelectorAll('.item-check');
const selectedCountEl = document.getElementById('selected-count');
const totalAmountEl = document.getElementById('total-amount');
<p>function updateSummary() {
let count = 0;
let total = 0;
itemChecks.forEach(cb => {
if (cb.checked) {
const row = cb.closest('tr');
const price = parseFloat(row.querySelector('.price').textContent) || 0;
const qty = parseInt(row.querySelector('.qty').textContent) || 0;
count++;
total += price * qty;
}
});
selectedCountEl.textContent = count;
totalAmountEl.textContent = total.toFixed(2);
}</p><p>// 全选切换
checkAll.addEventListener('change', () => {
itemChecks.forEach(cb => cb.checked = checkAll.checked);
updateSummary();
});</p><p>// 单选切换
itemChecks.forEach(cb => {
cb.addEventListener('change', () => {
const checkedCount = [...itemChecks].filter(cb => cb.checked).length;
if (checkedCount === 0) {
checkAll.checked = false;
checkAll.indeterminate = false;
} else if (checkedCount === itemChecks.length) {
checkAll.checked = true;
checkAll.indeterminate = false;
} else {
checkAll.checked = false;
checkAll.indeterminate = true;
}
updateSummary();
});
});</p><p>// 页面加载后初始化
updateSummary();</p>前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










