实现效果
需求分析
- 通过
shift
键实现连续多选功能 - 按下
shift
的同时点击A复选框,然后在点击B复选框,A,B之间的复选框都被勾选上 - 或者是先点击A复选框,再按下
shift
键点击B复选框,A,B之间的复选框都被勾选上
代码实现
方法一
-
要实现这个关键在于需要知道A和B之间有多少个选项
-
使用一个变量isBetween来标记有多少个选项,刚开始isBetween=false
-
当遇到A和B的时候就对isBetween进行取反
-
遇到A的时候,isBetween取反等于true
-
遇到B后,isBetween取反就变成了false
-
在遇到B之前,通过forEach遍历,遇到了AB之间的元素,由于他们都没有被选中,所以不能进入第一个循环,也就不能改变isBetween的值,
-
所以在遇到B之前,遍历了n个元素,就有n-1个isBetween为true
-
isBetween为true,让item.checked = true;就能实现选择AB之间的元素了
let lastChecked = null;
function handleCheck(e){let isBetween = false;let checkedNum = 0;checkboxes.forEach(item => {if (item.checked) {checkedNum++;}});if (e.shiftKey && this.checked && checkedNum > 1) {checkboxes.forEach(item => {if (item === this || item === lastChecked) {isBetween = !isBetween;}if (isBetween) {item.checked = true;}})}lastChecked = this;
}
方法二
利用数组索引获取需要选中的范围
let onOff = false;
let lastChecked = null;
function handleCheck1(e) {if(!lastChecked) lastChecked = this;onOff = lastChecked.checked ? true : false;if(e.shiftKey) {let start = boxArr.indexOf(this);let end = boxArr.indexOf(lastChecked);boxArr.slice(Math.min(start, end), Math.max(start, end) + 1).forEach(input => input.checked = onOff);}lastChecked = this;
}boxs.forEach(box => box.addEventListener('click', handleCheck1));