HTTP/存儲/Ajax

前后端數(shù)據(jù)交互與HTTP協(xié)議
===================================前后端通信====================================
1、前后端通信是什么
前端和后端數(shù)據(jù)交互的過程
瀏覽器和服務器之間數(shù)據(jù)交
2跋涣、前后端通信的過程
前后端的通信是在‘請求-響應’中完成的
3、概念解釋
前端:瀏覽器端
客戶端:只要能和服務器通信的就叫 客戶端
后端:服務器端
4搔弄、使用瀏覽器訪問網(wǎng)頁
在瀏覽器地址欄輸入網(wǎng)址,按下回車
5丰滑、HTML 的標簽
瀏覽器在解析 HTML 標簽的時候顾犹,遇到一些特殊的標簽,會再次向服務器發(fā)送請求
link/img/script/iframe
6吨枉、還有一些標簽蹦渣,瀏覽器解析的時候,不會向服務器發(fā)送請求貌亭,但是用戶可以使用他們向服務器發(fā)送請求
a/form
7柬唯、Ajax 和 Fetch

===============================初識HTTP=======================================

1、HTTP 是什么
HyperText Transfer Protocol
超文本傳輸協(xié)議
HTML:超文本標記語言
超文本:原先一個個單一的文本圃庭,通過超鏈接將其聯(lián)系起來锄奢。由原先的單一的文本變成了可無限延伸、擴展的超級文本剧腻、立體文本
HTML拘央、JS、CSS书在、圖片灰伟、字體、音頻儒旬、視頻等等文件栏账,都是通過 HTTP(超文本傳輸協(xié)議) 在服務器和瀏覽器之間傳輸
每一次前后端通信,前端需要主動向后端發(fā)出請求栈源,后端接收到前端的請求后挡爵,可以給出響應
HTTP 是一個請求-

2氧敢、HTTP 報文是什么
瀏覽器向服務器發(fā)送請求時罩锐,請求本身就是信息灸促,叫請求報文
服務器向瀏覽器發(fā)送響應時傳輸?shù)男畔⑻谖眩许憫獔笪?/p>

3、HTTP 報文格式
請求
請求頭:起始行+首部
請求體
GET 請求炒事,沒有請求體方咆,數(shù)據(jù)通過請求頭攜帶
POST 請求浸船,有請求體迄埃,數(shù)據(jù)通過請求體攜帶
響應
響應頭:起始行+首部
響應體
4男杈、常用的 HTTP 方法
瀏覽器發(fā)送請求時采用的方法,和響應無關

  GET调俘、POST伶棒、PUT、DELETE

  用來定義對于資源采取什么樣的操作的彩库,有各自的語義

5肤无、HTTP 方法的語義
GET 獲取數(shù)據(jù)
獲取資源(文件)

  POST 創(chuàng)建數(shù)據(jù)
  注冊

  PUT 更新數(shù)據(jù)
  修改個人信息,修改密碼

  DELETE 刪除數(shù)據(jù)
  刪除一條評論

  增刪改查

  這些方法雖然有各自的語義骇钦,但是并不是強制性的

6宛渐、RESTful 接口設計
一種接口設計風格,充分利用 HTTP 方法的語義

  通過用戶 ID 獲取個人信息眯搭,使用 GET 方法
  https://www.imooc.com/api/http/getUser?id=1

  GET
  https://www.imooc.com/api/http/user?id=1

  注冊新用戶窥翩,使用 POST 方法
  https://www.imooc.com/api/http/addUser

  POST
  https://www.imooc.com/api/http/user

  修改一個用戶,使用 POST 方法
  https://www.imooc.com/api/http/modifyUser

  PUT
  https://www.imooc.com/api/http/user

  刪除一個用戶鳞仙,使用 POST 方法
  https://www.imooc.com/api/http/deleteUser

  DELETE
  https://www.imooc.com/api/http/user

7寇蚊、GET和POS
語義
GET:獲取數(shù)據(jù)
POST:創(chuàng)建數(shù)據(jù)

8、發(fā)送數(shù)據(jù)
GET 通過地址在請求頭中攜帶數(shù)據(jù)
能攜帶的數(shù)據(jù)量和地址的長度有關系棍好,一般最多就幾K

  POST 既可以通過地址在請求頭中攜帶數(shù)據(jù)仗岸,也可以通過請求體攜帶數(shù)據(jù)
  能攜帶的數(shù)據(jù)量理論上是無限的

  攜帶少量數(shù)據(jù),可以使用 GET 請求借笙,大量的數(shù)據(jù)可以使用 POST 請求

9扒怖、緩存
GET 可以被緩存,POST 不會被緩存

10业稼、安全性
GET 和 POST 都不安全

  發(fā)送密碼或其他敏感信息時不要使用 GET盗痒,主要是避免直接被他人窺屏或通過歷史記錄找到你的密碼

11、HTTP 狀態(tài)碼是什么
定義服務器對請求的處理結果低散,是服務器返回的

12俯邓、HTTP 狀態(tài)碼的語義
100~199 消息:代表請求已被接受,需要繼續(xù)處理
websocket

  200~299 成功
  200

  300~399 重定向
  http://www.imooc.com/
  https://www.imooc.com/

  301 Moved Permanently
  302 Move Temporarily
  304 Not Modifie

  400~499 請求錯誤
  404 Not Found

  500~599 服務器錯誤
  500 Internal Server Error

===============================本地存儲=================================
1谦纱、Cookie 是什么
Cookie 全稱 HTTP Cookie看成,簡稱 Cookie
是瀏覽器存儲數(shù)據(jù)的一種方式
因為存儲在用戶本地,而不是存儲在服務器上跨嘉,是本地存儲
一般會自動隨著瀏覽器每次請求發(fā)送到服務器端

2川慌、Cookie 有什么用
利用 Cookie 跟蹤統(tǒng)計用戶訪問該網(wǎng)站的習慣,比如什么時間訪問祠乃,訪問了哪些頁面梦重,在每個網(wǎng)頁的停留時間等

3、在瀏覽器中操作 Cookie
不要在 Cookie 中保存密碼等敏感信息

4亮瓷、寫入 Cookie
document.cookie = 'username=zs';
document.cookie = 'age=18';
不能一起設置琴拧,只能一個一個設置
document.cookie = 'username=zs; age=18';

5、讀取 Cookie
console.log(document.cookie);
讀取的是一個由名值對構成的字符串嘱支,每個名值對之間由“; ”(一個分號和一個空格)隔開
username=zs; age=18
6蚓胸、Cookie 的名稱(Name)和值(Value)
最重要的兩個屬性挣饥,創(chuàng)建 Cookie 時必須填寫,其它屬性可以使用默認值

  Cookie 的名稱或值如果包含非英文字母沛膳,則寫入時需要使用 encodeURIComponent() 編碼扔枫,讀取時使用 decodeURIComponent() 解碼
  document.cookie = 'username=alex';

  document.cookie = `username=${encodeURIComponent('張三')}`;
  document.cookie = `${encodeURIComponent('用戶名')}=${encodeURIComponent(
    '張三'
  )}`;

  一般名稱使用英文字母,不要用中文锹安,值可以用中文短荐,但是要編碼

7、失效(到期)時間
對于失效的 Cookie叹哭,會被瀏覽器清除
如果沒有設置失效(到期)時間忍宋,這樣的 Cookie 稱為會話 Cookie
它存在內存中,當會話結束风罩,也就是瀏覽器關閉時糠排,Cookie 消失

  document.cookie = 'username=alex';

  想長時間存在,設置 Expires 或 Max-Age
  expires
  值為 Date 類型
  document.cookie = `username=alex; expires=${new Date(
    '2100-1-01 00:00:00'
  )}`;

  max-age
  值為數(shù)字泊交,表示當前時間 + 多少秒后過期乳讥,單位是秒
  document.cookie = 'username=alex; max-age=5';
  document.cookie = `username=alex; max-age=${24 * 3600 * 30}`;

  如果 max-age 的值是 0 或負數(shù),則 Cookie 會被刪除
  document.cookie = 'username=alex';
  document.cookie = 'username=alex; max-age=0';
  document.cookie = 'username=alex; max-age=-1';

8廓俭、Domain 域
Domain 限定了訪問 Cookie 的范圍(不同域名)

  使用 JS 只能讀寫當前域或父域的 Cookie云石,無法讀寫其他域的 Cookie
  document.cookie = 'username=alex; domain=www.imooc.com';
  www.imooc.com m.imooc.com 當前域
  父域:.imooc.com

9、Path 路徑
Path 限定了訪問 Cookie 的范圍(同一個域名下)

  使用 JS 只能讀寫當前路徑和上級路徑的 Cookie研乒,無法讀寫下級路徑的 Cookie
  document.cookie = 'username=alex; path=/course/list';
  document.cookie = 'username=alex; path=/1.Cookie/';
  當 Name汹忠、Domain、Path 這 3 個字段都相同的時候雹熬,才是同一個 Cookie

6宽菜、HttpOnly
設置了 HttpOnly 屬性的 Cookie 不能通過 JS 去訪問

7、Secure 安全標志
Secure 限定了只有在使用了 https 而不是 http 的情況下才可以發(fā)送給服務端
Domain竿报、Path铅乡、Secure 都要滿足條件,還不能過期的 Cookie 才能隨著請求發(fā)送到服務器端
8烈菌、cookie的封裝

// 寫入 Cookie
const set = (name, value, { maxAge, domain, path, secure } = {}) => {
  let cookieText = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;

  if (typeof maxAge === 'number') {
    cookieText += `; max-age=${maxAge}`;
  }

  if (domain) {
    cookieText += `; domain=${domain}`;
  }

  if (path) {
    cookieText += `; path=${path}`;
  }

  if (secure) {
    cookieText += `; secure`;
  }

  document.cookie = cookieText;

  // document.cookie='username=alex; max-age=5; domain='
};

// 通過 name 獲取 cookie 的值
const get = name => {
  name = `${encodeURIComponent(name)}`;

  const cookies = document.cookie.split('; ');

  for (const item of cookies) {
    const [cookieName, cookieValue] = item.split('=');

    if (cookieName === name) {
      return decodeURIComponent(cookieValue);
    }
  }

  return;
};

// 'username=alex; age=18; sex=male'
// ["username=alex", "age=18", "sex=male"]
// ["username","alex"]

// get('用戶名');

// 根據(jù) name阵幸、domain 和 path 刪除 Cookie
const remove = (name, { domain, path } = {}) => {
  set(name, '', { domain, path, maxAge: -1 });
};

export { set, get, remove };

10、cookie的注意事項
1).前后端都可以創(chuàng)建 Cookie

2).Cookie 有數(shù)量限制
  每個域名下的 Cookie 數(shù)量有限
  當超過單個域名限制之后芽世,再設置 Cookie挚赊,瀏覽器就會清除以前設置的 Cookie

3).Cookie 有大小限制
  每個 Cookie 的存儲容量很小,最多只有 4KB 左右

11济瓢、localStorage 是什么
localStorage 也是一種瀏覽器存儲數(shù)據(jù)的方式(本地存儲)荠割,它只是存儲在本地,不會發(fā)送到服務器端
單個域名下的 localStorage 總大小有限制

12旺矾、在瀏覽器中操作 localStorage

13蔑鹦、localStorage 的基本用法
console.log(localStorage);

  // setItem()
  localStorage.setItem('username', 'alex');
  localStorage.setItem('username', 'zs');
  localStorage.setItem('age', 18);
  localStorage.setItem('sex', 'male');

  // length
  // console.log(localStorage.length);

  // getItem()
  // console.log(localStorage.getItem('username'));
  // console.log(localStorage.getItem('age'));

  // // 獲取不存在的返回 null
  // console.log(localStorage.getItem('name'));

  // removeItem()
  // localStorage.removeItem('username');
  // localStorage.removeItem('age');

  // // 刪除不存在的 key夺克,不報錯
  // localStorage.removeItem('name');

  // clear()
  localStorage.clear();

  console.log(localStorage);

14、 localStorage 的注意事項
1)举反、localStorage 的存儲期限
localStorage 是持久化的本地存儲懊直,除非手動清除(比如通過 js 刪除,或者清除瀏覽器緩存)火鼻,否則數(shù)據(jù)是永遠不會過期的

  sessionStorage
  當會話結束(比如關閉瀏覽器)的時候,sessionStorage 中的數(shù)據(jù)會被清空
  sessionStorage.setItem('username', 'alex');
  sessionStorage.getItem('username');
  sessionStorage.removeItem('username');
  sessionStorage.clear();

2)雕崩、localStorage 鍵和值的類型
localStorage 存儲的鍵和值只能是字符串類型
不是字符串類型魁索,也會先轉化成字符串類型再存進去

  localStorage.setItem({}, 18);
  // localStorage.setItem('students', [{},{}]);
  console.log(
    typeof localStorage.getItem('[object Object]'),
    localStorage.getItem('[object Object]')
  );

  console.log({}.toString());

3)、不同域名下能否共用 localStorage
不同的域名是不能共用 localStorage 的

4)盼铁、localStorage 的兼容性
IE7及以下版本不支持 localStorage粗蔚,IE8 開始支持

====================================Ajax和Fetch基礎=============================
1、Ajax 是什么
Ajax 是 Asynchronous JavaScript and XML(異步 JavaScript 和 XML)的簡寫
Ajax 中的異步:可以異步地向服務器發(fā)送請求饶火,在等待響應的過程中鹏控,不會阻塞當前頁面,瀏覽器可以做自己的事情肤寝。直到成功獲取響應后当辐,瀏覽器才開始處理響應數(shù)據(jù)
XML(可擴展標記語言)是前后端數(shù)據(jù)通信時傳輸數(shù)據(jù)的一種格式
XML 現(xiàn)在已經(jīng)不怎么用了,現(xiàn)在比較常用的是 JSON
Ajax 其實就是瀏覽器與服務器之間的一種異步通信方式
使用 Ajax 可以在不重新加載整個頁面的情況下鲤看,對頁面的某部分進行更新
① 慕課網(wǎng)注冊檢測
② 慕課網(wǎng)搜索提示
2缘揪、搭建 Ajax 開發(fā)環(huán)境
Ajax 需要服務器環(huán)境,非服務器環(huán)境下义桂,很多瀏覽器無法正常使用 Ajax
Live Server
windows phpStudy
Mac MAMP
3找筝、Ajax 的使用步驟
1)創(chuàng)建 xhr 對象
2)監(jiān)聽事件,處理響應
3)準備發(fā)送請求
4)發(fā)送請求

4慷吊、使用 Ajax 完成前后端通信

     const url = 'https://www.imooc.com/api/http/search/suggest?words=js';

     const xhr = new XMLHttpRequest();
     xhr.onreadystatechange = () => {
       if (xhr.readyState !== 4) return;

       if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
         console.log(xhr.responseText);
         console.log(typeof xhr.responseText);
       }
     };
     xhr.open('GET', url, true);  
     xhr.send(null);

5袖裕、Get請求
1)、攜帶數(shù)據(jù)
GET 請求不能通過請求體攜帶數(shù)據(jù)溉瓶,但可以通過請求頭攜帶
const url = 'https://www.imooc.com/api/http/search/suggest?words=js&username=alex&age=18';
2)急鳄、數(shù)據(jù)編碼
如果攜帶的數(shù)據(jù)是非英文字母的話,比如說漢字嚷闭,就需要編碼之后再發(fā)送給后端攒岛,不然會造成亂碼問題
可以使用 encodeURIComponent() 編碼
6、POST請求
1)攜帶數(shù)據(jù)
2)POST 請求主要通過請求體攜帶數(shù)據(jù)胞锰,同時也可以通過請求頭攜帶
如果想發(fā)送數(shù)據(jù)灾锯,直接寫在 send() 的參數(shù)位置,一般是字符串
不能直接傳遞對象嗅榕,需要先將對象轉換成字符串的形式
3)數(shù)據(jù)編碼
xhr.send(username=${encodeURIComponent('張三')}&age=18);
7顺饮、 JSON 是什么
Ajax 發(fā)送和接收數(shù)據(jù)的一種格式
8吵聪、為什么需要 JSON
JSON 有 3 種形式,每種形式的寫法都和 JS 中的數(shù)據(jù)類型很像兼雄,可以很輕松的和 JS 中的數(shù)據(jù)類型互相轉換
9吟逝、JSON 的 3 種形式
1)簡單值形式
.json

  JSON 的簡單值形式就對應著 JS 中的基礎數(shù)據(jù)類型
  數(shù)字、字符串赦肋、布爾值块攒、null

  注意事項
  ① JSON 中沒有 undefined 值
  ② JSON 中的字符串必須使用雙引號
  ③ JSON 中是不能注釋的

2)對象形式
  JSON 的對象形式就對應著 JS 中的對象

  注意事項
  JSON 中對象的屬性名必須用雙引號,屬性值如果是字符串也必須用雙引號
  JSON 中只要涉及到字符串佃乘,就必須使用雙引號
  不支持 undefined

3)數(shù)組形式
  JSON 的數(shù)組形式就對應著 JS 中的數(shù)組
  [1, "hi", null]
  注意事項
  數(shù)組中的字符串必須用雙引號
  JSON 中只要涉及到字符串囱井,就必須使用雙引號
  不支持 undefined

10、JSON 的常用方法
1)JSON.parse()
JSON.parse() 可以將 JSON 格式的字符串解析成 JS 中的對應值
一定要是合法的 JSON 字符串趣避,否則會報錯
2)JSON.stringify()
JSON.stringify() 可以將 JS 的基本數(shù)據(jù)類型庞呕、對象或者數(shù)組轉換成 JSON 格式的字符串
11、使用 JSON.parse() 和 JSON.stringify() 封裝 localStorage

const storage = window.localStorage;

// 設置
const set = (key, value) => {
  // {
  //   username: 'alex'
  // }
  storage.setItem(key, JSON.stringify(value));
};

// 獲取
const get = key => {
  // 'alex'
  // {
  //   "username": "alex"
  // }
  return JSON.parse(storage.getItem(key));
};

// 刪除
const remove = key => {
  storage.removeItem(key);
};

// 清空
const clear = () => {
  storage.clear();
};

export { set, get, remove, clear };

12程帕、跨域是什么
向一個域發(fā)送請求住练,如果要請求的域和當前域是不同域,就叫跨域
不同域之間的請求愁拭,就是跨域請求
13讲逛、什么是不同域,什么是同域
協(xié)議敛苇、域名妆绞、端口號,任何一個不一樣枫攀,就是不同域
與路徑無關括饶,路徑一不一樣無所謂
14、.跨域請求為什么會被阻止
阻止跨域請求来涨,其實是瀏覽器本身的一種安全策略--同源策略
其他客戶端或者服務器都不存在跨域被阻止的問題

15图焰、.跨域解決方案
① CORS 跨域資源共享
② JSONP

  優(yōu)先使用 CORS 跨域資源共享,如果瀏覽器不支持 CORS 的話蹦掐,再使用 JSONP

16技羔、JSONP 的原理
script 標簽跨域不會被瀏覽器阻止
JSONP 主要就是利用 script 標簽,加載跨域文件

17卧抗、使用 JSONP 實現(xiàn)跨域
服務器端準備好 JSONP 接口
https://www.imooc.com/api/http/jsonp?callback=handleResponse

const script = document.createElement('script');
    script.src =
      'https://www.imooc.com/api/http/jsonp?callback=handleResponse';
    document.body.appendChild(script);

    // 聲明函數(shù)
    const handleResponse = data => {
      console.log(data);
    };

18藤滥、XHR 的屬性

1.responseType 和 response 屬性
     const url = 'https://www.imooc.com/api/http/search/suggest?words=js';
     const xhr = new XMLHttpRequest();

     xhr.onreadystatechange = () => {
       if (xhr.readyState != 4) return;

       if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
         // 文本形式的響應內容
         // responseText 只能在沒有設置 responseType 或者 responseType = '' 或 'text' 的時候才能使用
         // console.log('responseText:', xhr.responseText);

         // 可以用來替代 responseText
         console.log('response:', xhr.response);
         // console.log(JSON.parse(xhr.responseText));
       }
     };
     xhr.open('GET', url, true);

     // xhr.responseType = '';
     // xhr.responseType = 'text';
     xhr.responseType = 'json';

     xhr.send(null);

     IE6~9 不支持,IE10 開始支持

     2.timeout 屬性
     設置請求的超時時間(單位 ms)
     const url = 'https://www.imooc.com/api/http/search/suggest?words=js';
     const xhr = new XMLHttpRequest();

     xhr.onreadystatechange = () => {
       if (xhr.readyState != 4) return;

       if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
         console.log(xhr.response);
       }
     };

     xhr.open('GET', url, true);

     xhr.timeout = 10000;

     xhr.send(null);

     IE6~7 不支持社裆,IE8 開始支持

     3.withCredentials 屬性
     指定使用 Ajax 發(fā)送請求時是否攜帶 Cookie

     使用 Ajax 發(fā)送請求拙绊,默認情況下,同域時,會攜帶 Cookie标沪;跨域時榄攀,不會
     xhr.withCredentials = true;
     最終能否成功跨域攜帶 Cookie,還要看服務器同不同意

     const url = 'https://www.imooc.com/api/http/search/suggest?words=js';
     // const url = './index.html';

     const xhr = new XMLHttpRequest();

     xhr.onreadystatechange = () => {
       if (xhr.readyState != 4) return;

       if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
         console.log(xhr.response);
       }
     };

     xhr.open('GET', url, true);

     xhr.withCredentials = true;

     xhr.send(null);

     IE6~9 不支持金句,IE10 開始支持

19檩赢、XHR 的方法

// 1.abort()
      // 終止當前請求
      // 一般配合 abort 事件一起使用
      // const url = 'https://www.imooc.com/api/http/search/suggest?words=js';

      // const xhr = new XMLHttpRequest();

      // xhr.onreadystatechange = () => {
      //   if (xhr.readyState != 4) return;

      //   if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
      //     console.log(xhr.response);
      //   }
      // };

      // xhr.open('GET', url, true);

      // xhr.send(null);

      // xhr.abort();

      // 2.setRequestHeader()
      // 可以設置請求頭信息
      // xhr.setRequestHeader(頭部字段的名稱, 頭部字段的值);
      // const url = 'https://www.imooc.com/api/http/search/suggest?words=js';
      const url = 'https://www.imooc.com/api/http/json/search/suggest?words=js';

      const xhr = new XMLHttpRequest();

      xhr.onreadystatechange = () => {
        if (xhr.readyState != 4) return;

        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
          console.log(xhr.response);
        }
      };
      xhr.open('POST', url, true);

      // 請求頭中的 Content-Type 字段用來告訴服務器,瀏覽器發(fā)送的數(shù)據(jù)是什么格式的
      // xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      xhr.setRequestHeader('Content-Type', 'application/json');

      // xhr.send(null);
      // xhr.send('username=alex&age=18');
      xhr.send(
        JSON.stringify({
          username: 'alex'
        })
      );

20违寞、XHR 的事件

 // 1.load 事件
      // 響應數(shù)據(jù)可用時觸發(fā)
      // const url = 'https://www.imooc.com/api/http/search/suggest?words=js';
      // const xhr = new XMLHttpRequest();

      // // xhr.onload = () => {
      // //   if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
      // //     console.log(xhr.response);
      // //   }
      // // };
      // xhr.addEventListener(
      //   'load',
      //   () => {
      //     if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
      //       console.log(xhr.response);
      //     }
      //   },
      //   false
      // );

      // xhr.open('GET', url, true);

      // xhr.send(null);

      // IE6~8 不支持 load 事件

      // 2.error 事件
      // 請求發(fā)生錯誤時觸發(fā)

      // const url = 'https://www.imooc.com/api/http/search/suggest?words=js';
      // const url = 'https://www.iimooc.com/api/http/search/suggest?words=js';
      // const xhr = new XMLHttpRequest();

      // xhr.addEventListener(
      //   'load',
      //   () => {
      //     if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
      //       console.log(xhr.response);
      //     }
      //   },
      //   false
      // );
      // xhr.addEventListener(
      //   'error',
      //   () => {
      //     console.log('error');
      //   },
      //   false
      // );

      // xhr.open('GET', url, true);

      // xhr.send(null);

      // IE10 開始支持

      // 3.abort 事件
      // 調用 abort() 終止請求時觸發(fā)
      // const url = 'https://www.imooc.com/api/http/search/suggest?words=js';

      // const xhr = new XMLHttpRequest();

      // xhr.addEventListener(
      //   'load',
      //   () => {
      //     if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
      //       console.log(xhr.response);
      //     }
      //   },
      //   false
      // );
      // xhr.addEventListener(
      //   'abort',
      //   () => {
      //     console.log('abort');
      //   },
      //   false
      // );

      // xhr.open('GET', url, true);

      // xhr.send(null);

      // xhr.abort();

      // IE10 開始支持

      // 4.timeout 事件
      // 請求超時后觸發(fā)
      const url = 'https://www.imooc.com/api/http/search/suggest?words=js';

      const xhr = new XMLHttpRequest();

      xhr.addEventListener(
        'load',
        () => {
          if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
            console.log(xhr.response);
          }
        },
        false
      );
      xhr.addEventListener(
        'timeout',
        () => {
          console.log('timeout');
        },
        false
      );

      xhr.open('GET', url, true);

      xhr.timeout = 10;

      xhr.send(null);

21贞瞒、axios
axios 是什么
axios 是一個基于 Promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中
第三方 Ajax 庫

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末趁曼,一起剝皮案震驚了整個濱河市憔狞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彰阴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拍冠,死亡現(xiàn)場離奇詭異尿这,居然都是意外死亡,警方通過查閱死者的電腦和手機庆杜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門射众,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晃财,你說我怎么就攤上這事叨橱。” “怎么了断盛?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵罗洗,是天一觀的道長。 經(jīng)常有香客問我钢猛,道長伙菜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任命迈,我火速辦了婚禮贩绕,結果婚禮上,老公的妹妹穿的比我還像新娘壶愤。我一直安慰自己淑倾,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布征椒。 她就那樣靜靜地躺著娇哆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迂尝,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天脱茉,我揣著相機與錄音,去河邊找鬼垄开。 笑死琴许,一個胖子當著我的面吹牛,可吹牛的內容都是我干的溉躲。 我是一名探鬼主播榜田,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锻梳!你這毒婦竟也來了箭券?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤疑枯,失蹤者是張志新(化名)和其女友劉穎辩块,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荆永,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡废亭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了具钥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豆村。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骂删,靈堂內的尸體忽然破棺而出掌动,到底是詐尸還是另有隱情,我是刑警寧澤宁玫,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布粗恢,位于F島的核電站,受9級特大地震影響撬统,放射性物質發(fā)生泄漏适滓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一恋追、第九天 我趴在偏房一處隱蔽的房頂上張望凭迹。 院中可真熱鬧,春花似錦苦囱、人聲如沸嗅绸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鱼鸠。三九已至猛拴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚀狰,已是汗流浹背愉昆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留麻蹋,地道東北人跛溉。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像扮授,于是被迫代替她去往敵國和親芳室。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容