本文主要總結(jié)整理Ajax
的一些常用的基礎(chǔ)知識,適合初學者。
Ajax簡介 :
Asynchronous Javascript And XML
(異步的JavaScript
和XML
)AJAX
是一種用於創(chuàng)建快速動態(tài)網(wǎng)頁的技術(shù)。通過在後臺與服務(wù)器進行少量數(shù)據(jù)交換,AJAX
可以使網(wǎng)頁實現(xiàn)異步更新。這意味著可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行更新。優(yōu)點:
缺點:
ajax
幹掉了back
按鈕,即對瀏覽器後退機制的破壞。URL
直接訪問ajax
應(yīng)用場景
ajax
所包含的技術(shù)
ajax
並非一種新的技術(shù),而是幾種原有技術(shù)的結(jié)合體。它由下列技術(shù)組合而成。CSS
和XHTML
來表示。DOM
模型來交互和動態(tài)顯示。XMLHttpRequest
來和服務(wù)器進行異步通信。javascript
來綁定和調(diào)用。在上面幾中技術(shù)中,除了XmlHttpRequest
對象以外,其它所有的技術(shù)都是基於web
標準並且已經(jīng)得到了廣泛使用的,XMLHttpRequest
雖然目前還沒有被W3C
改採納,但是它已經(jīng)是一個事實的標準,因為目前幾乎所有的主流瀏覽器都支持它
Ajax
的原理簡單來說通過XmlHttpRequest
對象來向服務(wù)器發(fā)異步請求,從服務(wù)器獲得數(shù)據(jù),然後用javascript
來操作DOM
而更新頁面。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請求數(shù)據(jù)。原生創(chuàng)建ajax
可分為以下四步
XMLHttpRequest
對象Ajax
的核心是XMLHttpRequest
對象,它是Ajax
實現(xiàn)的關(guān)鍵,發(fā)送異步請求、接受響應(yīng)以及執(zhí)行回調(diào)都是通過它來完成
所有現(xiàn)代瀏覽器(IE7+、Firefox、Chrome、Safari 以及 Opera)均內(nèi)建 XMLHttpRequest 對象。
XMLHttpRequest
對象的語法:var xhr = new XMLHttpRequest();
老版本的 Internet Explorer
(IE5 和 IE6)使用ActiveX
對象:
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
為了應(yīng)對所有的現(xiàn)代瀏覽器,包括 IE5
和 IE6
,請檢查瀏覽器是否支持 XMLHttpRequest
對象。如果支持,則創(chuàng)建XMLHttpRequest
對象。如果不支持,則創(chuàng)建ActiveXObject
:
兼容各個瀏覽器的創(chuàng)建Ajax
的工具函數(shù)
function createRequest (){ try { xhr = new XMLHttpRequest(); }catch (tryMS){ try { xhr = new ActiveXObject("Msxm12.XMLHTTP"); } catch (otherMS) { try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }catch (failed) { xhr = null; } } } return xhr;}
XMLHttpRequest
對象,接受三個參數(shù):xhr.open(method,url,async);
GET
或者POST
。GET
請求:xhr.open("GET",demo.php?name=tsrot&age=24,true);
POST
請求:xhr.open("POST",demo.php,true);
true
或false
,表示請求是以異步還是同步的模式發(fā)出。(默認為true
,一般不建議為false
)false
:同步模式發(fā)出的請求會暫停所有javascript代碼的執(zhí)行,知道服務(wù)器獲得響應(yīng)為止,如果瀏覽器在連接網(wǎng)絡(luò)時或者在下載文件時出了故障,頁面就會一直掛起。 true
:異步模式發(fā)出的請求,請求對象收發(fā)數(shù)據(jù)的同時,瀏覽器可以繼續(xù)加載頁面,執(zhí)行其他javascript代碼xhr.send();
一般情況下,使用Ajax
提交的參數(shù)多是些簡單的字符串,可以直接使用GET
方法將要提交的參數(shù)寫到open
方法的url
參數(shù)中,此時send
方法的參數(shù)為null
或為空。
GET
請求:xhr.open("GET",demo.php?name=tsrot&age=24,true);xhr.send(null);
POST
請求:HTML
表單那樣 POST
數(shù)據(jù),請使用 setRequestHeader()
來添加 HTTP
頭。然後在send()
方法中規(guī)定您希望發(fā)送的數(shù)據(jù):xhr.open("POST",demo.php,true);xhr.setRequestHeder("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");xhr.sen
xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ console.log(xhr.responseText); }}
onreadystatechange
:當處理過程發(fā)生變化的時候執(zhí)行下面的函數(shù)
readyState
:ajax
處理過程
open()
)。send()
)。status
屬性:
responseText
:獲得字符串形式的響應(yīng)數(shù)據(jù)
responseXML
:獲得 XML
形式的響應(yīng)數(shù)據(jù)json
字符串,可以用JSON.parse(xhr.responseText)
轉(zhuǎn)化為JSON
對象var xhr = false; if(XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHTTP");};if(xhr) {//如果xhr創(chuàng)建失敗,還是原來的false xhr.open("GET","./data.json",true); xhr.send(); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ console.log(JSON.parse(xhr.responseText).name); } }}
data.json
{ "name":"tsrot", "age":24}
function ajax(url, success, fail){ // 1. 創(chuàng)建連接 var xhr = null; xhr = new XMLHttpRequest() // 2. 連接服務(wù)器 xhr.open('get', url, true) // 3. 發(fā)送請求 xhr.send(null); // 4. 接受請求 xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ success(xhr.responseText); } else { // fail fail && fail(xhr.status); } } }}
ajax
封裝案例//ajax請求後臺數(shù)據(jù)var btn = document.getElementsByTagName("input")[0];btn.onclick = function(){ ajax({//json格式 type:"post", url:"post.php", data:"username=poetries&pwd=123456", asyn:true, success:function(data){ document.write(data); } });}//封裝ajaxfunction ajax(aJson){ var ajx = null; var type = aJson.type || "get"; var asyn = aJson.asyn || true; var url = aJson.url; // url 接收 傳輸位置 var success = aJson.success;// success 接收 傳輸完成後的回調(diào)函數(shù) var data = aJson.data || '';// data 接收需要附帶傳輸?shù)臄?shù)據(jù) if(window.XMLHttpRequest){//兼容處理 ajx = new XMLHttpRequest();//一般瀏覽器 }else { ajx = new ActiveXObject("Microsoft.XMLHTTP");//IE6+ } if (type == "get" && data) { url +="/?"+data+"&"+Math.random(); } //初始化ajax請求 ajx.open( type , url , asyn ); //規(guī)定傳輸數(shù)據(jù)的格式 ajx.setRequestHeader('content-type','application/x-www-form-urlencoded'); //發(fā)送ajax請求(包括post數(shù)據(jù)的傳輸) type == "get" ?ajx.send():ajx.send(aJson.data); //處理請求 ajx.onreadystatechange = function(aJson){ if(ajx.readState == 4){ if (ajx.status == 200 && ajx.status<300)//200是HTTP 請求成功的狀態(tài)碼 { //請求成功處理數(shù)據(jù) success && success(ajx.responseText); }else{ alert("請求出錯"+ajx.status); } } }
jquery
對Ajax
操作進行了封裝,在jquery
中的$.ajax()
方法屬於最底層的方法,第2
層是load()
、$.get()
、$.post();
第3
層是$.getScript()
、$.getJSON()
,第2
層使用頻率很高
load()
方法load()
方法是jquery
中最簡單和常用的ajax
方法,能載入遠程HTML
代碼並插入DOM
中 結(jié)構(gòu)為:load(url,[data],[callback])
url
參數(shù)指定選擇符可以加載頁面內(nèi)的某些元素 load
方法中url
語法:url selector
注意:url
和選擇器之間有一個空格load()
方法的傳遞方式根據(jù)參數(shù)data
來自動指定,如果沒有參數(shù)傳遞,則採用GET
方式傳遞,反之,採用POST
XMLHttpRequest
對象$("#testTest").load("test.html",function(responseText,textStatus,XMLHttpRequest){ //respnoseText 請求返回的內(nèi)容 //textStatus 請求狀態(tài) :sucess、error、notmodified、timeout //XMLHttpRequest })
參數(shù)名稱 | 類型 | 說明 |
---|---|---|
url | String | 請求HTML 頁面的URL 地址 |
data(可選) | Object | 發(fā)送至服務(wù)器的key / value 數(shù)據(jù) |
callback(可選) | Function | 請求完成時的回調(diào)函數(shù),無論是請求成功還是失敗 |
$.get()
和$.post()
方法load()
方法通常用來從web服務(wù)器上獲取靜態(tài)的數(shù)據(jù)文件。在項目中需要傳遞一些參數(shù)給服務(wù)器中的頁面,那麼可以使用$.get()
和$.post()
或$.ajax()
方法
注意:$.get()
和$.post()
方法是jquery
中的全局函數(shù)
$.get()方法
$.get()
方法使用GET
方式來進行異步請求$.get(url,[data],callback,type)
xml
文檔,需要在服務(wù)器端設(shè)置Content-Type
類型 代碼如下:header("Content-Type:text/xml:charset=utf-8")
//php
$.get()
方法參數(shù)解析參數(shù) | 類型 | 說明 |
---|---|---|
url | String | 請求HTML 頁的地址 |
data(可選) | Object | 發(fā)送至服務(wù)器的key / value 數(shù)據(jù)會作為QueryString 附加到請求URL中 |
callback(可選) | Function | 載入成功的回調(diào)函數(shù)(只有當Response 的返回狀態(tài)是success才調(diào)用該方法) |
type(可選) | String | 服務(wù)器返回內(nèi)容的格式,包括xml 、html 、script 、json 、text 和_default |
$.post()方法
$.get()
方法的結(jié)構(gòu)和使用方式相同,有如下區(qū)別GET
請求會將參數(shù)跟張乃URL後進行傳遞,而POST
請求則是作為Http
消息的實體內(nèi)容發(fā)送給web服務(wù)器,在ajax
請求中,這種區(qū)別對用戶不可見GET
方式對傳輸數(shù)據(jù)有大小限制(通常不能大於2KB
),而使用POST
方式傳遞的數(shù)據(jù)量要比GET
方式大得多(理論不受限制)GET
方式請求的數(shù)據(jù)會被瀏覽器緩存起來,因此其他人可以從瀏覽器的歷史紀錄中讀取這些數(shù)據(jù),如:賬號、密碼。在某種情況下,GET
方式會帶來嚴重的安全問題,而POST
相對來說可以避免這些問題GET
和POST
方式傳遞的數(shù)據(jù)在服務(wù)端的獲取也不相同。在PHP
中,GET
方式用$_GET[]
獲取;POST
方式用$_POST[]
獲取;兩種方式都可用$_REQUEST[]
來獲取 總結(jié)
load()
、$.get()
和$.post()
方法完成了一些常規(guī)的Ajax
程序,如果還需要複雜的Ajax
程序,就需要用到$.ajax()
方式$.ajax()
方法是jquery
最底層的Ajax
實現(xiàn),它的結(jié)構(gòu)為$.ajax(options)
$.ajax()
方式所需要的請求設(shè)置以及回調(diào)函等信息,參數(shù)以key
/ value
存在,所有參數(shù)都是可選的參數(shù) | 類型 | 說明 |
---|---|---|
url | String | (默認為當前頁地址)發(fā)送請求的地址 |
type | String | 請求方式(POST 或GET )默認為GET |
timeout | Number | 設(shè)置請求超時時間(毫秒) |
dataType | String | 預(yù)期服務(wù)器返回的類型。可用的類型如下 xml:返回 XML 文檔,可用jquery 處理html:返回純文本的 HTML 信息,包含的script 標籤也會在插入DOM 時執(zhí)行script:返回純文本的 javascript 代碼。不會自動緩存結(jié)果,除非設(shè)置cache 參數(shù)。注意:在遠程請求時,所有的POST 請求都將轉(zhuǎn)為GET 請求json:返回 JSON 數(shù)據(jù)jsonp: JSONP 格式,使用jsonp 形式調(diào)用函數(shù)時,例如:myurl?call back=?,jquery 將自動替換後一個? 為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)text:返回純文本字符串 |
beforeSend | Function | 發(fā)送請求前可以修改XMLHttpRequest 對象的函數(shù),例如添加自定義HTTP 頭。在beforeSend 中如果返回false 可以取消本次Ajax 請求。XMLHttpRequest 對象是唯一的參數(shù)function(XMLHttpRequest){ this ;//調(diào)用本次Ajax 請求時傳遞的options 參數(shù)} |
complete | Function | 請求完成後的回調(diào)函數(shù)(請求成功或失敗時都調(diào)用) 參數(shù): XMLHttpRequest 對象和一個描述成功請求類型的字符串function(XMLHttpRequest,textStatus){ this ;//調(diào)用本次Ajax請求時傳遞的options 參數(shù)} |
success | Function | 請求成功後調(diào)用的回調(diào)函數(shù),有兩個參數(shù) (1)由服務(wù)器返回,並根據(jù) dataTyppe 參數(shù)進行處理後的數(shù)據(jù)(2)描述狀態(tài)的字符串 function (data,textStatus){// data 可能是xmlDoc、``jsonObj 、html 、text 等this ;//調(diào)用本次Ajax 請求時傳遞的options 參數(shù)} |
error | Function | 請求失敗時被調(diào)用的函數(shù) |
global | Boolean | 默認為true 。表示是否觸發(fā)全局Ajax 事件,設(shè)置為false 將不會觸發(fā)。AjaxStart 或AjaxStop 可用於控制各種Ajax 事件 |
jQuery