---
title: 'JS 入門 - data-* 透過 dataset 讀取自訂資料'
tags: JS, Javascript, dataset
description: 2021/01/26
---
JS 入門 -- data-* 透過 dataset 讀取自訂資料
===
## data-* 自定義屬性名稱及值在 HTML 上
1. 在 HTML 上,自訂屬性可以和特定的資料做綁定,方便在 JavaScript 上做操控。 例如:data-farmer = "John"、data-dog = "3"。
2. -* 字號的地方不能包含**大寫**字母,屬性值則可以是任何的**字串**。
```
data-* = 'value' //*:自行定義名稱
```
## dataset - 撈出所有 data- 開頭屬性的值
使用 dataset 可以撈出在 dom 節點上的所有 data-* 值,並且回傳成一個物件格式。
```
<ul class="list">
<li data-num="0" data-dog="3" class="listli">卡斯伯</li>
</ul>
```
```typescript
var data = document.querySelector('.list li').dataset;
console.log(data); // {num: "0", dog: "3"}
```
如果只想撈出其中一個自訂屬性的值,就要在 .dataset 後面多加自訂屬性名。
```typescript
var dogNum = document.querySelector('.listli').dataset.dog
console.log(dogNum); // 3
```
### 範例
```
<ul class="list">
<li data-num="0" data-dog="3" class="listli">卡斯伯</li>
</ul>
```
```typescript
var el = document.querySelector('.listli');
el.addEventListener('click', checkList, false);
function checkList (e) {
var num = e.target.dataset.num;
var dog = e.target.dataset.dog;
console.log('農夫編號是' + num + ',有' + dog + '隻狗');
// 農夫編號是0,有3隻狗
};
```
<style>
.red {
color: red;
}
</style>
## dataset 、 array 運用
1. 為了避免 li 效率低落,選定父元素 ul 大範圍來監聽
2. <span class="red">使用 e.target 來確認當下點擊的元素是誰</span>
3. return 可回傳數值,或當中斷點
```
<ul class="list"
style="padding:50px;background:#000;color:#fff">
</ul>
```
```typescript
var farms = [
{
farmer: '卡斯伯'
},
{
farmer: '查理'
}
]
var el = document.querySelector('.list');
// 更新農場資料 (塞值去 HTML)
function updateList () {
var len = farms.length;
var str = '';
for (let i = 0; i < len; i++) {
var text = `<li data-num="${i}"> ${farms[i].farmer} </li>`;
str += text;
}
el.innerHTML = str;
};
updateList ();
el.addEventListener('click', checkList, false);
function checkList (e) {
var num = e.target.dataset.num; // e.target 當下點擊的元素是誰
if(e.target.nodeName !== "LI"){return}; // 若點擊非 li , 則中斷程式
console.log('點擊的農夫是' + farms[num].farmer );
};
```
## splice 刪除陣列資料
```
陣列名.splice(要刪除的起始索引值位置, 共刪除幾筆資料);
```
```typescript
var colors = ["black","red","yellow"];
colors.splice(0,2);
console.log(colors); // ["yellow"]
```
承上 "dataset 、 array" 運用的程式碼 ( 點擊名字就刪除 )
```typescript
function checkList (e) {
var num = e.target.dataset.num; // e.target 當下點擊的元素是誰
if(e.target.nodeName !== "LI"){return};
farms.splice(num, 1); // 點擊到的名字即刪除
updateList ();
// 刪除 array 資料後(編號會更動),要再重新渲染一次
};
```
## :memo: 筆記
:::info
**target 的使用時機 :**
「當你要抓下當下點擊元素的詳細資訊時用」。
實際上來說都會看自己想要取得監聽資訊裡的哪個內容而訂,所以有時會從 e 取得、或者從 e.target,再從裡頭的物件觀看想取得的屬性在哪裡。
:::