iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 30
0
自我挑戰組

每天一份前端小作品系列 第 30

【Day30】綜合練習:台鐵即時時刻表!

  • 分享至 

  • xImage
  •  

本日作品:
https://codepen.io/linchinhsuan/pen/KKMpBZb

重點摘要:

var xhr = new XMLHttpRequest();
xhr.open('get','https://ptx.transportdata.tw/MOTC/v3/Rail/TRA/DailyTrainTimetable/Today?$format=JSON',true);
xhr.send(null);
xhr.onload = function(){.......}

使用XMLHttpRequest()語法抓到台鐵當天的所有車次資料。

document.getElementById("btn").addEventListener("click",function(){
        var departure;
        var option = document.querySelectorAll(".area option");
        for(let i=0;i<option.length;i++){
            if(option[i].selected){
                departure = option[i].value;
            }
        }
        var arrive;
        var option2 = document.querySelectorAll(".area2 option");
        for(let i=0;i<option2.length;i++){
            if(option2[i].selected){
                arrive = option2[i].value;
            }
        }
        search(departure,arrive);
    }
    ,false);

在查詢按鈕上綁定點擊事件,當點擊時會跑for迴圈,逐筆比對每個option,然後將被選到的那個(例如基隆),賦值到變數departure和arrive上面。最後,則是將兩個變數帶入search()函式,以這兩個車站為起訖站去查詢班次。

for(var a=0;a<dataLen;a++){
    var willStop = []; //本班車會到的站
    var list = []; //用一個陣列儲存物件(物件為{station: "新竹", time: "11:37"}.......)
    var len = data[a].StopTimes.length;
    for(let i=0;i<len;i++){
        var train = {};
        willStop.push(data[a].StopTimes[i].StationName.Zh_tw);
        train.station = data[a].StopTimes[i].StationName.Zh_tw;
        train.time = data[a].StopTimes[i].DepartureTime;
        list.push(train);}

用 for迴圈,跑今日台鐵車次資料中的每一筆資料,每一筆資料代表一班車。然後用一個變數willStop儲存本班車會到達的站。

var thisTrain = {}; //紀錄車種車號起訖時間等資料
if(willStop.includes(departure) && willStop.includes(arrive)){
      var stationNum1;//抵達ab站時個給予一個值
      var stationNum2;
      for(let i=0;i<willStop.length;i++){
      if(willStop[i] == departure){
          stationNum1 = i;
      }else if(willStop[i] == arrive){
          stationNum2 = i;
      }else{}
}

當willStop裡面有起訖兩站時,將這兩站在willStop陣列中的編號賦值到變數上。

//當b>a時則符合使用者起訖站需求
if(stationNum2 > stationNum1){
//寫入起訖時間
for(let i=0;i<list.length;i++){
      if(list[i].station == departure){
          thisTrain.time1 = list[i].time;
      }else if(list[i].station == arrive){
          thisTrain.time2 = list[i].time;
      }else{}
}

如果一班車開的路線是台北>桃園,那台北在陣列中的編號就會較小,反之,則代表他雖然有通過台北桃園兩站,但卻是從桃園開往台北的火車,不符合使用者想要的結果。所以透過這個判斷,就可以過濾出使用者真正要得到的班次,並寫入變數thisTrain中。

if(JSON.stringify(thisTrain) != "{}"){
    myTrain.push(thisTrain);
}

因為是是跑for迴圈,每一次代表一班車,當這班車不符合使用者的需要的時候,最後thisTrain就會是空的,所以我們額外用一個變數myTrain把所有不是空的的thisTrain放進去。

myTrain.sort((a, b) => a.time1.localeCompare(b.time1)); 

此時雖然得到了所有a站開往b站的車次資料,但順序仍是混亂的,所以這裡使用sort()來進行陣列的重新排列(以出發時間為排列依據)。

for(let i=0;i<myTrainLen;i++){
     if(myTrain[i].time1 > thisTime){
          var li = document.createElement("li");
          li.innerHTML = '<div class="left"><span class="material-icons ' + myTrain[i].color + '">train</span>' + '<p>' + myTrain[i].TrainTypeName + '  ' + myTrain[i].TrainNo + '</p></div><div class="right"><p>'+ myTrain[i].time1 + '</p>' + '<span class="material-icons">double_arrow</span>' + '<p>'+ myTrain[i].time2 + '</p></div>';
          trainList.appendChild(li);
     }
}

最後跑是跟現在時間做比對,當出發時間>現在時間(代表這班車今天還沒開走),就組字串最後用innerHTML()寫到ul裡面成為一個li,就大功告成了。

---

本日結語:
今天是三十天!
今天做得是台鐵即時時刻表,是一個透過AJAX即時顯示查詢結果的台鐵時刻表網站。也是本次鐵人賽我最後一個作品,對於現在的我來說真的是竭盡全力才能完成的作品,如有寫錯之處麻煩各路高手指教><


上一篇
【Day29】綜合練習:台鐵即時時刻表(1/2)
系列文
每天一份前端小作品30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言