第六天的實作是練習Javascript非同步執行。
首先利用fetch
物件建立接收資料的接口,fetch
物件是類似於XMLHttpRequest
,屬於Ajax
的應用。
Ajax
是指非同步的JavaScript與XML技術
,其意義是當網頁與伺服器進行資料溝通時,畫面不必更新。
fetch
的回應reponse
是屬於promise
,可使用then()
來取得目標值。
fetch(endpoint)
.then(blob => blob.json())
.then(data => cities.push(...data));
而接收到資料格式如下。
[
{
city: "New York",
growth_from_2000_to_2013: "4.8%",
latitude: 40.7127837,
longitude: -74.0059413,
population: "8405837",
rank: "1",
state: "New York"
},
。
。
。
]
接下來利用正規表示式物件RegExp
來尋找符合的字元與字串。
var re = /ab+c/;
var re = new RegExp("ab+c");
// 上列為正規表達式
const regex = new RegExp(word, 'gi');
// word是輸入值。
// g是全部檢查
// i是不分大小的檢查
接下來利用String.prototype.match(regexp)
來取的符合的回傳值,本次練習是對資料中的city
和state
進行配對。
取得回傳值透過.map()
將每一筆資料轉換成ul
的子元素。
之後在input
建立兩個change
和keyup
事件,change
是指input
元素的內容被改變時就觸發事件。keyup
是指input
元素當放開鍵盤就觸發事件。
過來是將篩選值特別標記出來,再取得經過正規表達式配對的資料之後,利用String.prototype.replace(regexp, value)
來取代配對值,將配對值加入span
,讓span
加入Css的class。
const cityName = place.city.replace(regex, `<span class="h2">${value}</span>`)
就可以做到將配對值顯示出來。
<form class="search-form">
<input type="text" class="search" placeholder="City or State">
<ul class="suggestions">
<li>Filter for a city</li>
<li>or a state</li>
</ul>
</form>
清單列表的Element
promise
The Promise object represents the eventual completion (or failure) of an asynchronous operation, and its resulting value. [1]
fetch
Fetch API 提供了一個介面去獲取資源 (包含跨網路的資源)。這似乎有點像我們所熟悉的 XMLHttpRequest ,但這個新的 API 提供了更強更彈性的特點。
The Fetch API provides an interface for fetching resources (including across the network). It will seem familiar to anyone who has used XMLHttpRequest, but the new API provides a more powerful and flexible feature set.
fetch(endpoint)
.then(res =>{
return res.json()
})
.then(data => console.log(data))
正規表達式
正規表達式是被用來匹配字串中字元組合的模式。在 JavaScript 中,正規表達式也是物件,這些模式在 RegExp 的 exec 和 test 方法中,以及 String 的 match、replace、search、split 等方法中被運用。
String.prototype.replace()
replace() 方法會傳回一個新字串,此新字串是透過將原字串與 pattern 比對,以 replacement 取代吻合處而生成。
String.prototype.match()
match() 方法會傳回正規表達式配對的Array。
str.match(regexp);
var a = ['Wind', 'Rain', 'Fire'];
a.join(); // 'Wind,Rain,Fire'
a.join('-'); // 'Wind-Rain-Fire'
p:nth-child(2) {
background: red;
}
p:nth-of-type(4n) {
color: lime;
}
p:last-child {
color: lime;
}
p:last-of-type {
color: lime;
}
p:first-child {
color: lime;
}
p:first-of-type {
color: red;
}
promise
, fetch
, RegExp