---
# System prepended metadata

title: 事件監聽設計、搭配 if 流程判斷
tags: [' if', ' forEach', addEventListener]

---

---
title: 事件監聽設計、搭配 if 流程判斷
tags: addEventListener, forEach, if
description:
---

事件監聽設計、搭配 if 流程判斷
---

接續之前的[如何整合 innerHTML 資料](/Q8ugkR87QtyBwlI2KKOQJQ)，現在要的是...

- 針對陣列資料，新增兩個`<buttom>`使用事件監聽`.addEventListener()`，做不同的條件篩選。

**HTML部分**
- 新增`<div>`，增加`class="selectType"`
- `div`內，建立兩個`<buttom>`分別是投幣式、感應支付式，`value`分別是`"投幣"` `"感應支付"`。
![](https://i.imgur.com/VUJTmPR.png =40%x)

```htmlmixed=
<div class="selectType">
  <button type="button" value="投幣">投幣式</button>
  <button type="button" value="感應支付">感應支付式</button>
</div>
<ul class="list"></ul>
```

**JavaScript部分**
- `document.querySelector('.filterType')`選取`<div>`元素賦予給變數`filterType`。

- `.addEventListener()`監聽`<div>`元素的`click`行為，若點擊按鈕以外的區域，依照點擊所在元素位置`e.target.value`回傳的值，是`undefined`。

- 可用條件式`e.target.value === undefined`判斷==點擊到==按鈕以外的區域，`return`中斷監聽函式執行。

- `chargStation.forEach()`，使用`forEach`將陣列`chargStation`內的物件取出。
 
- `{name, type, placeNum} = item`，解構賦值把物件屬性`name`、 `type`、`placeNum`取出。
 
- 每次`chargStation`取出物件資料，條件式把==type屬性資料==跟==點擊所在元素位置`e.target.value`回傳的值==(`type === e.target.value`)做比較。

- 如果為`true`，`forEach()`將==這次==chargStation取出的物件資料，與`<li>`元素組成字串，`+=`賦予給變數`str`。

- `list.innerHTML = str`，把HTML結構字串`str`賦予給HTML`<ul>`元素，成為`<ul>`元素內層的`<li>`結構。 

```javascript=
const filterType = document.querySelector('.filterType');

filterType.addEventListener('click', (e) => {
  if (e.target.value === undefined) return;
  let str = '';
  chargStation.forEach(({ name, type, placeNum } = item) => {
    type === e.target.value ? str += `<li>${name}充電站，付費方式為${type}，共有${placeNum}個充電位置</li>` : str += ``;
  })
  list.innerHTML = str;
})
```

- 最後畫面呈現的是，被`.forEach()`從陣列`chargStation`挑選出來的物件資料。 
![](https://i.imgur.com/xnoknsA.png =60%x)
<br>

### DOM 拉出全域變數進行管理

**連同網頁初始化的程式碼一起看**

- 第24行程式碼，**原先**在函式`init()`作用域內，現在移動到==全域==。
- 移動到全域的**目的**，是要讓監聽按鈕的`click`行為`filterType.addEventListener()`==也能存取到變數`list`==。
```javascript=
const chargStation = [
  {
    name: '豐田',
    type: '投幣',
    placeNum: 10,
  },
  {
    name: '特斯拉',
    type: '感應支付',
    placeNum: 12,
  },
  {
    name: '本田',
    type: '投幣',
    placeNum: 8,
  },
  {
    name: '福特',
    type: '感應支付',
    placeNum: 15,
  },
];

const list = document.querySelector('.list');
const filterType = document.querySelector('.filterType');

function init() {
  let str = '';
  chargStation.forEach(({name, type, placeNum} = item) => {
    str += `<li>${name}充電站，付費方式為${type}式，共有${placeNum}個充電位置</li>`;
  });
  list.innerHTML = str;
};

init();

filterType.addEventListener('click', (e) => {
  if (e.target.value === undefined) return;
  let str = '';
  chargStation.forEach(({ name, type, placeNum } = item) => {
    type === e.target.value ? str += `<li>${name}充電站，付費方式為${type}，共有${placeNum}個充電位置</li>` : str += ``;
  })
  list.innerHTML = str;
})
```