使用原生JS和jQuery搞定Ajax

一、原生JS

說到Ajax,不得不先提一下HTTP(HTTP,HyperText Transfer Protocol)協(xié)議,中文名:超文本傳輸協(xié)議,是互聯(lián)網(wǎng)上應用最為廣泛的一種網(wǎng)絡協(xié)議。所有的WWW文件都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。一次HTTP請求,包含了兩個重要的部分:上行request(請求)和下行response(響應)

HTTP協(xié)議定義了很多與服務器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE. 一個URL地址用于描述一個網(wǎng)絡上的資源,而HTTP中的GET, POST, PUT,DELETE就對應著對這個資源的查,改,增,刪4個操作。 我們最常見的也是我們關心的就是GET和POST了。GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。
我們看看GET和POST的區(qū)別:

  1. GET提交的數(shù)據(jù)會放在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數(shù)據(jù)放在HTTP包的Body中.
  2. GET提交的數(shù)據(jù)大小有限制(因為瀏覽器對URL的長度有限制,本身并沒有限制),而POST方法提交的數(shù)據(jù)沒有限制。
  3. GET方式提交數(shù)據(jù),會帶來安全問題,比如一個登錄頁面,通過GET方式提交數(shù)據(jù)時,用戶名和密碼將出現(xiàn)在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼。
    如果你使用chrome瀏覽器的話,可以再下面的頁面中看到這兩種請求攜帶的信息:



通常,瀏覽器產生HTTP請求,是由于用戶輸入了新的網(wǎng)址、或者點擊了超級鏈接,使頁面跳轉,這將導致頁面的全局刷新。而Ajax(Asynchronous Javascript And XML:異步JavaScript和XML)技術,可以使網(wǎng)頁悄悄地、偷偷地發(fā)起HTTP請求,請求回來的數(shù)據(jù)在頁面局部刷新呈遞。ajax的使用其實很簡單:
第一步,new出一個XMLHttpRequest對象:


這里變量名xhr可以隨便起,只是一般工程師都喜歡使用這個名字,就像var arr一樣,姑且當做一種約定俗成的東西就好,方便大家交流。第二步,處理服務器上面返回的響應:

其中,if語句小括號中的的語句:readyState表示返回XMLHTTP請求的當前狀態(tài),具體數(shù)值示意如下:
0、未初始化
對象已建立,但是尚未初始化(尚未調用open方法)
1、初始化
已調用send()方法,正在發(fā)送請求
2 、發(fā)送數(shù)據(jù)
send方法調用完成,但是當前的狀態(tài)及http頭未知
3 、數(shù)據(jù)傳送中
已接收部分數(shù)據(jù),因為響應及http頭不全,這時通過responseBody和responseText獲取部分數(shù)據(jù)會出現(xiàn)錯誤,
4、完成
數(shù)據(jù)接收完畢,此時可以通過通過responseBody和responseText獲取完整的回應數(shù)據(jù)

第三步,創(chuàng)建一個請求,第一個參數(shù)是請求的類型get或者post,第二個參數(shù)就是請求的路徑,第三個參數(shù)叫做是否使用異步機制:



如果是post請求,在發(fā)送請求前需要做以下處理:



第四步,發(fā)送請求:

總結一下:

1   //Ajax的一個固定的模板:
2   //第1步創(chuàng)建一個xhr對象,使用new關鍵來調用一個內置構造函數(shù)
3   var xhr = new XMLHttpRequest();
4   //第2步指定接收回來的內容,怎么處理。監(jiān)聽xhr對象的onreadystatechange事件,這個事件在xhr對象的“就緒狀態(tài)”改變的時候觸發(fā)。我們只關心就緒狀態(tài)為4的時候的事情。
5   xhr.onreadystatechange = function(){
6       if(xhr.readyState == 4){
7           //接收完文件要做的事情,讓h1的內容變?yōu)樽x取的東西
8           biaoti.innerHTML = xhr.responseText;
9       }
10  }
11  
12  //第3步創(chuàng)建一個請求,第一個參數(shù)是請求的類型get或者post,第二個參數(shù)就是請求的路徑,第三個參數(shù)叫做是否使用異步機制
13  xhr.open("get","a.txt",true);
14  //第4步發(fā)送請求,圓括號里面是請求頭內容,get請求沒有報文頭寫null
15  xhr.send(null);

如果是post,對應如下修改:

1. xhr.open("post","do2.php",true);
2. //如果用post發(fā)送請求,那么必須寫一句話,模擬成form表單提交:
3. xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
4. xhr.send("xingming="+encodeURIComponent("楓")+"&age=18");

二、jQuery

1.1 $.get()方法

1   $.get("a.json"  ,   {"id":1,"name":"考拉"}  ,  function(text){
2           alert(typeof text);
3   });

jQuery默默的幫我們:
1) encodingURIComponent中文了;
2) 如果請求是404等錯誤狀態(tài),不會執(zhí)行回調函數(shù);
3) jQuery識別傳回來的東西像JSON,已經(jīng)幫我們轉JSON了,

jQuery中get方法還可以這樣使用兩個參數(shù):

1   $.get("a.json?id=1&name=楓", function(text){
2           alert(typeof text);
3   });
1.2 $.post()方法
1   $.post("a.json",{"id":1,"name":"楓"},function(data){
2       alert(typeof data);
3       alert(data.content[2].id);
4   });

1.3 $.ajax()方法
配置信息非常多,寫在json里面進行配置:

1   $.ajax("b.json",{
2       //請求類型
3       "type"  :   "get",
4       //傳到服務器上的數(shù)據(jù)
5       "data"  :   {
6           "name":"xiaoming",
7           "age" :10
8       },
9       //成功做的事情
10      "success" : function(data){
11          alert(typeof data);
12      },
13      //錯誤做的事情
14      "error": function(XMLHttpRequest, textStatus, errorThrown){
15          alert(errorThrown);
16      }
17  });
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,544評論 0 7
  • 原文鏈接 http://blog.poetries.top/2016/10/20/review-jQuery 關注...
    前端進階之旅閱讀 16,935評論 18 503
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,500評論 19 139
  • 第一章 入門 基本功能:訪問和操作 dom 元素,控制頁面樣式,對頁面的事件處理,與ajax完美結合,有豐富的插件...
    X_Arts閱讀 1,138評論 0 2
  • 前言: 初識 kotlin ,看到他的語法與swift 語言有相同,也有不同,對我來說,我喜歡對比的學習;在swi...
    揚起帆前行閱讀 1,040評論 0 0

友情鏈接更多精彩內容