JS30 day15 - JS30 day15 Local Storage and Event delegation
作業內容
今天的內容在講說如何使用 Local Storage 還有如果要指定監聽的對象是動態變化的應該怎麼處理,網頁的部分是透過一個菜單來實作
學到什麼
-
JS
preventDefault()
參考資料:https://ithelp.ithome.com.tw/articles/10198999- 使用屬性來當作選擇器
this.querySelector('[name=item]')
1
<input type="text" name="item" placeholder="Item Name" required="">
- 使用
this.reset();
重置表單 - 在標籤裡面動態插入
<li>
標籤:
1
2
3
4
5
6
7
8
9function populateList(plates = [], plateList){
plateList.innerHTML = plates.map((plate, i) => {
return `
<li>
<label for="">${plate.text}</label>
</li>
`
}).join("");
}- 在 html 裡面,如果有一個 checkbox 的 input
以下三種狀況都還是會讓他呈現 checked:true 的狀態
1
2
3<input type="checkbox" checked>
<input type="checkbox" checked="qq">
<input type="checkbox" checked=false>所以如果要根據屬性不同做出不同的 checked 狀態,只能加入 checked 或是空白字元
1
2//寫在 js 裡面
<input type="checkbox" data-index=${i} id="item${i}" ${plate.done ? 'checked' : ''}>localStorage
是個可以把資料儲存在瀏覽器的空間,不過要記得只能存字串
1
2
3localStorage.setItem("items", items) //第一個參數是 key 的名字,第二個參數是要存的東西
localStorage.getItem()
localStorage.removeItem()而一開始的 items 就可以改為先試著從 localStorage 抓資料,沒有的話才給空陣列
1
const items = JSON.parse(localStorage.getItem('items')) || [];
- 我們要去捕捉每一個新長出來的 list 去監聽事件,對這種動態元素,最好的方式是去用他的父元素監聽,利用冒泡機制,所以父元素也會監聽到
1
2
3
4function toggleDone(e){
console.log(e.target)
}
itemsList.addEventListener('click', toggleDone)但這樣會產生另一個問題,從 console log 可以看到每次都會出現兩個事件,所以必須再去濾除條件
1
2
3function toggleDone(e){
if(!e.target.matches('input')) return;
}
參考資料:
https://github.com/wesbos/JavaScript30
code 內容:
HTML:
1 | <div class="wrapper"> |
CSS:
1 | html { |
JS:
1 | const addItems = document.querySelector('.add-items'); |