XHR

varXHRRequest;

//創建XHR

function createXHR(){

? ? if(typeof XMLHttpRequest ?!= 'undefined'){//IE7+ chrome hotfox and so on

? ? ? ? return new XMLHttpRequest();

? ? }else if(typeof ActiveXObject!='undefined'){//IE7-

? ? if(typeof arguments.callee.activeXString!='string'){

? ? ? ? var version= ['MSXML2.XMLHTTP6.0','MSXMLHTTP3.0','MSXMLHTTP'];

? ? ? ? var len=version.length;

? ? for(vari=0;i<len; i++){

? ? ? ? try{

? ? ? ? new ActiveXObject(version[i]);

? ? ? ? arguments.callee.activeXString=version[i];

? ? ? ? }catch(ex){ }

? ? }

}

return new ActiveXObject(arguments.callee.activeXString);

// return new ActiveXObject("Microsoft.XMLHTTP"); ?//可以直接使用該方法兼容ie5/6

}else{

throw newError("No XHR object avaliable");

}

}



function XHRTools(option) {

if(!XHRRequest){

XHRRequest=createXHR();

}

var params= option.params;

var requestType="";

var url="";

var asyn= option.asyn=="undefined"?true:option.asyn;

var data="";

var dataType=params.dataType =="undefined"?"text":params.dataType;

var contentType= option.contentType=="undefined"?"application/x-www-form-urlencoded": option.contentType;

var timeout= option.timeout!="undefined"?option.timeout:2000;//IE8+

url=addURLParam(requestType,url,"name","milk");

//監測當前活動狀態readyState 0:未調用open 1:調用open未調用send ?2:調用send未接收到響應 3:接收到部分響應 ?4:接收到全部響應

//在open之前指定onreadystatechange可保證跨瀏覽器兼容性

//onload可以替代onreadystatechange事件,表示在接收到完整的響應數據時觸發

XHRRequest.onreadystatechange=function() {

if(XHRRequest.readyState==4){

try{

if((XHRRequest.status>=200&&XHRRequest.status<300) ||XHRRequest.status==304){//304表示請求的資源并沒有被修改,可以使用瀏覽器中緩存的版本

alert(XHRRequest.responseText);

}else{

alert("Request was unsucessful: "+XHRRequest.status);

}

}catch(ex){

//當超時時,status可能是4,如果在超時終止請求之后再訪問status屬性,就會導致錯誤,所以使用try catch語句

//這里可以處理超時事件

}

}

};



//onprogress事件會接收一個event對象,其target屬性是XHR對象。還有額外三個屬性:lengthComputable進度信息是否可用,position已接收字節數,totalSizegenju Content-Length響應頭部確定的預期字節數。

//在open之前添加。

XHRRequest.onprogress=function(event) {

vardivStatus=document.getElementById("status");

if(event.lengthComputable){//進度信息是否可用

divStatus.innerHTML="Received "+ event.position+" of "+event.totalSize +" bytes";

}

};


XHRRequest.responseType=dataType;

XHRRequest.open(requestType,url,asyn);

//在調用open之后,send之前,設置請求頭部信息

XHRRequest.setRequestHeader("Content-Type",contentType);

XHRRequest.setRequestHeader("myHeader","myValue");

XHRRequest.timeout=timeout;


XHRRequest.ontimeout=function() {

? ? alert("Request did not return in time.");

}

XHRRequest.send(data);

};

function addURLParam(requestType, url, key, value) {

url += (url.indexOf("?")== -1)?"?":"&";

if(requestType=='get'){

//get請求的參數名和值要encodeURIComponent

url +=encodeURIComponent(key)+"="+encodeURIComponent(value);

}else{

url += (key)+"="+(value);

}

returnurl;

};

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 個人博客:https://yeaseonzhang.github.io 花了半個多月的時間,終于又把“JS紅寶書”...
    Yeaseon閱讀 1,789評論 2 23
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • 摘自《JavaScript高級程序設計》 一、簡述 Ajax是Asynchronous Javascript + ...
    寧小姐的慢時光閱讀 10,930評論 0 8
  • 在使用XHR對象時,要調用的第一個方法時open(),它接受三個參數:要發送的請求的類型("get","post"...
    章柏華閱讀 1,336評論 0 0
  • 2005年,jjg發表了一篇在線文章,他在文章里介紹了一種技術,叫Ajax,是對Asynchronous Java...
    章柏華閱讀 1,852評論 0 0