前言
本文為「JavaScript 30」教學影片的學習筆記。
目標
使用 Local Storage 儲存選單內容。
筆記
取得相關元素。
1 2 3 4 5 6
| const addItems = document.querySelector('.add-items');
const itemsList = document.querySelector('.plates');
const items = JSON.parse(localStorage.getItem('items')) || [];
|
新增一個 addItem()
方法,以新增項目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function addItem(e) { e.preventDefault(); const text = (this.querySelector('[name=item]')).value; const item = { text: text, done: false }; items.push(item); populateList(items, itemsList); localStorage.setItem('items', JSON.stringify(items)); this.reset(); }
|
新增一個 populateList()
方法,以改寫選單。
1 2 3 4 5 6 7 8 9 10 11
| function populateList(plates = [], platesList) { platesList.innerHTML = plates.map((plate, i) => { return ` <li> <input type="checkbox" data-index=${i} id="item${i}" ${plate.done ? 'checked' : ''} /> <label for="item${i}">${plate.text}</label> </li> ` }).join(''); }
|
map()
方法會建立一個新的陣列,其內容為原陣列的每一個元素經由回呼函式運算後所回傳的結果之集合。
join()
方法會將陣列(或類陣列物件)中所有的元素連接、合併成一個字串,並回傳此字串。
新增一個 toggleDone()
方法,以切換核取方塊狀態。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function toggleDone(e) { if (!e.target.matches('input')) return; const el = e.target; const index = el.dataset.index; items[index].done = !items[index].done; localStorage.setItem('items', JSON.stringify(items)); populateList(items, itemsList); }
|
監聽表單元素,如果發生 submit
事件,就觸發 addItem()
方法。
1
| addItems.addEventListener('submit', addItem);
|
監聽選單元素,如果發生 click
事件,就觸發 toggleDone()
方法。
1
| itemsList.addEventListener('click', toggleDone);
|
不管有無動作,將 Local Storage 的 items
陣列改寫為選單,並重寫選單元素。
1
| populateList(items, itemsList);
|