一、ajax是什么?
ajax: asynchronous javascript and xml: 異步的javascript和xml。
ajax是一種用來改善用戶體驗的技術,其本質是利用瀏覽器內置的一種特殊的對象(XMLHttpRequest)異步(即發送請求時,瀏覽器不會銷毀當前頁面,用戶可以繼續在當前頁面做其它的操作)的向服務器發送請求,并且利用服務器返回的數據(不再是一個完整的頁面,只是部分的數據,一般使用文本或者xml返回)來部分更新當前頁面。
使用ajax技術之后,頁面無刷新,并且不打斷用戶的操作。
二、ajax編程的基本步驟
- 獲取ajax對象(XmlHttpRequest)
- 使用 XmlHttpRequest向服務器發送請求
- 在服務器端處理請求
- 在監聽器當中,處理服務器返回的響應
其中:ajax對象的屬性
a. onreadystatechange: 綁訂一個事件處理函數(即: 注冊一個監聽器)
當ajax對象的readyState值發生了改變(比如, 從0-->1),就會產生readystatechange事件。
b. responseText: 獲得服務器返回的文本
c. responseXML: 獲得服務器返回的XML dom對象
d. status: 獲得狀態碼
e. readyState: 返回ajax對象與服務器通訊的狀態。返回值是一個number類型的值,不同的值表示不同的含義:
0: (為初始化) --> 對象已建立,但是尚未初始化(尚未調用 open方法)
1: (初始化) --> 對象已建立,尚未調用send方法
2: (發送數據) --> send方法已調用
3: (數據傳送中) --> 已接受部分數據
4: (響應結束) --> 接收了所有的數據
三. 選擇POST還是GET
如果請求不改變服務器狀態只是取回數據則使用GET.GET請求被緩存起來,如果多次提取相同的數據可提高性能;只有當URL和參數的長度大于2048個字符時才使用POST提取數據在IE下URL過長會導致請求參數被截斷;
完整封裝代碼:
//小工具函數,把Json對象轉URL字符串;
function json2url(json){
json.t = Math.random();
var arr = [];
for(var name in json){
arr.push(name+'='+encodeURIComponent(json[name]));
}
return arr.join('&');
}
//Aja函數封裝,接收一個Json對象
/*
url:服務器地址
data:數據
type:發送方式,默認GET
timeout:超時時間,默認5s
success:成功回調函數
error:失敗回調函數
*/
function ajax(json){
var json = json||{};
if(!json.url)return;
json.data = json.data || {};
json.type = json.type || 'get';
json.timeout = json.timeout || 5000;
//獲取Ajax對象,XMLHttpRequest并沒有標準化,要區分瀏覽器
if(window.XMLHttpRequest){
//非IE瀏覽器
var oAjax = new XMLHttpRequest();
}else{
//IE瀏覽器
var oAjax = new ActiveXObject('Microsoft.XMLHTTP');
}
switch(json.type.toLowerCase()){
case 'get':
oAjax.open('GET',json.url+'?'+json2url(json.data),true);
oAjax.send();
break;
case 'post':
oAjax.open('POST',json.url,true);
//因為按照http協議的要求,如果發送的post請求,請求數據包里面,應該有一個消息頭 content-type。但是,ajax對象默認沒有,所以,需要調用setRequestHeader方法。
oAjax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
oAjax.send(json2url(json.data));
break;
}
var timer = setTimeout(function(){
oAjax.onreadystatechange=null;
json.error&&json.error('親,網絡不給力');
},json.timeout);
oAjax.onreadystatechange=function(){
if(oAjax.readyState==4){
clearTimeout(timer);
if(oAjax.status>=200&&oAjax.status<300||oAjax.status==304){
json.success&&json.success(oAjax.responseText);
}else{
json.error&&json.error(oAjax.status);
}
}
};
}