48 function myAjax(obj) { 49 var xmlHttp; //保存xmlHttpRequest對象 50 var type = obj.requestType; //保存請求方式 51 var cache = obj.cache || false; //get時是否使用緩存,默認否 52 var success = obj.success; //數據請求成功的回調方法 53 var error = obj.error; //發生錯誤的回調方法 54 var async = obj.async || false; //是否異步,默認否 55 var data = []; //存儲用戶發來的數據 56 var url = obj.url; //用戶請求地址 57 58 59 createXmlHttp(); //執行xmlHttp創建函數 60 61 //創建xmlHttp失敗 62 if(!xmlHttp) { 63 console.log("我的老哥,創建xmlHttp對象失敗啦!您的瀏覽器不支持xmlHttpRequest對象"); 64 } 65 66 try { 67 //定義狀態監聽函數 68 xmlHttp.onreadystatechange = function () { 69 switch (xmlHttp.readyState) { 70 case 1: 71 console.log("open() 方法已調用,但是 send() 方法未調用。請求還沒有被發送。"); 72 break; 73 case 2: 74 console.log("Send() 方法已調用,HTTP 請求已發送到 Web 服務器。未接收到響應。"); 75 break; 76 case 3: 77 console.log("所有響應頭部都已經接收到。響應體開始接收但未完成。"); 78 break; 79 case 4: 80 if (xmlHttp.status == 200) { 81 console.log("HTTP 響應已經完全接收。"); 82 success(xmlHttp.responseText); //調用回調函數 83 } 84 break; 85 default: 86 error(xmlHttp.statusText); 87 break; 88 } 89 }; 90 91 //把用戶傳來的數據轉換成字符串 92 for (var i in obj.data) { 93 data.push(i + '=' + obj.data[i]); 94 } 95 data = data.join('&'); 96 97 if (type.toUpperCase() == 'GET') { //如果是get請求 98 if (cache == false) { //如果get請求不使用緩存 99 xmlHttp.open('get', url + '?' + data + '&random=' + Math.random(), async); 100 xmlHttp.send('null'); 101 } else { //如果get請求使用緩存 102 xmlHttp.open('get', url + '?' + data, async); 103 xmlHttp.send('null'); 104 } 105 } else if (type.toUpperCase() == 'POST') //如果是post請求 106 { 107 xmlHttp.open('post', url, async); 108 xmlHttp.setRequestHeader("Content-Type" 109 , "application/x-www-form-urlencoded"); 110 xmlHttp.send(data); 111 } else { 112 throw new Error('您的請求方法有誤!'); 113 } 114 } catch (error) { 115 console.log("出錯啦:" + error.message); 116 } 117 118 119 //創建xmlHttpRequest對象函數 120 function createXmlHttp() { 121 if(window.ActiveXObject) { 122 try { 123 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 124 } catch (e) { 125 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 126 } 127 128 } else if (window.XMLHttpRequest){ 129 try { 130 xmlHttp = new XMLHttpRequest(); 131 } catch(e) { 132 xmlHttp = false; 133 } 134 } 135 } 136 137 }
插件基本邏輯:
GET請求: 1.新建XHR對象 2.定義狀態監聽函數,各種狀態對應各種處理 3.調用open方法啟動請求,准備發送 4.使用send方法發送請求,參數為null POST請求: 1.新建XHR對象 2.定義狀態監聽函數,各種狀態對應各種處理 3.使用open方法啟動請求,准備發送 4.設置http頭信息的Content-Type類型,模擬表單發送 5.使用send方法發送請求,參數為自己要發送的東西
插件使用方法:
1.在html頁面引入myAjax.js文件之后就可以使用啦
2.
get方法使用例子:
myAjax({
requestType: 'get',
url: '/getFunc',
async: true,
cache: false,
data: { name: "lin", age: "20"},
success: function (data) {
alert(data);
},
error: function (statusText) {
alert("請求失敗了,以下是具體信息:\n" + statusText);
}
});
post方法使用例子:
myAjax({
requestType: 'post',
url: '/postFunc',
async: true,
data: {name:"shuai", age: 10},
success: function (data) {
console.log(data);
},
error: function (statusText) {
alert("請求失敗了,以下是具體信息:\n" + statusText);
}
});
這個插件主要是我為了學習原生ajax和函數封裝而寫的,還存在很多bug,同樣在學習ajax和函數封裝的同學可以參考參考,取其精華棄其糟粕,嘻嘻嘻。
myAjax.js已經在github開源,上面有實現具體例子: https://github.com/nayonglin/myAjax 記得star啊我的老哥!!!!!!