【JS】發送AJAX請求

AJAX

【JS】發送AJAX請求

AJAX


動態載入資料(AJAX)

  • 使用 new XMLHttpRequest 原型,來向伺服器發送請求。

  • 不用重新整理網頁就能取得資料庫回傳的資料,例如 :

    • 加入購物車,顯示商品數量。

    • 註冊帳號時,顯示該帳號是否已使用。

    • 搜尋時,顯示的關鍵提示字。

  • 載入的資料必須支援跨網域(CORS)。


跨域資源共享(Cross-Origin Resource Sharing)

  • 簡稱CORS。

  • 若發送請求時出現 Access-Control-Allow-Origin 錯誤,代表不支援。

  • 可以使用 test-cors.org 網站,顯示http狀態碼。

    • .status:200,資料載入成功,用戶端要求成功。

    • .status:404,資料載入失敗,找不到。


.open(“方法” , “網址” , frue/false)。

  • 向伺服器發送請求。

  • true(非同步),不等資料載入完就會往下執行。(預設)

  • false(同步),等待資料載入完後才往下執行。

方法 GET POST PUT DELETE
說明 取得資料 傳送資料 覆蓋資料 刪除資料


.setRequestHeader

  • 決定傳送給伺服器的資料格式。

  • .setRequestHeader(“content-type”,“application/x-www-form-urlencoded”),傳送表單格式。

  • .setRequestHeader(“content-type”,“application/json”),傳送JSON格式。


.send

  • 傳送給伺服器"字串"格式的資料。

  • 使用 JSON.stringify() ,將資料轉換成字串。


.onload

  • 執行ajax完成後的動作。


.responseText

  • 可以取得伺服器回傳的"字串"格式的資料。

  • 使用 JSON.parse() ,來解析回傳的資料。


載入資料

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// <-----html----->
p

// <-----js----->
let xhr = new XMLHttpRequest();  //0
xhr.open("GET","https://hexschool.github.io/ajaxHomework/data.json",true);  //1
xhr.send(null);  //2
xhr.onload = function(){  //4
  let data = JSON.parse(xhr.responseText);
  let p = document.querySelector("p");
  p.textContent = data[0].name;
}
// <-----結果----->
//文字<p>顯示  //王小名


.readyState

  • 顯示ajax的狀態。

說明
0 已經建立XMLHttpRequest,但尚未使用.open()
1 已經使用.open()
2 已經使用.send()
3 正在載入資料
4 成功載入資料


傳送表單

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// <-----html----->
form(action="index.html")
  input(type="text" name="account")
  input(type="password" name="password")
  input(type="submit" value="送出")

// <-----結果----->
//帳號輸入  //test123@gmail.com
//密碼輸入  //abc45678
//點擊"按鈕"時,URL最後方出現...
//index.html?account=test123%40gmail.com&password=abc45678

『 ? 』後面接參數 、 『 & 』連接內容


URL編碼

  • 網頁上的URL路徑格式。

URL解碼 URL編碼 URL解碼 URL編碼
空格 %20 @ %40
! %21 + %2b
" %22 - %2d
# %23 / %2f
$ %24 : %3a
% %25 ; %3b
& %26 < %3c
' %27 = %3d
( %28 > %3e
) %29 ? %3f


帳號註冊 + 傳送表單格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// <-----html----->
form
  label 帳號
  input(type="text" name="account")
  br
  label 密碼
  input(type="password" name="password")
  input(type="submit" value="註冊")

// <-----js----->
let account = document.querySelectorAll("input")[0];
let password = document.querySelectorAll("input")[1];
let submit = document.querySelectorAll("input")[2];

submit.addEventListener("click",function(event){
  event.preventDefault();
  let xhr = new XMLHttpRequest();
  //建立XMLHttpRequest來向伺服器發送請求
  xhr.open("POST","https://hexschool-tutorial.herokuapp.com/api/signup");
  //向該網址傳送POST請求
  xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");
  //傳送JSON格式
  let accountVal = account.value;
  let passwordVal = password.value;
  xhr.send(`email=${accountVal}&password=${passwordVal}`);
  //將輸入框裡的值組成物件並轉成"字串"後傳送
  xhr.onload = function(){
    //當ajax執行完成時
    let str = JSON.parse(xhr.responseText);
    //將回傳的"字串"解析
    alert(str.message);
  }
});


帳號登入 + 傳送JSON格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// <-----html----->
form
  label 帳號
  input(type="text" name="account")
  br
  label 密碼
  input(type="password" name="password")
  input(type="submit" value="登入")

// <-----js----->
let account = document.querySelectorAll("input")[0];
let password = document.querySelectorAll("input")[1];
let submit = document.querySelectorAll("input")[2];

submit.addEventListener("click",function(event){
  event.preventDefault();
  let xhr = new XMLHttpRequest();
  //建立XMLHttpRequest來向伺服器發送請求
  xhr.open("POST","https://hexschool-tutorial.herokuapp.com/api/signin");
  //向該網址傳送POST請求
  xhr.setRequestHeader("content-type","application/json");
  //傳送JSON格式
  let accountValue = account.value;
  let passwordValue = password.value;
  let data = {
    email: accountValue,
    password: passwordValue
  }
  xhr.send(JSON.stringify(data));
  //將輸入框裡的值組成物件並轉成"字串"後傳送
  xhr.onload = function(){
    //當ajax執行完成時
    let str = JSON.parse(xhr.responseText);
    //將回傳的"字串"解析
    alert(str.message);
  }
});


其他AJAX載入方法

  • javascript的XMLHttpRequest()方法。

1
2
3
4
5
6
7
8
let url = "https://jsonplaceholder.typicode.com/todos/1";
let xhr = new XMLHttpRequest();
xhr.open("GET",url);
xhr.send(null);
xhr.onload = function(){
  let data = JSON.parse(xhr.responseText);
  console.log(data);
}

  • jQuery的$.ajax()方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/** 方法一 **/
let url = "https://jsonplaceholder.typicode.com/todos/1";
$.ajax({
  url: url,
}).done(function(data){
  console.log(data);
});

/** 方法二 **/
let url = "https://jsonplaceholder.typicode.com/todos/1";
$.ajax({
  url: url, 
  dataType: "json",
  success: function(data){
    console.log(data);
  }
});

  • axios的.get()方法。

1
2
3
4
5
let url = "https://jsonplaceholder.typicode.com/todos/1";
axios.get(url)
  .then((data) => {
    console.log(data.data);
  });

其他相關