之前在思維導(dǎo)圖中介紹過(guò)集中請(qǐng)求Ajax的方法,但是只是匆匆說(shuō)過(guò),最近看了一本書(shū),覺(jué)得介紹的比較詳細(xì),這里結(jié)合筆者自己的想法,重新彌補(bǔ)一下。之前寫(xiě)過(guò)的文章也會(huì)不斷的改善更新。歡迎提意見(jiàn)。
安裝Web環(huán)境
Ajax方法需要與Web服務(wù)器端進(jìn)行交互,需要有環(huán)境才可正常使用,安裝環(huán)境的工具包有很多,可以選擇自行下載。筆者使用的是Apache。
jQuery中的Ajax
在jQuery中,$.Ajax()方法屬于最底層的方法,第2層是load(),$.get(),和$.post(),第3層是$.getScript()和$.getJSON()方法。
一、 load( ) 方法
結(jié)構(gòu)
load( url , [data] , [callback] )
參數(shù)解釋
1.1 應(yīng)用
1.1.1首先構(gòu)建一個(gè)被load()方法加載并追加到HTML文件,名字為xi.html,html代碼如下:
<ul>
<li>《慢慢來(lái),一切都來(lái)得及》</li>
<li>《你的孤獨(dú)雖敗猶榮》</li>
<li>《你只是看上去很努力》</li>
<li>《JavaScript從入門(mén)到放棄》</li>
</ul>
<div>你篩選出來(lái)的元素</div>
1.1.2然后再新建一個(gè)空白頁(yè)面,用來(lái)追加的HTML內(nèi)容,HTML代碼如下:
<h3>你最喜歡讀什么書(shū)?</h3>
<p id="cont"></p>
<button>點(diǎn)擊</button>
1.1.3接下來(lái)就是編寫(xiě)Jquery代碼了,等DOM加載完畢之后,通過(guò)單擊按鈕來(lái)調(diào)用load()方法,然后將xi.html的內(nèi)容加載到id=“cont”的元素里。
jQuery代碼如下:
$("button").click(function(){
$("#cont").load("xi.html")//單擊時(shí)將xi.html的內(nèi)容加載到頁(yè)面上
})
})
運(yùn)行結(jié)果:

1.2篩選載入的HTML文檔
上面的例子是將xi.html頁(yè)面中的內(nèi)容都加載到id為“cont”的元素里,如果只要加載頁(yè)面內(nèi)的某些內(nèi)容,可以使用load(URL selector)方法的URL參數(shù)來(lái)達(dá)到目的。
注意:URL和選擇器之間有一個(gè)空格。
例如只需要加載xi.html的li元素中內(nèi)容,可以使用如下代碼:
$("button").click(function(){
$("#cont").load("xi.html li");
})
運(yùn)行結(jié)果:

1.3傳遞方式
load()方法傳遞方式根據(jù)參數(shù)data來(lái)自動(dòng)指定。如果沒(méi)有參數(shù)傳遞,則采用get方式,反之,則自動(dòng)轉(zhuǎn)換為post方式。
$("button").click(function(){
$("#cont").load("xi.html li",{name:"rain",age"18"},function(){
//code....
});
})
1.4 回調(diào)參數(shù)
對(duì)于必須在加載完成后才能繼續(xù)的操作,load()方法提供了回調(diào)函數(shù)(callback),該函數(shù)有3個(gè)參數(shù),分別代表“請(qǐng)求返回的內(nèi)容”,“請(qǐng)求狀態(tài)”,“XMLHttpRequest對(duì)象”,代碼如下:
$("#cont").load("xi.html li",function(responseText,textStates,XMLHttpRequest){
//responseText:請(qǐng)求返回的內(nèi)容
//textStates:請(qǐng)求狀態(tài):success error notmodified timeout4種
//XMLHttpRequest:XMLHttpRequest對(duì)象
});
注意:在load()方法中,無(wú)論Ajax請(qǐng)求是否成功,只要請(qǐng)求完成?;卣{(diào)函數(shù)就被觸發(fā)。
二、 $.get( ) 方法和$.post()方法
load()通常是從web服務(wù)器上獲取靜態(tài)的數(shù)據(jù)文件,如果需要專遞一些參數(shù)給服務(wù)器中的頁(yè)面,可以使用 $.get( ) 方法和$.post()方法(或$.ajax()方法)
2.1 $.get( ) 方法
結(jié)構(gòu)
$.get( url,[ data ],[ callback ],[ type ])
參數(shù)解釋
2.1.1 應(yīng)用
下面是一段評(píng)論頁(yè)面的HTML代碼,通過(guò)該段代碼來(lái)介紹$.get()方法的使用。
<p><h3>評(píng)論</h3></p>
<p>姓名:<input type="text" name="" id="name"></p>
<p>內(nèi)容:<textarea id="cont"></textarea></p>
<button>發(fā)表留言</button>
<hr>
<h3>已有評(píng)論</h3>
<div id="msg"></div>
該段代碼生成的頁(yè)面
將姓名和內(nèi)容填寫(xiě)好后,就可以提交評(píng)論了。
確定請(qǐng)求的URl地址
$("button").click(function(){$.get("get_html.php",data參數(shù),回調(diào)函數(shù)})
提交之前,將姓名和內(nèi)容的值作為參數(shù)data傳遞給后臺(tái)
$("button").click(function(){$.get("get_html.php",
{"username":$("#name").val(),"content":$("#cont").val()},
回調(diào)函數(shù))
})
如果服務(wù)器結(jié)構(gòu)到傳遞的data數(shù)據(jù)并成功返回,那么就可以通過(guò)回調(diào)函數(shù)將返回的數(shù)據(jù)顯示到頁(yè)面上
$.get()方法的回調(diào)函數(shù)只有兩個(gè)參數(shù),
function(){
//data:返回的內(nèi)容,可以是XML文檔,json文件,XHML片段等等
//textStatus:請(qǐng)求狀態(tài):success error notmodified timeout4種
}
data參數(shù)代表請(qǐng)求返回的內(nèi)容,textStatus參數(shù)代表請(qǐng)求狀態(tài),而且回調(diào)含稅只有當(dāng)數(shù)據(jù)成功(success)后才能被調(diào)用
$("button").click(function(){$.get("get_html.php",{"username":$("#name").val(),"content":$("#cont").val()},function(data,textStatus,fn){
if(textStatus=="success"){
$(data).appendTo("#msg")
}
},
"html"
);
})
運(yùn)行結(jié)果

2.2 $.post( ) 方法
它與$.get( )方法的結(jié)構(gòu)和使用方式都相同,不過(guò)之間仍然有一下區(qū)別
2.2.1get與post區(qū)別
1.post的安全性高于get;如果以get方式請(qǐng)求,請(qǐng)求參數(shù)會(huì)拼接到url后面,安全性性低,以post方式請(qǐng)求,請(qǐng)求參數(shù)會(huì)包裹在請(qǐng)求體中,安全性更高
2.數(shù)量區(qū)別:get方式傳輸?shù)臄?shù)據(jù)量小,規(guī)定不能超過(guò)2kb,post方式請(qǐng)求數(shù)據(jù)量大,沒(méi)有限制。
3.傳輸速度:get的傳輸速度高于post
因?yàn)槭褂梅椒ㄏ嗤?,因此只要改變jQuery函數(shù),就可以將程序在GET請(qǐng)求和POST請(qǐng)求之間切換
$("button").click(function(){$.post("get_html.php",{"username":$("#name").val(),"content":$("#cont").val()},
function(data,textStatus,fn){
if(textStatus=="success"){
$(data).appendTo("#msg")
}
},
"html"
);
})
運(yùn)行結(jié)果和GET一樣。
三、 $.getScript( ) 方法和$.getJson()方法
3.1 $.getScript( )方法
有時(shí)候,在頁(yè)面出息加載時(shí)就獲取所需的全部JavaScript文件是完全沒(méi)有必要的,可以在需要的時(shí)候直接加載。jQuery提供了 $.getScript( )方法來(lái)直接加載js文件,與加載一個(gè)HTML片段一樣簡(jiǎn)單方便,并且不需要對(duì)JavaScript文件進(jìn)行處理,JavaScript文件會(huì)自動(dòng)執(zhí)行。
3.1.1結(jié)構(gòu)
$.getScript( url , fn )
url:請(qǐng)求地址
fn:回調(diào)函數(shù)
3.2.1應(yīng)用
新建一個(gè)basejs.js文件,隨機(jī)生成顏色的函數(shù),代碼如下
function randomColor(){
var str="0123456789abcdef";
var color = "#";
for (var i = 0; i < 6; i++) {
color+=str[ Math.floor( Math.random()*str.length)];
};
return color;
}
當(dāng)我們點(diǎn)擊按鈕時(shí)加載js文件,給body添加顏色
jQuery代碼如下
$("button").click(function(){
$.getScript("basejs.js",function(){
$("body").click(function(){
$(this).css("background-color",randomColor())
})
})
})
運(yùn)行結(jié)果

3.2 $.getJson( )方法
$.getJson( )方法用于加載JSON文件,與$.getScript( )方法的用法相同
$.getJSON( url,回調(diào)函數(shù)})
當(dāng)點(diǎn)擊加載時(shí),頁(yè)面上看不到任何效果,雖然函數(shù)加載了JSON文件,但是并沒(méi)有告知JavaScript對(duì)返回的數(shù)據(jù)如何處理,為此,所以在回調(diào)函數(shù)里我們可以處理返回的數(shù)據(jù)
通常我們需要遍歷我們得到的數(shù)據(jù),雖然這里我們可以使用傳統(tǒng)的for循環(huán),但是我們也可以通過(guò)$.each(),可以用來(lái)遍歷對(duì)象和數(shù)組,$.each()函數(shù)是以一個(gè)數(shù)組或者對(duì)象為第1個(gè)參數(shù),以一個(gè)回調(diào)函數(shù)作為第2個(gè)參數(shù),回調(diào)函數(shù)擁有兩個(gè)參數(shù),第1個(gè)為對(duì)象的成員或者數(shù)組的下標(biāo),第2個(gè)位對(duì)應(yīng)變量或內(nèi)容
$(function(){
$("button").click(function(){
$.getJSON( "text.json" , function( data ){
$.each( data , function(index,comment){
處理數(shù)據(jù)...
}
})
})
})
四、 $.Ajax()方法
前面用到的$.load(),$.get(),$.post(),$.getScript(),$.getJSON()這些方法,都是基于$.ajax()方法構(gòu)建的,$.ajax()是jQuery最底層的Ajax實(shí)現(xiàn),因?yàn)榭梢杂脕?lái)代替前面的所有方法。
所以如果除了上面,還需要編寫(xiě)一下復(fù)雜的Ajax程序,那么就要用$.ajax(),$.ajax()不僅能實(shí)現(xiàn)與$.load(),$.get(),$.post()同樣的功能,而且還可以設(shè)定beforeSend(提交前回調(diào)函數(shù))、error(請(qǐng)求失敗后處理)、success(請(qǐng)求成功后處理)、complete(請(qǐng)求完成后處理)回調(diào)函數(shù),通過(guò)設(shè)定這些回調(diào)函數(shù),可以給用戶更多的Ajax提示信息,另外,還有一些參數(shù)可以設(shè)置Ajax請(qǐng)求的超時(shí)時(shí)間或者頁(yè)面的“最后更改”狀態(tài)。
之前的文章里面有說(shuō)過(guò)$.Ajax()方法。
這里不再贅述,直接引之前的例子
$.ajax({
url:請(qǐng)求地址
type:"get | post | put | delete " 默認(rèn)是get,
data:請(qǐng)求參數(shù) {"id":"123","pwd":"123456"},
dataType:請(qǐng)求數(shù)據(jù)類型"html | text | json | xml | script | jsonp ",
success:function(data,dataTextStatus,jqxhr){ },//請(qǐng)求成功時(shí)error:function(jqxhr,textStatus,error)//請(qǐng)求失敗時(shí)
})
$.ajax({
url:"tom.php",
type:"get",
dataType:"text",
success:function(data,textStatus,jqxhr){
console.log("__成功__");
console.log(data);
console.log(textStatus);
console.log(jqxhr);
console.log("______");
},
error:function(jqxhr,textStatus,error){
console.log("__失敗__");
console.log(error);
console.log(textStatus);
console.log(jqxhr);
console.log("******");
}
})
番外篇1
以下引用《鋒利的JQuery》
Ajax的優(yōu)勢(shì)
1、不需任何瀏覽器插件
不需任何瀏覽器插件,就可以被大多數(shù)瀏覽器所支持,用戶只需要允許JavaScript在瀏覽器上執(zhí)行即可。
2、優(yōu)秀的用戶體驗(yàn)。
最大的優(yōu)點(diǎn),能在不刷新整個(gè)頁(yè)面的前提下更新數(shù)據(jù),這使得Web應(yīng)用程序能迅速回應(yīng)用戶的操作。
3、提高Web程序的性能
與傳統(tǒng)模式相比,Ajax模式在性能上最大區(qū)別就是在于傳輸數(shù)據(jù)的方式,在傳統(tǒng)模式中,數(shù)據(jù)提交是通過(guò)表單(from)來(lái)實(shí)現(xiàn)的,而數(shù)據(jù)獲取的是靠全面刷新網(wǎng)頁(yè)來(lái)說(shuō)獲取整頁(yè)的內(nèi)容,Ajax的模式只是通過(guò)XMLHttpRequest對(duì)象來(lái)向服務(wù)器端提交需要提交的數(shù)據(jù),即按需發(fā)送。
4、減輕服務(wù)器和寬帶的負(fù)擔(dān)
Ajax的工作的原理相當(dāng)于在用戶和服務(wù)器之間加了一個(gè)中間層,是用戶操作與服務(wù)器響應(yīng)異步化,他在客戶端創(chuàng)建Ajax引擎,把傳統(tǒng)方式下的一些服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)移到客戶端,便于客戶端資源來(lái)處理,減輕服務(wù)器和寬帶的負(fù)擔(dān)。
Ajax的缺點(diǎn)
1、瀏覽器對(duì)XMLHttpRequest對(duì)象的支持度不足
Ajax的不足之一首先來(lái)自于瀏覽器,IE5.0及以后的版本才支持XMLHttpRequest對(duì)象(現(xiàn)階段大部分客戶端都在IE6以上),Mozilla,Netscape等瀏覽器支持XMLHttpRequest則更在其后,為了使得Ajax應(yīng)用能在各個(gè)瀏覽器中正常運(yùn)行,程序員必須花費(fèi)大量的精力編碼以兼顧各個(gè)瀏覽器之間的差別,來(lái)讓Aajx應(yīng)用能更好的兼容各個(gè)瀏覽器。
2、破壞瀏覽器前進(jìn)、后退按鈕的正常功能
在Ajax中,前進(jìn)和后退按鈕的功能都會(huì)失效,雖然可以通過(guò)一定的方法(添加錨點(diǎn))來(lái)使用戶可以使用前進(jìn)和后退按鈕,但相對(duì)于傳統(tǒng)的方式卻麻煩了很多,對(duì)于用戶而言,他們經(jīng)常會(huì)碰到這種狀況,當(dāng)點(diǎn)擊一個(gè)按鈕觸發(fā)一個(gè)Ajax交互后又覺(jué)得不想這樣做,接著就去習(xí)慣性的單擊后退按鈕,結(jié)果發(fā)生了最不愿意看到的結(jié)果,瀏覽器后退到先前的一個(gè)頁(yè)面,通過(guò)Ajax交互得到的內(nèi)容完全消失了。
3、對(duì)搜索引擎的支持不足
通常搜索引擎都是通過(guò)爬蟲(chóng)來(lái)對(duì)互聯(lián)網(wǎng)上的數(shù)以億計(jì)的海量數(shù)據(jù)進(jìn)行搜索整理的,然而爬蟲(chóng)程序現(xiàn)在還不能理解那些奇怪的JavaScript代碼和因此引起的頁(yè)面內(nèi)容的變化,這使得應(yīng)用Ajax的站點(diǎn)在網(wǎng)絡(luò)推廣上相對(duì)于傳統(tǒng)站點(diǎn)處于劣勢(shì)。
4、開(kāi)發(fā)和調(diào)試工具的缺乏
JavaScript是Ajax的重要組成部分,在目前,由于缺少很好的JavaScript開(kāi)發(fā)和調(diào)試工具,使很多Web開(kāi)發(fā)者對(duì)于JavaScript望而生畏,這對(duì)于編寫(xiě)Ajax代碼就更加苦難了,勇士,目前許多Web開(kāi)發(fā)者已經(jīng)習(xí)慣使用可視化的工具,對(duì)于親自編寫(xiě)代碼有畏懼感,著她在一定程度上影響了大家對(duì)Ajax的應(yīng)用。
番外篇2
jQuery中的Ajax全局事件
jQuery簡(jiǎn)化Ajax操作不僅體現(xiàn)在調(diào)用Ajax方法和處理響應(yīng)方面,而且還體現(xiàn)在對(duì)調(diào)用Ajax方法過(guò)程中的HTTP請(qǐng)求的控制,通過(guò)jQuery提供的一些自定義全局函數(shù),能夠?yàn)楦鞣N與Ajax相關(guān)的事件注冊(cè)回調(diào)函數(shù)。
例如
當(dāng)Ajax請(qǐng)求時(shí),會(huì)觸發(fā)ajaxStart()方法回調(diào)函數(shù)
當(dāng)Ajax請(qǐng)求結(jié)束時(shí),會(huì)觸發(fā)ajaxStop()方法的回調(diào)函數(shù)
這些都是全局函數(shù),因此無(wú)論創(chuàng)建他們的代碼位于何處,只要有Ajax請(qǐng)求時(shí),就會(huì)觸發(fā)他們。
比如,如果圖片加載速度比較慢,可以給用戶一些提示信息,常用的提示信息“加載中...”,代碼如下
<div id="loading>加載中...</div>
然后用css控制元素隱藏,當(dāng)Ajax請(qǐng)求開(kāi)始的時(shí)候,用來(lái)提示用戶正在進(jìn)行,當(dāng)Ajax請(qǐng)求結(jié)束后,將此元素隱藏。代碼如下
$("#loading").ajaxStart(function(){
$(this).show()
});
$("#loading").ajaxStop(function(){
$(this).hide();
})
這樣一來(lái),在Ajax請(qǐng)求過(guò)程中,只要圖片還未加載完,就會(huì)一直顯示“加載中...”的提示信息,看似很簡(jiǎn)單的一個(gè)改進(jìn),確極大的改善用戶的體驗(yàn)。
如果頁(yè)面中還有其他地方也是用Ajax,該提示信息仍然有效,因?yàn)樗侨值摹?br>
jQuery的Ajax全局事件還有幾個(gè)方法,也可以在使用Ajax方法的過(guò)程中為其帶來(lái)方便。
這篇文章還真的挺耗時(shí)。伸懶腰~
累了么,講個(gè)笑話把!
給老婆發(fā)了一個(gè)520元的紅包后加發(fā)一句話:“我愛(ài)你”。
過(guò)了一會(huì)兒老婆回發(fā)了一個(gè)5.20元的紅包,也附加一句話:“我愛(ài)你,比你的還多一點(diǎn)!”
任何時(shí)候不要吝嗇你的贊美,喜歡就點(diǎn)贊咯~