//使用literal語法定義一個對象:XMLHttp
var XMLHttp =
{
//定義第一個屬性,該屬性用於緩存XMLHttpRequest對象的數組
XMLHttpRequestPool: [],
//對象的第一個方法,該方法用於返回一個XMLHttpRequest對象
getInstance:function()
{
// 從XMLHttpRequest對象池中取出一個空閑的XMLHttpRequest
for (var i = 0; i < this.XMLHttpRequestPool.length; i ++)
{
//如果XMLHttpReuqest的readyState為0,或者為4,
//都表示當前的XMLHttpRequest對象為閑置的對象
if (this.XMLHttpRequestPool[i].readyState == 0 ||
this.XMLHttpRequestPool[i].readyState == 4)
{
return this.XMLHttpRequestPool[i];
}
}
//如果沒有空閑的,將再次創建一個新的XMLHttpRequest對象
this.XMLHttpRequestPool[this.XMLHttpRequestPool.length]
= this.createXMLHttpRequest();
//返回剛剛創建的XMLHttpRequest對象
return this.XMLHttpRequestPool[this.XMLHttpRequestPool.length – 1];
},
//創建新的XMLHttpRequest對象
createXMLHttpRequest:function()
{
//對於DOM 2 規范的瀏覽器
if (window.XMLHttpRequest)
{
var objXMLHttp = new XMLHttpRequest();
}
//對於Internet Explorer瀏覽器
else
{
//將Internet Explorer內置的所有XMLHTTP ActiveX控制設置成數組
var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0',
'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
//依次對Internet Explorer內置的XMLHTTP控件初始化,嘗試創建XMLHttpRequest對象
for(var n = 0; n < MSXML.length; n ++)
{
try
{
//如果可以正常創建XMLHttpRequest對象,使用break跳出循環
var objXMLHttp = new ActiveXObject(MSXML[n]);
break;
}
catch(e)
{
}
}
}
//Mozilla某些版本沒有readyState屬性
if (objXMLHttp.readyState == null)
{
//直接設置其readyState為0
objXMLHttp.readyState = 0;
//對於哪些沒有readyState屬性的瀏覽器,將load動作與下面的函數關聯起來
objXMLHttp.addEventListener("load", function ()
{
//當從服務器加載數據完成後,將readyState狀態設為4
objXMLHttp.readyState = 4;
if (typeof objXMLHttp.onreadystatechange == "function")
{
objXMLHttp.onreadystatechange();
}
}, false);
}
return objXMLHttp;
},
//定義對象的第三個方法: 發送請求(方法[POST,GET], 地址, 數據, 回調函數)
sendRequest: function (method, url, data, callback)
{
var objXMLHttp = this.getInstance();
with(objXMLHttp)
{
try
{
//增加一個額外的randnum請求參數,用於防止IE緩存服務器響應
if (url.indexOf("?") > 0)
{
url += "&randnum=" + Math.random();
}
else
{
url += "?randnum=" + Math.random();
}
//打開與服務器的連接
open(method, url, true);
//對於使用POST請求方式
if (method == "POST")
{
// 設定請求頭
setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
send(data);
}
//對於采用GET請求
if (method == "GET")
{
send(null);
}
//設置狀態改變的回調函數
onreadystatechange = function ()
{
//當服務器的相應完成時,以及獲得瞭正常的服務器響應
if (objXMLHttp.readyState == 4 &&
(objXMLHttp.status == 200 ||
objXMLHttp.status == 304))
{
//當響應時機成熟時,調用回調函數處理響應
callback(objXMLHttp);
}
}
}
catch(e)
{
alert(e);
}
}
}
};
摘自 Hurry的專欄