---
# System prepended metadata

title: 4. dataset、array 運用
tags: [JavaScript - localStorage]

---

# 4. dataset、array 運用

### HTML:

- 在 HTML 增加一個 ul 標籤，class 取名為: list

  並在標籤直接注入屬性 style
  
  周圍推擠 20px、背景顏色:黑、文字顏色:白。

```
<ul style="padding: 20px; background: #000; color:aliceblue;" class="list">

</ul>
```

### JavaScript 寫法:

- 開始之前，先看完整程式碼，我們再來逐步解析：

```
var country = [
    {
        farmer: '約翰',
    },
    {
        farmer: '查理',
    },
];

var el = document.querySelector('.list');

// 以JS 來動態產生 li 標籤 並運動 for-array & data-* 的方式：


function updateList() {
    var total = country.length;
    var str = '';  // 組字串用 BJ4
    for (var i = 0; i < total; i++) {
        str += '<li data-num="' + i + '">' + country[i].farmer + '</li>';
    }
    el.innerHTML = str;
}

updateList();


// 監聽事件:

function checkName(e) {
    var checkTag = e.target.nodeName;
    if (checkTag !== "LI") { return };
    var str = e.target.dataset;
    alert('我們選擇了：' + country[str].farmer);
}

el.addEventListener('click', checkName, false);



```

### 這邊共有幾個重點段落:


1. **country** - 陣列資料

2. **updateList()**

3. **checkNameList()**


- 資料陣列 & 綁定 .list:

```
var country = [
    {
        farmer: '約翰',
    },
    {
        farmer: '查理',
    },
];

// list DOM
var el = document.querySelector('.list');
```



- 為什麼我們會需要先寫 // **updateList()** ?

- 原因是因為: 這個範例我們需要先有 li 標籤的產生我們才能透過後面 click 事件來完成功能，所以我們會先寫好一串資料，最後再透過 innerHTML 的方式來載入


- 並且組字串時寫入: `data-num="' + i + '"`，使得 i 根據迴圈內容資料長度來跑出相對應的筆數:

  預期會顯示出兩位農夫的名字:

```
function updateList() {
    var total = country.length;
    var str = '';  // 組字串用 BJ4
    for (var i = 0; i < total; i++) {
        str += '<li data-num="' + i + '">' + country[i].farmer + '</li>';
    }
    el.innerHTML = str;
}

updateList();
```

示意圖:
![](https://i.imgur.com/s0LaSMw.png)


---

- 控制部份， 'click' event，點擊 target.nodeName == "LI"
  才能觸發後續結果，所以這邊會寫入條件

1. 設定變數: e.target.nodeName

2. 設定條件: 是 LI 才會觸發，否則則回傳 return 空值

3. 寫入變數，並且為: e.target.dataset，這個 str 非常重要
 


```
function checkName(e) {
    var checkTag = e.target.nodeName;
    if (checkTag !== "LI") { return };
    var str = e.target.dataset;
    alert('我們選擇了：' + country[str].farmer);
}

el.addEventListener('click', checkName, false);
```

- alert，後面則是撈取 `country[str]` 可以看到我們這邊抓 data-num 的值來抓取農夫資料，故這就是為何前面需要透過 updateList 來產生 ul>li 

- 再透過產生的資料資訊--`updateList()`，

- 並且 li 綁定的 data-編號，在監聽事件內寫入區域變數
  就可以和 country 資料做連結。
  


###### tags: `JavaScript - localStorage`




  