完整解釋
白話:data-* 放元素資料;classList 只加減一個狀態 class,不重寫全部 class。
正式說法:dataset 映射 data-* attributes;classList 提供 DOMTokenList 的 add/remove/toggle/contains。
何時使用:卡片選取、展開狀態與 DOM 上的資料 id。
修改前後:Before:element.className='selected' 遺失 card。After:card 與 is-selected 同時存在。
常見混淆:dataset 值都是字串,不是自動轉成 number/Boolean。
名詞與最小範例
classList 與 dataset Class list and data attributes
- 白話
- data-* 放元素資料;classList 只加減一個狀態 class,不重寫全部 class。
- 正式定義
- dataset 映射 data-* attributes;classList 提供 DOMTokenList 的 add/remove/toggle/contains。
- 何時使用
- 卡片選取、展開狀態與 DOM 上的資料 id。
- 最小範例
- card.dataset.id;card.classList.toggle('is-selected')。
- 驗收證據
- dataId=s2、selected=true、baseClass=true
- 常混淆
- dataset 值都是字串,不是自動轉成 number/Boolean。
Micro Lab|classList 與 dataset
情境:點選卡片後原本布局 class 被 className 覆蓋。
起始狀態:card class 存在,is-selected 不存在。
- 讀 data-id,切換 is-selected 並確認既有 card class 未消失。
- 執行下方操作,觀察獨立的 DOM 與資料狀態。
- 依證據欄位重新驗收。
目前主題:classList 與 dataset
預期:dataId=s2、before=false、after=true、其他 class 保留。
證據:dataId=s2、selected=true、baseClass=true
第一個檢查:先讀 classList.value 與 dataset.id。
重設:移除 is-selected,保留 data-id 與 card。
卡住時
- 症狀:點擊後卡片失去所有原樣式。
可能原因:以 className 覆蓋整個字串。
先檢查:比較操作前後 classList.value。
修正:改用 classList.add/remove/toggle。
本模組官方來源:MDN|Element.classList