iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

JavaScript基礎30天系列 第 26

JS AJAX基礎實作(1) DAY26

  • 分享至 

  • xImage
  •  

今天要來介紹串接政府資料啦~~
首先這裡提供一個版型(有RWD)

CodePen: https://codepen.io/wemyferb/pen/eYzYGBb

API: https://raw.githubusercontent.com/hexschool/KCGTravel/master/datastore_search.json
資料來源: 高雄市政府

首先我們的主要目標是有下拉選單
選擇想要的區域後
畫面會顯示該區域的景點
並且標題也會自動更新成該區域名字

所以我們首先要把所有區域名字(不重複)塞到select裡面
先綁定DOM (起手勢啦~~)

//DOM
let list = document.querySelector('.list');
let selectMenu = document.querySelector('.selectMenu');
let title = document.querySelector('.title');

監聽(change事件 )

//監聽
selectMenu.addEventListener('change',updateListSel,false);

不過這時候我們還沒有資料
AJAX 這時候就派上用場了

var xhr = new XMLHttpRequest();
// true : 非同步 不會等資料傳回來 就會讓程式繼續往下跑 等到回傳資料才會自動回傳
//false : 同步 會等資料傳回來 才讓程式繼續往下跑
xhr.open('get','https://raw.githubusercontent.com/hexschool/KCGTravel/master/datastore_search.json',true)
xhr.send();
xhr.onload = function(){
    data = JSON.parse(xhr.responseText).result.records;
    selectOption();
    updateList(data);
}

注意:
這裡我們撈的時候就順便執行selectOption();
這樣撈完下拉選單就出現了

function selectOption(){
    let zoneName = new Set();
    //沒有重複 就執行前面
    let zoneList = data.filter(item => !zoneName.has(item.Zone) ? zoneName.add(item.Zone):false);
    for(let i = 0; i < zoneList.length; i++){
        let addOption = document.createElement('option');
        addOption.textContent = zoneList[i].Zone;
        addOption.setAttribute = ('value', zoneList[i].Zone)
        selectMenu.appendChild(addOption);
    }
}

這裡使用了 JS ES6 set 來過濾重複資料
可參考此篇文章
https://guahsu.io/2017/06/JavaScript-Duplicates-Array/?fbclid=IwAR3xTJuNXTEwWoIxf0wefyWYQAODlqL_IjU5U6c1MVqGu_i4k6C2_Zpm-d0

而filter可參考此篇文章
https://wcc723.github.io/javascript/2017/06/29/es6-native-array/

接著我們採用 createElement
別忘記!! 還要用 append塞到你想插入的位置
這樣下拉選單就出現啦~~

CodePen: https://codepen.io/wemyferb/pen/OJXJxBQ
那今天就介紹到這裡啦
明天將介紹 change 事件
有任何問題 或 內容有誤 都可以回覆我唷!!


上一篇
JS BMI 基礎介紹(3) DAY25
下一篇
JS AJAX基礎實作(2) DAY27
系列文
JavaScript基礎30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言