# JS30 Day10 ## Hold Shift to Check Multiple Checkboxes ###### tags: `JS 30` by Angelina --- 主要做出:用shift 一次選取多個 checkbox 的功能 --- 先來看一個光溜溜的 checkbox --- ![](https://i.imgur.com/gDT3hzl.png) --- 點擊 checkbox --- ![](https://i.imgur.com/9nSsc7T.png) --- 點擊 checkbox + shift 鍵 --- ![](https://i.imgur.com/NMudr4F.png) --- 首先 --- 1 選到每一個 checkbox 加入監聽 click 事件 GO ٩(๑❛ᴗ❛๑)۶ --- ```javascript= const checkboxes = document.querySelectorAll('.inbox input[type="checkbox"]') // console.log(checkboxes) checkboxes.forEach(checkbox => checkbox.addEventListener('click', handleCheck)) ``` --- 2 當任何一個 checkbox 被點擊到 就執行 handleCheck --- 製作 handleCheck function GO (;`O´)o --- ```javascript= const checkboxes = document.querySelectorAll('.inbox input[type=checkbox]') checkboxes.forEach(checkbox => checkbox.addEventListener('click', handleCheck)) function handleCheck(e) { // console.log(e) } ``` --- 3 紀錄上一個點擊的 checkbox 偵測同時點擊 shift + checked GO (ᗒᗣᗕ)՞ --- ```javascript= const checkboxes = document.querySelectorAll('.inbox input[type=checkbox]') checkboxes.forEach(checkbox => checkbox.addEventListener('click', handleCheck)) let lastChecked function handleCheck(e) { // console.log(lastChecked) if(e.shiftKey && this.checked) { // console.log(true) } lastChecked = this } ``` --- 4 事件發生時都要跑一次迴圈,從第一個 checkbox 到最後一個 判斷每一個是不是在該打勾的之間 * 1 => no * 2 => no * 3 => start * 4 => checked * 5 => checked * 6 => end * 7 => no * 8 => no --- 宣告變數 inBetween = false 判斷是不是在要打勾的區間內 GO ʕ •̀ o •́ ʔ --- ```javascript= const checkboxes = document.querySelectorAll('.inbox input[type=checkbox]') checkboxes.forEach(checkbox => checkbox.addEventListener('click', handleCheck)) let lastChecked function handleCheck(e) { let inBetween = false if(e.shiftKey && this.checked) { checkboxes.forEach(checkbox => { // console.log(checkbox) }) } lastChecked = this } ``` --- 加入條件判斷 GO (๑¯◡¯๑) --- ```javascript= const checkboxes = document.querySelectorAll('.inbox input[type="checkbox"]') checkboxes.forEach(checkbox => checkbox.addEventListener('click', handleCheck)) let lastChecked function handleCheck(e) { let inBetween = false if (e.shiftKey && this.checked) { checkboxes.forEach(checkbox => { console.log(checkbox); if (checkbox === this || checkbox === lastChecked) { inBetween = !inBetween console.log('STarting to check them inbetween!') } if (inBetween) { checkbox.checked = true } }) } lastChecked = this } ``` --- Done! --- [網友解法](https://guahsu.io/2017/07/JavaScript30-10-Hold-Shift-and-Check-Checkboxes/) [網友解法](https://stevenjhu.com/2020/03/21/js%E4%BD%9C%E5%93%81js30%E7%B3%BB%E5%88%9710-hold-shift-and-check-checkboxes-%E9%81%B8%E5%96%AE%E5%A4%9A%E9%87%8D%E9%81%B8%E5%8F%96%E5%8A%9F%E8%83%BD/) [網友解法](https://shunnien.github.io/2017/12/27/Javascript30days-10/) --- * KeyboardEvent.shiftKey [MDN](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/shiftKey)
{"metaMigratedAt":"2023-06-16T03:37:03.809Z","metaMigratedFrom":"Content","title":"JS30 Day10","breaks":true,"contributors":"[{\"id\":\"e66977c1-c757-4957-8123-cd26044bbbba\",\"add\":3643,\"del\":631}]"}
    547 views