Day10 - JS 实现 Checkbox 中按住 Shift 的多选功能
作者:©liyuechun
简介:JavaScript30 是 Wes Bos 推出的一个 30 天挑战。项目免费提供了 30 个视频教程、30 个挑战的起始文档和 30 个挑战解决方案源代码。目的是帮助人们用纯 JavaScript 来写东西,不借助框架和库,也不使用编译器和引用。现在你看到的是这系列指南的第 10 篇。完整中文版指南及视频教程在 从零到壹全栈部落。
Wes Bos 在文档里提供了一种解决办法:用一个变量,来标记这个范围。
变量初始值为 false,当按下 Shift 键且同时选中了某个元素的时候,遍历所有项,遍历过程中,若遇到 A 或 B,则将标记值取反。同时,将所有标记为 true 的项设置为选中。
const checkboxes = document.querySelectorAll(.inbox input[type="checkbox"]); let startChecked; // 处理方法一:用变量 inBetween 对需要选中的元素进行标记 function handleCheck0(e) { let inBetween = false; if(e.shiftKey this.checked){ boxs.forEach(input = { console.log(input); if(input === startChecked || input ===this) { inBetween = !inBetween; if(inBetween) { console.log("on"); input.checked = true; startChecked = this; checkboxes.forEach(checkbox = checkbox.addEventListener(click, handleCheck));
上面会出现一个问题,初次加载页面时,按住 Shift 再点击某一项,此项之后的元素都会被选中。此外,对于取消选中,无法批量操作。下面方法三是缉熙Soyaine 的操作逻辑。方法三是我对Wes Bos实现方法逻辑的改进,方法二和方法三取消和选中均可批量操作。
let startChecked; let onOff = false; // 处理方法二:新增onOff变量存储复选框将要改变的状态 function handleCheck2(e) { let inBetween = false; if (e.shiftKey) { onOff = startChecked.checked ? true : false; boxs.forEach(input = { console.log(input); if (input === startChecked || input === this) { inBetween = !inBetween; if (inBetween input !== startChecked || input === this) { input.checked = onOff; startChecked = this; startChecked = this; }
onOff = startChecked.checked ? true : false; 根据startChecked设置要改变的状态。同时在if (inBetween input !== startChecked || input === this)代码里面做了修改,新增了|| input === this,否则会出现最后一个的状态和其他复选框状态不一致的bug。
方法一中的 inBetween 仅仅表示此项是否在被选中的范围中,此处会赋给它更多的意义,用它来表示此项是选中还是未选中,而范围划定则由数组来解决。
首先将获取到的 input 组转化为数组,针对每次操作,获取 A 和 B,利用 indexOf() 来获得 A 和 B 在数组中的索引值,由此即可确定范围,并能通过 slice() 来直接截取 A-B 的所有 DOM 元素,并进行状态改变的操作,而变量 onOff 表示 A-B 范围内的状态,true 表示选中,false 表示取消选中。
const boxArr = Array.from(boxs); let startChecked; let onOff = false; // 处理方法二:利用数组索引获取需要选中的范围 function handleCheck1(e) { if(!startChecked) startChecked = this; onOff = startChecked.checked ? true : false; if(e.shiftKey) { let start = boxArr.indexOf(this); let end = boxArr.indexOf(startChecked); boxArr.slice(Math.min(start, end), Math.max(start, end) + 1) .forEach(input = input.checked = onOff); console.log(start + "+" + end); startChecked = this; }
转换 Nodelist 为数组
const boxs = document.querySelectorAll(.inbox input[type="checkbox"]); const boxArr = Array.from(boxs);
截取该范围内的数组元素,并改变选中状态
boxArr.slice(Math.min(start, end), Math.max(start, end) + 1) .forEach(input = input.checked = onOff);
利用JavaScript实现二级联动 利用JavaScript实现二级联动 要实现JavaScript二级联动效果,首先要确定需要哪些技术: 二维数组 for in循环 new Option(text,value,true,true) add(option,null) onchange() 表单事件 HTML代码: !-- input type= text id= text -- 请选择省份: select name= id= provinces !-- option value= 江苏省 江苏省 /option
相关文章
- 002Python和JS的不同进制之间的转换实现
- 盒子拖拽效果,原生js实现
- 实现JS数组的深拷贝
- ace.js实现一个在线代码编辑器
- 利用tween,使用原生js实现模块回弹动画效果
- js实现密码强度验证
- JS配合CSS3实现动画和拖动小星星小Demo
- JS 哪些操作会造成内存泄露,对应的解决方法
- vue项目js实现图片放大镜功能
- tampermonkey,采用js解析自定义脚本,实现网页列表数据采集分析
- 【圣诞表白特效----HTML CSS JS实现(附效果+源代码)】
- js实现单例模式
- 原生 js 实现一个有动画效果的进度条插件 progress
- Slip.js – 在触摸屏上实现列表的滑动排序功能
- 浅析 js 实现网页截图的两种方式
- JS 实现全屏预览 F11功能
- js:实现继承的几种方法(包括es6)
- js金额数字格式化实现代码(三位加逗号处理保留两位置小数)
- Vue.js 2.5新特性介绍
- Unity3d C#实现基于SocketIOUnity的与后端(node.js为例)Socket通信功能(含工程)
- 基于Three.js和MindAR实现的网页端WebAR人脸识别追踪功能的京剧换脸Demo(含源码)
- Mock.js简易教程,脱离后端独立开发,实现增删改查功能(转)
- 使用 rollup 打包一个原生 js + canvas 实现的移动端手势解锁功能组件
- web页面实现全背景视频功能方案:使用bideo.js来处理object-fit在ie浏览器下不兼容问题
- vuejs2.0运用原生js实现简单的拖拽元素功能
- vue2.0使用Sortable.js实现的拖拽功能
- Vue.js实践:实现多条件筛选、搜索、排序及分页的表格功能