本文详解如何在已实现 shift 多选功能的基础上,扩展支持“按住 shift 键单击任一已选中复选框”来反选其与上一次点击项之间的所有复选框,纯原生 javascript 实现,无需依赖库。
在构建交互式列表(如邮箱、任务管理器)时,高效的批量选择与反选能力至关重要。你已成功实现了经典的 Shift + Click 区间选中 功能:按住 Shift 并点击两个复选框,可自动选中二者之间的全部项。但用户实际操作中常需「快速清除某一段」——例如:已选中第1–5项,此时按住 Shift 单击第3项,应将第3–5项(即从当前项到上一次点击项之间)全部取消勾选。
这并非简单地 checkbox.checked = false,而是需保持区间逻辑对称性:选中时设 true,反选时设 false,且判断逻辑完全复用原有 inBetween 状态翻转机制。
只需在你现有的 handleCheck 函数中,补充一个 else if 分支,专门处理 e.shiftKey && !this.checked 的场景:
function handleCheck(e) {
let inBetween = false;
const checkboxes = document.querySelectorAll('.inbox input[type="checkbox"]');
// ✅ 原有:Shift + 点击勾选 → 区间设为 true
if (e.shiftKey && this.checked) {
checkboxes.forEach(checkbox => {
if (checkbox === this || checkbox === lastChecked) {
inBetween = !inBetween;
}
if (inBetween) {
checkbox.checked = true;
}
});
}
// ✅ 新增:Shift + 点击取消 → 区间设为 false
else if (e.shiftKey && !this.checked) {
checkboxes.forEach(checkbox => {
if (checkbox === this || checkbox === lastChecked) {
inBetween = !inBetween;
}
if (inBetween) {
checkbox.checked = false;
}
});
}
lastChecked = this;
}⚠️ 关键注意事项:
至此,你的复选框系统便具备了专业级的双向区间操作能力:既可高效选中一段,也可精准清除一段,真正实现“所见即所得”的交互直觉。