iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
0
自我挑戰組

JS30自我學習筆記系列 第 11

第十堂 - Hold Shift and Check Checkboxes

  • 分享至 

  • xImage
  •  

今天的實作雖然看似簡單,但若要自己獨立完成,並寫得像課程那樣簡潔有力,這其中的邏輯是要花點時間思考的。這堂課所要做的是一個能夠同時勾選多項的清單,若勾選其中一個選項,接著按住shift鍵,再勾選下一個選項,這時上一個選項到這一個選項之間的所有選項都會被打勾,就像Gmail要選擇多封信的操作一樣。實作範例如下:

邏輯流程

  1. 取得包含所有input的Array
  2. 監聽input的click事件
  3. click即觸發勾選的函式

課程重點

  1. 其實這個實作的code非常簡短,如下

    const checkboxes = document.querySelectorAll(".inbox input");
    let lastChecked;
    let inBetween = false;
    checkboxes.forEach(checkbox => checkbox.addEventListener("click", handleCheck));
    
    function handleCheck(e) {
        if(e.shiftKey && this.checked){
          checkboxes.forEach(checkbox => {
            if(checkbox === this || checkbox === lastChecked)
              inBetween = !inBetween;
            if(inBetween)
              checkbox.checked = true;
          })
        }
        lastChecked = this;
    }
    

    首先取得所有input elements,當input被click時觸發handleCheck函式。無論有沒有按shift鍵來勾選,都會把這個被click的input指定為lastChecked。

    而如果是按著shift鍵且是勾選(不是取消勾選)的話,就會把所有input以迴圈的方式查看一遍,一個一個看input是this(這次點選的)還是lastChecked(上次點選的)。所以只會有兩個input能進入這個if,就是這次點的跟上次點的兩個input,也就是當你在多選項目時的起點跟終點。

    inBetween是個Flag標記,在遇到this或lastChecked時會變成true,直到遇到下一個lastChecked或this,才會變回false。而這之間所經歷的其他input的inBetween都會維持在true,所以會被勾選。


上一篇
第九堂 - Dev Tools Domination
下一篇
第十一堂 - Custom Video Player
系列文
JS30自我學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言