按住 Shift 键点击多个元素时如何正确记录选中状态?
我在做一个类似文件管理器的多选功能,想实现按住 Shift 键后点击两个项目,自动选中它们之间的所有项。但目前的问题是,每次点击都会触发默认的单选逻辑,导致中间的元素没法正确选中。
我试过在 click 事件里判断 event.shiftKey,但不知道怎么获取上次点击的元素索引。而且如果用户先 Ctrl+Click 选了几个不连续的,再用 Shift 点击,逻辑就更乱了……有没有比较通用的处理方式?
document.querySelectorAll('.item').forEach((item, index) => {
item.addEventListener('click', (e) => {
if (e.shiftKey) {
// 这里卡住了:怎么知道上一次点击的是哪个?
// 想选中 fromIndex 到 currentIndex 之间的所有元素
} else {
// 正常单选或 Ctrl 多选逻辑
}
});
});
注意几点,每次非 Shift 点击都要更新
lastSelectedIndex。Shift 点击时,算出 min 和 max,中间循环全选中。如果不按 Ctrl 也不按 Shift,通常要先清空之前的选中状态,只留当前这一个。这样写不管你先 Ctrl 选了哪几个,只要按住 Shift 点下一个,中间这段都会被补上。