Ajax:A new Approach to web Applications。javascript
Ajax技術的核心是XMLHttpRequest對象(簡稱XHR),由微軟首先引入。XHR爲向服務器發送請求和解析服務器響應提供了流暢的接口。可以以異步的方式從服務器取得更多的信息。雖然名字中包含了XML。php
IE7+,Chrome,Firfox,Opera,safari都支持原生的XHR對象,建立方法:html
var xhr=new XMLHttpRequest();java
兼容全部瀏覽器的建立辦法(包括IE7如下)web
function creatXHR() { if ( typeof XMLHttpRequest !="undefined") { return new XMLHttpRequest(); } else if ( typeof ActiveXObject !="undefined" ) { if ( typeof arguments.callee.activeXString!="string") { var vertion=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], i,len; for(i=0,len=vertion.length;i<len;i++){ try{ new ActiveXObject(vertion[i]); arguments.callee.activeXString=vertion[i]; break; } catch(ex){ / /跳過 } } } } }
var xhr=creatXHR(); //建立瀏覽器
XHR的用法緩存
便用XHR時要調用的第一個方法是open(method,url,false),有3個參數:如:xhr.open("get","example.html",false);安全
參數1:請求的類型(get、post等);服務器
參數2:URL地址。末尾的查詢字符串必須經學正確的編碼才行 ;cookie
參數3:是否異步發送請求的布爾值。false是同步javascript會等到收到服務器響應之後再執行;true是異步。
注意:只能在同一個域中使用相同端口和協議的URL發送請求。若是URL與啓動請求的頁面有任何差異,都會引起安全錯誤。
send(parm)方法發送請求
參數parm:請求主體發送的數據,若是不須要請求主體發送數據時必須傳入null 。
發送請求後,收到服務器的響應後,響應會自動填充XHR的屬性。屬性介紹以下:
收到服務器的響應後,第一步是檢查 status 屬性,以肯定響應已經成功返回。
爲了接受到適當的響應能夠檢查如下狀態碼:
var xhr=new XMLHttpRequest(); xhr.open("get,"example/detais",false); xhr.send(null); if(xhr.status>=200&&xhr.status<300||xhr.status==304) { alert(xhr.responseText); } else { alert("unsuccessful:"+xhr.status); }
有的瀏覽器會錯誤的報告204狀態代碼。IE中的XHR的ActiveX版本會裝204設置成1223,而IE中的原生XHR則會將204規範化爲200。Opera會在取得204時報告的值爲0。
readyState 屬性
有的時候爲了不等待,使用異步發送請求。這時能夠檢測readyState 屬性來肯定請求\響應過程的當前活動狀態。
0:未初始化(未調用open());
1:啓動。調用了open(),還未調用send()方法;
2:發送。發送但未接收到響應;
3:接收。已經接收到部分響應數據;
4:完成。已經接收完響應數據,並且能夠在客戶端使用了。
只要readyState的屬性值由一個變成另一個值,都會觸發readystatechange事件。
必須在調用open()方法前指定onReadyStateChange事件處理程序才能確保跨瀏覽器兼容性
如:
var xhr=creatXHR(); xhr.onreadystatuschange=function(){ if(xhr.readyStatus==4){ //在事件中使用了xhr而非this,緣由是onreadystatuschange趕快件處理程序的做用域問題。若是使用this,在有的瀏覽器中會致使函數執行失敗。
if(xhr.status>=200&&xhr.status<300||xhr.status==403)
{
alert(xhr.response.Text);
}
else
{
alert("unsuccessful:"+xhr.status); }
}
}
xhr.open("get","url",false);
xhr.send(null);
XHR的abort()方法取消導步請求。調用這個方法XHR會中止觸發事件,中止後並且不容許訪問任何與響應有關的對象屬性。
http頭部信息
每一個HTTP請求或者響應都會帶有相應的頭部信息,XHR的請求和響應也帶有相應的。發送XHR請求時會發送相應的頭部信息:
XHR的setRequestHeader(header,value)方法能夠設置自定義的請求頭部信息,必須在open()方法以後,send()方法以前調用。
獲取相應的相應信息:
getRequestHeader(header):獲取頭部字段名稱爲header的值;
getAllRequestHeaders():獲取全部頭部信息的長字符串;
GET請求和POST請求
服務器對post提交請求和提交表單處理不同,能夠用XHR模擬表單提交
將 Content-Type 頭部信息設置爲 application/x-www-form-urlencoded,也就是表單
提交時的內容類型
xhr.open("post","example.php",false");
xhr.setRequestHeader("content-Type","application/x-www-form-urlencoded"); //XHR模擬表單提交
var form=document.getElementById("formid"); xhr.send(serialize(form));
與get請求相比,post請求消耗的資源更多,從性能上講,發送相同的數據,get請求的速度最多可達到post請求的兩倍。
XMLHttpRequest 2
var x =new FormData;
x.append("title","hellow");
或
var data=new FormData(document.forms(0));
支持 FormData 的瀏覽器有 Firefox 4+、 Safari 5+、 Chrome 和 Android 3+版 WebKit。