1. 程式人生 > >對ajax理解及原生封裝

對ajax理解及原生封裝

onreadystatechange 事件

當請求被髮送到伺服器時,我們需要執行一些基於響應的任務。

每當 readyState 改變時,就會觸發 onreadystatechange 事件。

readyState 屬性存有 XMLHttpRequest 的狀態資訊。

下面是 XMLHttpRequest 物件的三個重要的屬性:

屬性 描述
onreadystatechange 儲存函式(或函式名),每當 readyState 屬性改變時,就會呼叫該函式。
readyState

存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。

  • 0: 物件已建立,但請求未初始化
  • 1: 伺服器連線已建立,尚未呼叫send()
  • 2: 請求已接收,send()方法已呼叫,但是當前的狀態及http頭未知
  • 3: 請求處理中,已接受部分資料,因為響應機http頭不全,這時通過responseText獲取部分資料會出現錯誤
  • 4: 請求已完成,且響應已就緒
status 200: "OK"
404: 未找到頁面

在 onreadystatechange 事件中,我們規定當伺服器響應已做好被處理的準備時所執行的任務。

當 readyState 等於 4 且狀態為 200 時,表示響應已就緒:

//封裝Ajax

function(method, url, success, fail, data) {
//第一個引數:method用來表示請求的傳送方式GET/POST
//最後一個引數是一個物件,裡面儲存了要提交的資料
var ajax = window.XMTLHttpRequest ? window.XMLHttpRequest() : window.ActiveXObject('Microsoft.XMLHTTP');
var str = '';
if (data instanceof Object) {
//判斷data是不是一個物件
for(var k in data){
str = str + k + '=' + data.k + '&';
}
//去掉最後一個&符號
str = str.substring(0,str.length - 1);
//至此data中的資料已經轉換成指定格式的字串
}
//處理method的字串
method = method.toUpperCase();
if(method == 'GET'){
url = url + '?' + str;
}
ajax.onreadystatechange = function(){
if (ajax.readyState == 4) {
if (ajax.status == 200) {
if (success instanceof Function) {
success(ajax.responseXML || responseText);
}
}else{
if (fail instanceof Function) {
fail(ajax.status);
}
}
}
}
ajax.open(method, url, true);
if (method == 'GET') {
//如果是get方式,則send方法中的引數為null
ajax.send(null);

}else if(method == 'POST'){

ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //POST中,這句必須

//如果是post方式,則send方法中的引數為要傳送的資料,就是上面拼接好的字串
ajax.send(str);
}
}