JavaScript,Ajaxphp
學習要點:html
1.XMLHttpRequestweb
2.GET與POSTajax
3.封裝Ajaxjson
2005年Jesse James Garrett發表了一篇文章,標題爲:「Ajax:A new Approach to Web Applications」。他在這篇文章裏介紹了一種技術,用他的話說,就叫:Ajax,是Asynchronous JavaScript + XML的簡寫。這種技術可以想服務器請求額外的數據而無須卸載頁面(即刷新),會帶來更好的用戶體驗。一時間,席捲全球。數組
一.XMLHttpRequest對象瀏覽器
Ajax技術核心是XMLHttpRequest對象(簡稱XHR),這是由微軟首先引入的一個特性,其餘瀏覽器提供商後來都提供了相同的實現。在XHR出現以前,Ajax式的通訊必須藉助一些hack手段來實現,大多數是使用隱藏的框架或內嵌框架。服務器
XHR的出現,提供了向服務器發送請求和解析服務器響應提供了流暢的接口。可以以異步方式從服務器獲取更多的信息,這就意味着,用戶只要觸發某一事件,在不刷新網頁的狀況下,更新服務器最新的數據。app
雖然Ajax中的x表明的是XML,但Ajax通訊和數據格式無關,也就是說這種技術不必定使用XML。框架
IE7+、Firefox、Opera、Chrome和Safari都支持原生的XHR對象,在這些瀏覽器中建立XHR對象能夠直接實例化XMLHttpRequest便可。
XMLHttpRequest()建立xhr對象
var xhr = new XMLHttpRequest(); //建立xhr對象 alert(xhr); //打印對象
若是是IE6及如下,那麼咱們必須還須要使用ActiveX對象經過MSXML庫來實現。在低版本IE瀏覽器可能會遇到三種不一樣版本的XHR對象,即MSXML2.XMLHttp、MSXML2.XMLHttp.3.0、MSXML2.XMLHttp.6.0。咱們能夠編寫一個函數。
兼容IE低版本建立xhr對象
var xhr = new createXHR(); //執行兼容IE低版本建立xhr對象函數 alert(xhr); //打印xhr對象 //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } }
建立了XHR對象,在使用XHR對象時,先必須調用open()方法,它接受三個參數:要發送的請求類型(get、post)、請求的URL和表示是否異步。
open()方法,準備發送http請求,3個參數,參數1請求類型get或post,參數2請求的url能夠是動態的也能夠是靜態的(如:demo.php,demo.html),參數3表示是否異步/false同步/true異步
使用方式:
XHR對象.open('get','demo.php',false)
var xhr = new createXHR(); //執行兼容IE低版本建立xhr對象函數 //open()方法,準備發送http請求,3個參數,參數1請求類型get或post,參數2請求的url能夠是動態的也能夠是靜態的(如:demo.php,demo.html),參數3表示是否異步/false同步/true異步 xhr.open('get','demo.html',false); //準備發送 //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } }
open()方法並不會真正發送請求,而只是啓動一個請求以備發送。經過send()方法進行發送請求,send()方法接受一個參數,做爲請求主體發送的數據。若是不須要則,必須填null。執行send()方法以後,請求就會發送到服務器上。
send()方法方法,發送http請求,1個參數,請求主體發送的數據,若是不須要則,必須填null
使用方式:
XHR對象.send(null)
var xhr = new createXHR(); //執行兼容IE低版本建立xhr對象函數 //open()方法,準備發送http請求,3個參數,參數1請求類型get或post,參數2請求的url能夠是動態的也能夠是靜態的(如:demo.php,demo.html),參數3表示是否異步/false同步/true異步 xhr.open('get','demo.py',false); //準備發送 //send()方法方法,發送http請求,1個參數,請求主體發送的數據,若是不須要則,必須填null xhr.send(null); //發送請求 //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } }
當send()方法請求發送到服務器端,收到響應後,響應的數據會自動填充XHR對象的屬性。那麼一共有四個屬性:
屬性名 |
說明 |
responseText |
做爲響應主體被返回的文本 |
responseXML |
若是響應主體內容類型是"text/xml"或"application/xml",則返回包含響應數據的XML DOM文檔 |
status |
響應的HTTP狀態 |
statusText |
HTTP狀態的說明 |
接受響應以後,第一步檢查status屬性,以肯定響應已經成功返回。通常以HTTP狀態代碼爲200做爲成功的標誌。除了成功的狀態代碼,還有一些別的:
HTTP狀態碼 |
狀態字符串 |
說明 |
200 |
OK |
服務器成功返回了頁面 |
400 |
Bad Request |
語法錯誤致使服務器不識別 |
401 |
Unauthorized |
請求須要用戶認證 |
404 |
Not found |
指定的URL在服務器上找不到 |
500 |
Internal Server Error |
服務器遇到意外錯誤,沒法完成請求 |
503 |
ServiceUnavailable |
因爲服務器過載或維護致使沒法完成請求 |
responseText屬性,做爲響應主體被返回的文本
var xhr = new createXHR(); //執行兼容IE低版本建立xhr對象函數 //open()方法,準備發送http請求,3個參數,參數1請求類型get或post,參數2請求的url能夠是動態的也能夠是靜態的(如:demo.php,demo.html),參數3表示是否異步/false同步/true異步 xhr.open('get','demo.html',false); //準備發送 //send()方法方法,發送http請求,1個參數,請求主體發送的數據,若是不須要則,必須填null xhr.send(null); //發送請求 //responseText屬性,做爲響應主體被返回的文本 alert(xhr.responseText); //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } }
其餘屬性見上表,同理
動態獲取請求數據,結合點擊事件
addEvent(document, 'click', function () { //執行添加事件函數,添加一個點擊事件,點擊頁面時激發函數 var xhr = new createXHR(); //執行兼容IE低版本建立xhr對象函數 xhr.open('get', 'demo.html', false); //設置了同步,準備請求 xhr.send(null); //發送請求 if (xhr.status == 200) { //若是返回成功了,判斷狀態碼是否等於200 alert(xhr.responseText); //調出服務器返回的數據 } else { alert('數據返回失敗!狀態代碼:' + xhr.status + '狀態信息:' + xhr.statusText); } }); //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } } //跨瀏覽器添加事件,添加事件兼容 function addEvent(obj, type, fn) { //添加事件函數,接收3個參數,1事件對象,2事件名稱,3事件函數 //判斷瀏覽器若是支持w3c if (obj.addEventListener) { //就用w3c的addEventListener方法添加對象,將事件名稱和事件函數傳入添加事件 obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { //判斷若是瀏覽器是IE9如下,就用IE的方法attachEvent添加事件 //將事件名稱和事件函數傳入建立對象 obj.attachEvent('on' + type, fn); } }
open()方法異步調用【經常使用】
同步調用當然簡單,但使用異步調用纔是咱們真正經常使用的手段。使用異步調用的時候,須要觸發readystatechange事件,而後檢測readyState屬性便可。這個屬性有五個值:
readyState屬性
值 |
狀態 |
說明 |
0 |
未初始化 |
還沒有調用open()方法 |
1 |
啓動 |
已經調用open()方法,但還沒有調用send()方法 |
2 |
發送 |
已經調用send()方法,但還沒有接受響應 |
3 |
接受 |
已經接受到部分響應數據 |
4 |
完成 |
已經接受到所有響應數據,並且可使用 |
異步調用
//注意:引入了開源庫json2,若是瀏覽器版本過低不支持JSON對象,經過一個開源庫json2.js來模擬執行,若是支持JSON對象就用JSON對象 addEvent(document, 'click', function () { //執行添加事件函數,添加一個點擊事件,點擊頁面後執行函數 var xhr = new createXHR(); //執行建立XHR對象函數,建立XHR對象 xhr.open('get', 'demo.html', true); //open()方法異步調用,準備請求 xhr.send(null); //發送請求 xhr.onreadystatechange = function () { //當請求時執行函數 if (xhr.readyState == 4) { //判斷已經接受到所有響應數據,並且可使用 if (xhr.status == 200) { //判斷狀態碼爲200 alert(xhr.responseText); //獲取請求頁面內容 } else { //不然打印錯誤 alert('數據返回失敗!狀態代碼:' + xhr.status + '狀態信息:' + xhr.statusText); } } }; }); //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } } //跨瀏覽器添加事件,添加事件兼容 function addEvent(obj, type, fn) { //添加事件函數,接收3個參數,1事件對象,2事件名稱,3事件函數 //判斷瀏覽器若是支持w3c if (obj.addEventListener) { //就用w3c的addEventListener方法添加對象,將事件名稱和事件函數傳入添加事件 obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { //判斷若是瀏覽器是IE9如下,就用IE的方法attachEvent添加事件 //將事件名稱和事件函數傳入建立對象 obj.attachEvent('on' + type, fn); } }
PS:使用abort()方法能夠取消異步請求,放在send()方法以前會報錯。放在responseText以前會獲得一個空值。
注意若是請求的url是動態頁面,獲取頁面數據時,不是實時的解決方式
xhr.open('get', 'demo.php?rand=' + Math.random(), true);
二.GET與POST
在提供服務器請求的過程當中,有兩種方式,分別是:GET和POST。在Ajax使用的過程當中,GET的使用頻率要比POST高。
在web程序上,GET通常是URL提交請求,好比:demo.php?name=lee&age=100
POST通常是表單提交,好比:<form method="post">...
在瞭解這兩種請求方式前,咱們先了解一下HTTP頭部信息,包含服務器返回的響應頭信息和客戶端發送出去的請求頭信息。咱們能夠獲取響應頭信息或者設置請求頭信息。咱們能夠在Firefox瀏覽器的firebug查看這些信息。
兩種頭信息
響應頭信息:服務器返回的信息,客戶端能夠獲取,但不能夠設置
請求頭信息:客戶端發送的信息,客戶端能夠設置,但不能夠獲取
獲取響應頭信息
getAllResponseHeaders()方法,獲取整個響應頭信息
使用方式
xhr對象.getAllResponseHeaders()
//注意:引入了開源庫json2,若是瀏覽器版本過低不支持JSON對象,經過一個開源庫json2.js來模擬執行,若是支持JSON對象就用JSON對象 addEvent(document, 'click', function () { //執行添加事件函數,添加一個點擊事件,點擊頁面後執行函數 var xhr = new createXHR(); //執行建立XHR對象函數,建立XHR對象 xhr.open('get', 'demo.html', true); //open()方法異步調用,準備請求 xhr.send(null); //發送請求 xhr.onreadystatechange = function () { //當請求時執行函數 if (xhr.readyState == 4) { //判斷已經接受到所有響應數據,並且可使用 if (xhr.status == 200) { //判斷狀態碼爲200 alert(xhr.getAllResponseHeaders()); //getAllResponseHeaders()方法,獲取整個響應頭信息 } else { //不然打印錯誤 alert('數據返回失敗!狀態代碼:' + xhr.status + '狀態信息:' + xhr.statusText); } } }; }); //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } } //跨瀏覽器添加事件,添加事件兼容 function addEvent(obj, type, fn) { //添加事件函數,接收3個參數,1事件對象,2事件名稱,3事件函數 //判斷瀏覽器若是支持w3c if (obj.addEventListener) { //就用w3c的addEventListener方法添加對象,將事件名稱和事件函數傳入添加事件 obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { //判斷若是瀏覽器是IE9如下,就用IE的方法attachEvent添加事件 //將事件名稱和事件函數傳入建立對象 obj.attachEvent('on' + type, fn); } }
getResponseHeader()方法,獲取單個響應頭信息,參數是要獲取頭信息的名稱
使用方式
xhr對象.getResponseHeader('要獲取頭信息的名稱')
//注意:引入了開源庫json2,若是瀏覽器版本過低不支持JSON對象,經過一個開源庫json2.js來模擬執行,若是支持JSON對象就用JSON對象 addEvent(document, 'click', function () { //執行添加事件函數,添加一個點擊事件,點擊頁面後執行函數 var xhr = new createXHR(); //執行建立XHR對象函數,建立XHR對象 xhr.open('get', 'demo.html', true); //open()方法異步調用,準備請求 xhr.send(null); //發送請求 xhr.onreadystatechange = function () { //當請求時執行函數 if (xhr.readyState == 4) { //判斷已經接受到所有響應數據,並且可使用 if (xhr.status == 200) { //判斷狀態碼爲200 alert(xhr.getResponseHeader('Content-Type')); //getResponseHeader()方法,獲取單個響應頭信息,參數是要獲取頭信息的名稱 } else { //不然打印錯誤 alert('數據返回失敗!狀態代碼:' + xhr.status + '狀態信息:' + xhr.statusText); } } }; }); //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } } //跨瀏覽器添加事件,添加事件兼容 function addEvent(obj, type, fn) { //添加事件函數,接收3個參數,1事件對象,2事件名稱,3事件函數 //判斷瀏覽器若是支持w3c if (obj.addEventListener) { //就用w3c的addEventListener方法添加對象,將事件名稱和事件函數傳入添加事件 obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { //判斷若是瀏覽器是IE9如下,就用IE的方法attachEvent添加事件 //將事件名稱和事件函數傳入建立對象 obj.attachEvent('on' + type, fn); } }
設置單個請求頭信息
setRequestHeader()方法,設置單個請求頭信息,兩個參數,要設置的頭信息名稱和值
使用方式
xhr對象.setRequestHeader('頭信息名稱','值')
注意:放在open方法以後,send方法以前
//注意:引入了開源庫json2,若是瀏覽器版本過低不支持JSON對象,經過一個開源庫json2.js來模擬執行,若是支持JSON對象就用JSON對象 addEvent(document, 'click', function () { //執行添加事件函數,添加一個點擊事件,點擊頁面後執行函數 var xhr = new createXHR(); //執行建立XHR對象函數,建立XHR對象 xhr.open('get', 'demo.html', true); //open()方法異步調用,準備請求 //setRequestHeader()方法,設置單個請求頭信息,兩個參數,要設置的頭信息名稱和值 xhr.setRequestHeader('MyHeader', 'Lee'); //放在open方法以後,send方法以前 xhr.send(null); //發送請求 xhr.onreadystatechange = function () { //當請求時執行函數 if (xhr.readyState == 4) { //判斷已經接受到所有響應數據,並且可使用 if (xhr.status == 200) { //判斷狀態碼爲200 //alert(xhr.getAllResponseHeaders()); //獲取整個響應頭信息 } else { //不然打印錯誤 alert('數據返回失敗!狀態代碼:' + xhr.status + '狀態信息:' + xhr.statusText); } } }; }); //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } } //跨瀏覽器添加事件,添加事件兼容 function addEvent(obj, type, fn) { //添加事件函數,接收3個參數,1事件對象,2事件名稱,3事件函數 //判斷瀏覽器若是支持w3c if (obj.addEventListener) { //就用w3c的addEventListener方法添加對象,將事件名稱和事件函數傳入添加事件 obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { //判斷若是瀏覽器是IE9如下,就用IE的方法attachEvent添加事件 //將事件名稱和事件函數傳入建立對象 obj.attachEvent('on' + type, fn); } }
PS:咱們只能夠獲取服務器返回回來響應頭信息,沒法獲取向服務器提交的請求頭信息,天然自定義的請求頭,在JavaScript端是沒法獲取到的。
GET請求
GET請求是最多見的請求類型,最經常使用於向服務器查詢某些信息。必要時,能夠將查詢字符串參數追加到URL的末尾,以便提交給服務器。
xhr.open('get', 'demo.php?rand=' + Math.random() + '&name=Koo', true);
經過URL的末尾提交數據,能夠經過動態頁面獲取提交的數據
經過URL後的問號給服務器傳遞鍵值對數據,服務器接收到返回響應數據。特殊字符傳參產生的問題可使用encodeURIComponent()進行編碼處理,中文字符的返回及傳參,能夠將頁面保存和設置爲utf-8格式便可。
var url = 'demo.php?rand=' + Math.random(); url = addURLParam(url,'name','lguix'); url = addURLParam(url,'aeg',100); //一個通用的URL提交函數 function addURLParam(url, name, value) { url += (url.indexOf('?') == -1 ? '?' : '&'); //判斷的url是否有已有參數 url += encodeURIComponent(name) + '=' + encodeURIComponent(value); alert(url); return url; }
PS:當沒有encodeURIComponent()方法時,在一些特殊字符好比「&」,會出現錯誤致使沒法獲取。
POST請求
POST請求能夠包含很是多的數據,咱們在使用表單提交的時候,不少就是使用的POST傳輸方式。
//注意:引入了開源庫json2,若是瀏覽器版本過低不支持JSON對象,經過一個開源庫json2.js來模擬執行,若是支持JSON對象就用JSON對象 addEvent(document, 'click', function () { //執行添加事件函數,添加一個點擊事件,點擊頁面後執行函數 var xhr = new createXHR(); //執行建立XHR對象函數,建立XHR對象 xhr.open('post', 'demo.php', true); //open()方法異步調用,準備請求
而發送POST請求的數據,不會跟在URL的尾巴上,而是經過send()方法向服務器提交數據。
//注意:引入了開源庫json2,若是瀏覽器版本過低不支持JSON對象,經過一個開源庫json2.js來模擬執行,若是支持JSON對象就用JSON對象 addEvent(document, 'click', function () { //執行添加事件函數,添加一個點擊事件,點擊頁面後執行函數 var xhr = new createXHR(); //執行建立XHR對象函數,建立XHR對象 xhr.open('post', 'demo.php', true); //open()方法異步調用,準備請求 xhr.send('name=Lee&age=100'); //發送
通常來講,向服務器發送POST請求因爲解析機制的緣由,須要進行特別的處理。由於POST請求和Web表單提交是不一樣的,須要使用XHR來模仿表單提交。
修改響應頭信息來模擬
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
PS:從性能上來說POST請求比GET請求消耗更多一些,用相同數據比較,GET最多比POST快兩倍。
上一節課的JSON也可使用Ajax來回調訪問。
var url = 'demo.json?rand=' + Math.random(); var box = JSON.parse(xhr.responseText);
三.封裝Ajax
由於Ajax使用起來比較麻煩,主要就是參數問題,好比到底使用GET仍是POST;究竟是使用同步仍是異步等等,咱們須要封裝一個Ajax函數,來方便咱們調用。
//注意:引入了開源庫json2,若是瀏覽器版本過低不支持JSON對象,經過一個開源庫json2.js來模擬執行,若是支持JSON對象就用JSON對象 //封裝ajax function ajax(obj) { //接收數據對象 var xhr = new createXHR(); //執行建立xhr對象函數 //數據對象裏的url加上?rand=,在加上Math.random() obj.url = obj.url + '?rand=' + Math.random(); //數據對象裏的data鍵和值對象,執行名值對編碼函數 obj.data = params(obj.data); //接收名值對編碼後而且格式化分隔符後的數組 //判斷髮送方式是不是get,url裏的?索引位置是不是負一。若是不是執行後面 if (obj.method === 'get') obj.url = obj.url.indexOf('?') == -1 ? obj.url + '?' + obj.data : obj.url + '&' + obj.data; //判斷髮送模式若是是異步 if (obj.async === true) { //添加一個加載事件 xhr.onreadystatechange = function () { //判斷已經接受到所有響應數據,並且可使用 if (xhr.readyState == 4) callback(); //執行callback()函數 }; } xhr.open(obj.method, obj.url, obj.async); if (obj.method === 'post') { xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(obj.data); } else { xhr.send(null); } if (obj.async === false) { callback(); } function callback() { //callback()函數 if (xhr.status == 200) { //判斷狀態碼若是是200 //將獲取到的頁面內容,傳入回調函數 obj.success(xhr.responseText); //回調 } else { alert('數據返回失敗!狀態代碼:' + xhr.status + '狀態信息:' + xhr.statusText); } } } //調用ajax addEvent(document, 'click', function () { //IE6須要重寫addEvent ajax({ //數據對象 method: 'get', //執行ajax封裝函數,將一個對象傳入封裝函數 url: 'demo.html', //請求url data: { 'name': 'Lee', //url鍵值 'age': 100 //url鍵值 }, success: function (text) { //接收回調函數 alert(text); //打印回調返回的內容 }, async: true //true異步調用 }); }); //名值對編碼 function params(data) { //接收數據對象裏的data鍵和值對象 var arr = []; //建立數組 for (var i in data) { //循環數據對象裏的data鍵和值對象 //將每次循環的對象名稱 = 加上 對應名稱的值,添加到arr數組 arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i])); } return arr.join('&'); //將數組格式化分隔符後返回 } //兼容IE低版本建立xhr對象,函數 function createXHR() { if (typeof XMLHttpRequest != 'undefined') { //判斷XMLHttpRequest建立xhr對象是否支持, return new XMLHttpRequest(); //若是支持,建立xhr對象返回 } else if (typeof ActiveXObject != 'undefined') { //若是不支持,判斷IE低版本的3種模式是否支持 var versions = [ //數組,3種模式 'MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp' ]; for (var i = 0; i < versions.length; i++) { //循環3種模式 try { return new ActiveXObject(version[i]); //嘗試每次循環的IE模式執行返回 } catch (e) { //跳過 } } } else { //若是上面兩種都不能建立xhr對象 //建立錯誤對象,拋出錯誤 throw new Error('您的瀏覽器不支持XHR對象!'); } } //跨瀏覽器添加事件,添加事件兼容 function addEvent(obj, type, fn) { //添加事件函數,接收3個參數,1事件對象,2事件名稱,3事件函數 //判斷瀏覽器若是支持w3c if (obj.addEventListener) { //就用w3c的addEventListener方法添加對象,將事件名稱和事件函數傳入添加事件 obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { //判斷若是瀏覽器是IE9如下,就用IE的方法attachEvent添加事件 //將事件名稱和事件函數傳入建立對象 obj.attachEvent('on' + type, fn); } }
PS:封裝Ajax並非一開始就造成以上的形態,須要通過屢次變化而成。