ajax的工作原理


一、什么是ajax

ajax是一種異步通信技術。在ajax出現之前,客戶端與服務端之間直接通信。引入ajax之后,客戶端與服務端加了一個第三者--ajax。有了ajax之后,通過在后台與服務器進行少量數據交換,可以達到在不刷新整個頁面的情況下實現局部刷新。其原理如圖

二、XHR對象

ajax技術的核心是XMLHttpRequest對象(簡稱XHR)。IE7+、FireFox、Opera、Chrome和Safari都支持原生的XHR對象,創建XHR對象可以這樣寫

var xhr = new XMLHttpRequest();

那如果要兼容IE6、7又該怎么寫

var xhr = new ActiveXObject("MSXML2,XMLHTTP");

因此兼容寫法如下

var xhr = '';
window.ActiveXObject ? xhr = new ActiveXObject('MSXML2,XMLHTTP') : xhr = new XMLHttpRequest();

三、XHR用法

創建完XHR對象后,要調用open()方法創建請求,open()方法接受三個參數:

1.要發送的請求的類型(如"get"、"post"等)

2.請求的URL

3.表示是否異步發送請求的布爾值(默認為true,表示異步)

xhr.open("get","index.php",true);

post()請求方法如下面代碼

xhr.open("get","index.php",true);
//post()方法必須在send()方法之前加上下面這段代碼
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

說明一點:URL相對於執行代碼的當前頁面,也可以用絕對路徑

准備工作做好后,調用send()方法發送請求,

xhr.send(null);

這里get方法傳輸的數據已經放到url中,可以將參數設置為null

在調用send()方法后,請求就會被分派到服務器,onreadychange捕獲請求的狀態碼,並進行檢測

onreadychange對象有個readyState屬性,該屬性的值表示當前的活動階段,其值有如下幾個:

0:未初始化。尚未調用open()方法

1:啟動。已經調用open()方法,但尚未調用send()方法

2:發送。已經調用send()方法,但尚未接收到響應

3:接收。已經接受到部分響應數據

4:完成。已經接受到全部響應數據,並且可以在客戶端使用

我們只需判斷readyState的值是否為4就可以知道所有數據已經就緒。

 1 xhr.onreadystatechange = function(){
 2     if (xhr.readyState==4) {
 3         //判斷狀態碼是否成功
 4         if (xhr.status>=200&&xhr.status<=207||xhr.status==304) {
 5             //調用ajax的responseText屬性返回數據
 6             alert(xhr.responseText);
 7         }else{
 8             alert(xhr.status);
 9     }  
10 }      

四、總結

原生ajax的請求總結為一下六個步驟

1.創建XHR對象

2.調用open()方法創建請求

3.調用send()方法發送請求

4.onreadychange捕獲請求的狀態碼

5.判斷狀態嗎是否成功

6.調用ajax的responseText屬性返回數據

 1 //拼接路徑
 2 function toUrl(url, data) {
 3     //獲取時間戳
 4     var time = new Date().getTime();
 5     data.time = time;
 6     var arr = [];
 7     for(var i in data) {
 8         var str = i + "=" + data[i];
 9         //["user"='lili',"pass"="4564522",time="145486456"]
10         arr.push(str);
11     }
12     var str = arr.join("&"); //"user=lili&pass=4564522&time=145486456"
13     var path = url + "?" + str;
14     return path;
15 }
16 function fnAjax(obj) {
17     var data = obj.data||{};//可選,如果沒有data就新建一個
18     var path = toUrl(obj.url,data);
19     var sendType = obj.sendType||"get";
20     var succFn = obj.succFn||false;
21     var failFn = obj.failFn||false;
22     //1、創建一個XMLHttpRequest對象
23     //兼容寫法
24     if(window.ActiveXObject) {
25         var ajax = new ActiveXObject("MSXML2,XMLHTTP");//兼容IE6、7
26     } else {
27         var ajax = new XMLHttpRequest();//現代瀏覽器
28     }
29     //2、創建一個請求
30     var time = new Date().getTime();
31     //判斷傳送的類型
32     if (sendType=="get") {
33         ajax.open("get", path);
34         ajax.send(path);
35     }else{
36         var pathArr = path.split("?");
37         ajax.open("post", pathArr[0]);// pathArr[0]?之前的內容
38         //url = "test.txt?time=12365478"
39         //3、發送請求
40         //get方法傳輸的數據已經放到url中,可以將參數設置為null
41         ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
42         ajax.send(pathArr[1]);//pathArr[1]?之后的內容
43     }
44     //4、檢測請求的狀態
45     ajax.onreadystatechange = function() {
46         //如果ajax對象的准備狀態發生改變執行事件
47         //onreadystatechange事件是在readyState屬性發生改變時觸發的,
48         //readyState的值表示當前請求的狀態,在事件處理程序中可以根據這個值來進行不同的處理。
49         //5、判斷請求的狀態
50         if(ajax.readyState == 4) {
51             //6、判斷請求結果
52             if(ajax.status >= 200 && ajax.status <= 207 || ajax.status == 304) {
53                 //7、請求成功拿到返回的結果
54                 if (succFn) {
55                     succFn(ajax.responseText);
56                 }
57             } else {
58                 if (failFn) {
59                     failFn(ajax.status);
60                 }                
61             }
62         }
63     }
64 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM