Ajax是什么?及實(shí)現(xiàn)步驟和原理

一他匪、什么是Ajax?

  • Ajax = 異步 JavaScriptXML
  • Ajax是一種用于創(chuàng)建快速動(dòng)態(tài)網(wǎng)頁(yè)的技術(shù)夸研。
  • 通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換邦蜜,Ajax可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下亥至,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新悼沈。
  • 傳統(tǒng)的網(wǎng)頁(yè)(不使用 Ajax)如果需要更新內(nèi)容,必需重載整個(gè)網(wǎng)頁(yè)面姐扮。

?? 有很多使用 Ajax的應(yīng)用程序案例:新浪微博絮供、Google 地圖、開(kāi)心網(wǎng)等等茶敏。
?(注意:Ajax 不是一種新的編程語(yǔ)言杯缺,而是一種用于創(chuàng)建更好更快以及交互性更強(qiáng)的Web應(yīng)用程序的技術(shù)。)

二睡榆、Ajax工作原理

三萍肆、ajax的使用及實(shí)現(xiàn)步驟

??(1) 創(chuàng)建XMLHttpRequest對(duì)象,也就是創(chuàng)建一個(gè)異步調(diào)用對(duì)象.
??(2) 創(chuàng)建一個(gè)新的HTTP請(qǐng)求,并指定該HTTP請(qǐng)求的方法、URL及驗(yàn)證信息.
??(3)設(shè)置響應(yīng)HTTP請(qǐng)求狀態(tài)變化的函數(shù).
??(4)發(fā)送HTTP請(qǐng)求.
??(5)獲取異步調(diào)用返回的數(shù)據(jù).
??(6)使用JavaScript和DOM實(shí)現(xiàn)局部刷新.

以下步驟胀屿,如果不能理解你死記硬背都要記下來(lái)塘揣,總比你答不出來(lái)要好吧!

??1.創(chuàng)建Ajax核心對(duì)象XMLHttpRequest

var xmlHttp;
if(window.XMLHttpRequest){  //針對(duì)除IE6以外的瀏覽器
    xmlHttp=new XMLHttpRequest(); //實(shí)例化一個(gè)XMLHttpRequest
}else{
   xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");   //針對(duì)IE5,IE6
}

??2.向服務(wù)器發(fā)送請(qǐng)求

xmlhttp.open(method,url,async);
xmlhttp.send();

示例如下:

var xmlHttp = new XMLHttpRequest();
   xmlHttp.open('get','demo_get.html','true');//調(diào)用open()方法并采用異步方式
   xmlHttp.send(); //使用open()方法將請(qǐng)求發(fā)送出去
   xmlHttp.onreadystatechange()=>{
        if(xmlHttp.readyState === 4 && xmlHttp.status === 200){
   
        }
}

??onreadystatechange事件可指定一個(gè)事件處理函數(shù)來(lái)處理XMLHttpRequest對(duì)象的執(zhí)行結(jié)果宿崭。

四亲铡、詳解區(qū)分請(qǐng)求類型:GET 或 POST

方法 描述
open(method,url,async) 規(guī)定請(qǐng)求的類型、URL 以及是否異步處理請(qǐng)求葡兑。 ??? method:請(qǐng)求的類型:GET 或 POST奖蔓;??? url:文件在服務(wù)器上的位置,相對(duì)位置或絕對(duì)位置;?? ? async:true(異步)或 false(同步)
send(string) 將請(qǐng)求發(fā)送到服務(wù)器讹堤。string:僅用于 POST 請(qǐng)求

?GET 還是 POST吆鹤?

????與 POST 相比,GET 更簡(jiǎn)單也更快洲守,并且在大部分情況下都能用疑务。

?然而,在以下情況中梗醇,請(qǐng)使用 POST 請(qǐng)求:

  • 無(wú)法使用緩存文件(更新服務(wù)器上的文件或數(shù)據(jù)庫(kù))
  • 向服務(wù)器發(fā)送大量數(shù)據(jù)(POST 沒(méi)有數(shù)據(jù)量限制)
  • 發(fā)送包含未知字符的用戶輸入時(shí)知允,POST 比 GET 更穩(wěn)定也更可靠

  • GET 請(qǐng)求
  • 一個(gè)簡(jiǎn)單的 GET 請(qǐng)求:
xmlHttp.open("GET","demo_get.html",true); 
xmlHttp.send();

??在上面的例子中,您可能得到的是緩存的結(jié)果叙谨。

  • 為了避免這種情況温鸽,請(qǐng)向 URL 添加一個(gè)唯一的 ID
xmlhttp.open("GET","demo_get.html?t=" + Math.random(),true); 
xmlhttp.send();
  • 如果您希望通過(guò) GET 方法發(fā)送信息,請(qǐng)向 URL 添加信息:
xmlhttp.open("GET","demo_get2.html?fname=Henry&lname=Ford",true); 
xmlhttp.send();

提示:GET請(qǐng)求具有以下的幾個(gè)特點(diǎn):

  • GET 請(qǐng)求可被緩存
  • GET 請(qǐng)求保留在瀏覽器歷史記錄中
  • GET 請(qǐng)求可被收藏為書(shū)簽
  • GET 請(qǐng)求不應(yīng)在處理敏感數(shù)據(jù)時(shí)使用
  • GET 請(qǐng)求有長(zhǎng)度限制
  • GET 請(qǐng)求只應(yīng)當(dāng)用于取回?cái)?shù)據(jù)

  • POST 請(qǐng)求
  • 一個(gè)簡(jiǎn)單 POST 請(qǐng)求:
xmlhttp.open("POST","demo_post.html",true); 
xmlhttp.send();

??如果需要像 HTML 表單那樣 POST 數(shù)據(jù)手负,請(qǐng)使用setRequestHeader() 來(lái)添加 HTTP 頭涤垫。然后在send()方法中規(guī)定您希望發(fā)送的數(shù)據(jù):

xmlhttp.open("POST","ajax_test.html",true); 
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
xmlhttp.send("fname=Henry&lname=Ford");
方法 描述
setRequestHeader(header,value) 向請(qǐng)求添加 HTTP頭????? header: 規(guī)定頭的名稱;???? ? value: 規(guī)定頭的值

提示:POST請(qǐng)求的特點(diǎn)如下:

  • POST 請(qǐng)求不會(huì)被緩存
  • POST 請(qǐng)求不會(huì)保留在瀏覽器歷史記錄中
  • POST 請(qǐng)求不能被收藏為書(shū)簽
  • POST 請(qǐng)求對(duì)數(shù)據(jù)長(zhǎng)度沒(méi)有要求

為什么使用 Async=true ?

??我們的實(shí)例在 open() 的第三個(gè)參數(shù)中使用了 "true"虫溜。該參數(shù)規(guī)定請(qǐng)求是否異步處理雹姊。True 表示腳本會(huì)在 send() 方法之后繼續(xù)執(zhí)行,而不等待來(lái)自服務(wù)器的響應(yīng)衡楞。
??onreadystatechange事件使代碼復(fù)雜化了吱雏。但是這是在沒(méi)有得到服務(wù)器響應(yīng)的情況下,防止代碼停止的最安全的方法瘾境。
??通過(guò)把該參數(shù)設(shè)置為 "false"歧杏,可以省去額外的 onreadystatechange 代碼。如果在請(qǐng)求失敗時(shí)是否執(zhí)行其余的代碼無(wú)關(guān)緊要迷守,那么可以使用這個(gè)參數(shù)犬绒。

五、Ajax中的一些處理

    1. 服務(wù)器響應(yīng)處理
      ??responseText 獲得字符串形式的響應(yīng)數(shù)據(jù)兑凿。
      ??responseXML 獲得XML 形式的響應(yīng)數(shù)據(jù)凯力。
    1. 同步處理
  xmlHttp.open("GET","demo_get.html",false);
  xmlHttp.send();
 document.getElementById("target").innerHTML=xmlHttp.responseText;

??直接在send()后面處理返回來(lái)的數(shù)據(jù)茵瘾。

    1. 異步處理

? 異步處理相對(duì)比較麻煩,要在請(qǐng)求狀態(tài)改變事件中處理咐鹤。

xmlHttp.onreadystatechange=function(){//接收到服務(wù)端響應(yīng)時(shí)觸發(fā)
if(xmlHttp.readyState==4&&xmlHttp.status==200){
document.getElementById("target").innerHTML=xmlHttp.responseText;
      }

}

下面是 XMLHttpRequest 對(duì)象的三個(gè)重要的屬性:

屬性 描述
onreadystatechange 存儲(chǔ)函數(shù)(或函數(shù)名)拗秘,每當(dāng) readyState 屬性改變時(shí),就會(huì)調(diào)用該函數(shù)祈惶。
readyState 存有 XMLHttpRequest 的狀態(tài)雕旨。從 0 到 4 發(fā)生變化。????? 0: 請(qǐng)求未初始化捧请;????? 1: 服務(wù)器連接已建立凡涩;???? ? 2: 請(qǐng)求已接收;????? 3: 請(qǐng)求處理中疹蛉;?? ??? 4: 請(qǐng)求已完成活箕,且響應(yīng)已就緒
status ? 200: "OK" ; ? 404: 未找到頁(yè)面

??在 onreadystatechange·事件中氧吐,我們規(guī)定當(dāng)服務(wù)器響應(yīng)已做好被處理的準(zhǔn)備時(shí)所執(zhí)行的任務(wù)讹蘑。
??當(dāng) readyState 等于 4 且狀態(tài)為 200 時(shí),表示響應(yīng)已就緒:

xmlhttp.status:響應(yīng)狀態(tài)碼筑舅。這個(gè)也是面試比較愛(ài)問(wèn)的座慰,這個(gè)必須知道4個(gè)以上(把上面兩個(gè)狀態(tài)碼也列到下邊了),比較常見(jiàn)的有:

  • 200: "OK"
  • 304:該資源在上次請(qǐng)求之后沒(méi)有任何修改(這通常用于瀏覽器的緩存機(jī)制翠拣,使用GET請(qǐng)求時(shí)尤其需要注意)版仔。
  • 403 (禁止) 服務(wù)器拒絕請(qǐng)求。
  • 404 (未找到) 服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)误墓。
  • 408 (請(qǐng)求超時(shí)) 服務(wù)器等候請(qǐng)求時(shí)發(fā)生超時(shí)蛮粮。
  • 500 (服務(wù)器內(nèi)部錯(cuò)誤) 服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求谜慌。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末然想,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子欣范,更是在濱河造成了極大的恐慌变泄,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恼琼,死亡現(xiàn)場(chǎng)離奇詭異妨蛹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晴竞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蛙卤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事颤难∩衲辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵行嗤,是天一觀的道長(zhǎng)瘤袖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)昂验,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任艾扮,我火速辦了婚禮既琴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泡嘴。我一直安慰自己甫恩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布酌予。 她就那樣靜靜地躺著磺箕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抛虫。 梳的紋絲不亂的頭發(fā)上松靡,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音建椰,去河邊找鬼雕欺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棉姐,可吹牛的內(nèi)容都是我干的屠列。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼伞矩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼笛洛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乃坤,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苛让,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后侥袜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蝌诡,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年枫吧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浦旱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡九杂,死狀恐怖颁湖,靈堂內(nèi)的尸體忽然破棺而出宣蠕,到底是詐尸還是另有隱情,我是刑警寧澤甥捺,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布抢蚀,位于F島的核電站,受9級(jí)特大地震影響镰禾,放射性物質(zhì)發(fā)生泄漏皿曲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一吴侦、第九天 我趴在偏房一處隱蔽的房頂上張望屋休。 院中可真熱鬧,春花似錦备韧、人聲如沸劫樟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叠艳。三九已至,卻和暖如春易阳,著一層夾襖步出監(jiān)牢的瞬間附较,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工闽烙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翅睛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓黑竞,卻偏偏與公主長(zhǎng)得像捕发,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子很魂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355