JavaScript基礎(chǔ)知識(shí)總結(jié)——ajax基礎(chǔ)

Ajax

  • AJAX即“Asynchronous Javascript And XML”( 異步 JavaScript和XML)祟昭,AJAX不是一種新的編程語(yǔ)言臊恋,而是一種用于創(chuàng)建更好更快以及交互性更強(qiáng)的 Web 應(yīng)用程序的技術(shù)。它是一套綜合了多項(xiàng)技術(shù)的瀏覽器端網(wǎng)頁(yè)開發(fā)技術(shù)虱肄。這些技術(shù)包括Javascript致板、XHTML和CSS、DOM浩峡、XML和XMLHttpRequest.
  • 通過(guò)在瀏覽器與服務(wù)器進(jìn)行少量數(shù)據(jù)交換可岂,AJAX 可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下翰灾,對(duì)網(wǎng)頁(yè)的局部更新缕粹。
  • 優(yōu)點(diǎn):
    1.使用Ajax的最大優(yōu)點(diǎn),就是能在不更新整個(gè)頁(yè)面的前提下維護(hù)數(shù)據(jù)纸淮。這使得Web應(yīng)用程序更為迅捷地響應(yīng)用戶動(dòng)作平斩,并避免了在網(wǎng)絡(luò)上發(fā)送那些沒(méi)有改變的html代碼信息。
    2.減輕服務(wù)器負(fù)擔(dān)咽块,按需要獲得數(shù)據(jù)绘面。
    3.無(wú)刷新更新頁(yè)面,減少用戶的實(shí)際和心理的等待時(shí)間侈沪。
    4.更好的用戶體驗(yàn)揭璃。
    5.減輕寬帶的負(fù)擔(dān)。
    6.主流瀏覽器支持
  • 缺點(diǎn):
    1.AJAX大量使用了Javascript和AJAX引擎亭罪,而這個(gè)取決于瀏覽器的支持瘦馍。IE5.0及以上、Mozilla1.0应役、NetScape7及以上版本才支持情组,Mozilla雖然也支持AJAX燥筷,但是提供XMLHttpRequest的方式不一樣。所以院崇,使用AJAX的程序必須測(cè)試針對(duì)各個(gè)瀏覽器的兼容性肆氓。
    2.AJAX更新頁(yè)面內(nèi)容的時(shí)候并沒(méi)有刷新整個(gè)頁(yè)面,因此底瓣,網(wǎng)頁(yè)的后退功能是失效的谢揪;有的用戶還經(jīng)常搞不清楚現(xiàn)在的數(shù)據(jù)是舊的還是已經(jīng)更新過(guò)的。這個(gè)就需要在明顯位置提醒用戶“數(shù)據(jù)已更新”濒持。
    3.對(duì)搜索引擎支持不好键耕。

XMLHttpRequest 對(duì)象

Ajax主要通過(guò)使用XMLHttpRequest對(duì)象來(lái)實(shí)現(xiàn)異步數(shù)據(jù)交互和通信
1.非IE瀏覽器和高版本的IE瀏覽器

var xhr = new XMLHttpRequest();

2.老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 對(duì)象

var xhr = new ActiveXObject("Microsoft.XMLHTTP");

3.兼容處理

//Ajax.js    
function createAjax() {
  var xhr ;
  if(window.XMLHttpRequest){
    //所有現(xiàn)代瀏覽器 (IE7+、Firefox柑营、Chrome、Safari 以及 Opera) 都內(nèi)建了 XMLHttpRequest 對(duì)象村视。
    xhr = new XMLHttpRequest();
  }else {
    //老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 對(duì)象:
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
  }

  return xhr;
}
  • XHR的用法
    1.方法:
方法名 注釋
abort 取消當(dāng)前請(qǐng)求
getAllResponseHeaders 獲取響應(yīng)的所有http頭
open(方式get/post官套,url地址,同步異步 創(chuàng)建一個(gè)新的http請(qǐng)求蚁孔,打開請(qǐng)求奶赔,并指定此請(qǐng)求的方法、URL以及驗(yàn)證信息(用戶名/密碼)
send() 發(fā)送請(qǐng)求到http服務(wù)器并接收回應(yīng)
setRequestHeader 單獨(dú)指定請(qǐng)求的某個(gè)http頭杠氢,header()設(shè)置http頭協(xié)議信息

2.屬性:

方法名 注釋
onreadystatechange 指定當(dāng)readyState屬性改變時(shí)的事件處理句柄站刑。
readyState 返回當(dāng)前請(qǐng)求的狀態(tài),ajax行進(jìn)過(guò)程中不同狀態(tài)
responseBody 將回應(yīng)信息正文以u(píng)nsigned byte數(shù)組形式返回
responseStream 以Ado Stream對(duì)象的形式返回響應(yīng)信息鼻百。
responseText 將響應(yīng)信息作為字符串返回.只讀
responseXML 將響應(yīng)信息格式化為Xml Document對(duì)象并返回绞旅,只讀
status 返回當(dāng)前請(qǐng)求的http狀態(tài)碼. 200 ok 304 緩存 ; 404 not found; 403 沒(méi)有權(quán)限 501 服務(wù)器級(jí)別錯(cuò)誤
statusText 返回當(dāng)前請(qǐng)求的響應(yīng)行狀態(tài)文本温艇, ok not found forbidden

3.基本使用:

//>>1.創(chuàng)建Ajax引擎對(duì)象
var xmlHttpRequest= createAjax();
//>>2.設(shè)置發(fā)送請(qǐng)求時(shí)需要具備的數(shù)據(jù)
  //>>2.1.指定請(qǐng)求url地址(注意還沒(méi)有發(fā)出請(qǐng)求僅僅是設(shè)置請(qǐng)求地址和請(qǐng)求方式)
  xmlHttpRequest.open('GET/POST','url地址',[ '是否異步']);
  //>>2.2.監(jiān)聽(tīng)Ajax引擎對(duì)象的改變
  xmlHttpRequest.onreadystatechange=function(){
      //當(dāng)請(qǐng)求和響應(yīng)同時(shí)完成,從Ajax引擎中獲取響應(yīng)內(nèi)容,然后通過(guò)javascript對(duì)網(wǎng)頁(yè)進(jìn)行操作
      if (xmlHttpRequest.readyState==4 && xmlHttpRequest.status==200){
          //根據(jù)相應(yīng)內(nèi)容對(duì)網(wǎng)頁(yè)進(jìn)行操作的代碼通常寫在這里
          // xmlHttpRequest. responseText
//          //xmlHttpRequest. responseXML
      }
  }
//>>3.發(fā)送請(qǐng)求
xmlHttpRequest.send([post請(qǐng)求參數(shù)字符串])
  • HTTP頭部信息
    每個(gè)HTTP請(qǐng)求和響應(yīng)都會(huì)帶有相應(yīng)的頭部信息因悲,XHR對(duì)象也提供了操作這兩種頭部信息的方法。
    默認(rèn)情況下勺爱,在發(fā)送XHR請(qǐng)求的同時(shí)還會(huì)發(fā)送下列頭部:
    1.Accept
    2.Accept-Charset
    3.Accept-Encoding
    4.Accept-Language
    5.Connection
    6.Cookie
    7.Host
    8.Referer
    9.User-Agent
    使用setRequestHeader()方法可以設(shè)置自定義的請(qǐng)求頭部晃琳。參數(shù)為頭部字段的名稱和頭部字段的值。這個(gè)要在open和send之間調(diào)用才有效琐鲁。
    在使用這個(gè)方法時(shí)卫旱,建議使用自定義的頭部名,以免與瀏覽器發(fā)生沖突围段,有的瀏覽器可能不允許開發(fā)人員重寫默認(rèn)頭部顾翼。
    想要獲得頭部的值可以使用下面這兩種方法。
xhr.setRequestHeader("MyHeader", "MyValue");

var myHeader = xhr.getResponseHeader("MyHeader");
var allHeaders = xhr.getAllResponseHeaders();
  • GET請(qǐng)求
    用于向服務(wù)器查詢某些信息蒜撮,將參數(shù)放到后面暴构。使用addURLParam就是保證URI被正確編碼跪呈,格式良好。
var xhr = new XMLHttpRequest();
function addURLParam(url, name, value) {
    url += (url.indexOf("?") == -1 ? "?" : "&");
    url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
    return url;
}
var url = "example.php";
url = addURLParam(url, "name", "Nicholas");
url = addURLParam(url, "book", "Professional JavaScript");

xhr.open("get", url, true);
xhr.send(null);
  • POST請(qǐng)求
    用于向服務(wù)器發(fā)送應(yīng)該保存的數(shù)據(jù)取逾,POST請(qǐng)求應(yīng)該會(huì)發(fā)送很多的數(shù)據(jù)到服務(wù)器耗绿。這時(shí)send的參數(shù)就是發(fā)送的數(shù)據(jù)了。一般是數(shù)據(jù)序列化后的字符串砾隅。
var xhr = new XMLHttpRequest();
xhr.open("post", "postexample.php", true);
//模仿表單提交
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var form = document.getElementById("user-info");
xhr.send(serialize(form));
<?php
  header("Content-type: text/plain");
  echo <<<EOF
Name:{$_POST['user-name'};
Emial:{$_POST('user-email')};
EOF;

GET請(qǐng)求消耗的資源少误阻,同等數(shù)據(jù)量是POST的兩倍。

XMLHttpRequest 二級(jí)

  • FormData
    Web應(yīng)用中頻繁使用的一項(xiàng)功能就是表單數(shù)據(jù)的序列化晴埂。為此究反,2級(jí)定義了FormData對(duì)象。
    append方法可以向其添加數(shù)據(jù)儒洛,鍵值對(duì)形式
    也可以直接使用表單初始化FormData:
//鍵值對(duì)形式
var data = new FormData();
data.append("name", "Nicholas");
//使用表單初始化FormData
var data = new FormData(document.forms[0]);
xhr.send(data);
  • 超時(shí)限定
    2級(jí)中又規(guī)定了一個(gè)timeout屬性精耐,表示請(qǐng)求在等待響應(yīng)多少毫秒之后就終止。設(shè)置之后琅锻,如果超時(shí)沒(méi)有接收到響應(yīng)卦停,就回觸發(fā)timeout事件,調(diào)用事件處理程序恼蓬,這時(shí)xhr.readyState可能已經(jīng)為4了惊完,但是此時(shí)請(qǐng)求已經(jīng)中止了,不能再訪問(wèn)xhr.status处硬,所以如果使用timeout小槐,onreadystatechange事件處理也要小心。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
    if (xhr.readyState == 4){
        try {
            if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                alert(xhr.responseText);
            } else {
                alert("Request was unsuccessful: " + xhr.status);
            }
        } catch (ex){

        }
    }
};
xhr.open("get", "timeout.php", true);
xhr.timeout = 1000; //      IE8+
xhr.ontimeout = function(){
    alert("Request did not return in a second.");
};
xhr.send(null);
  • overrideMimetype()
    重寫XHR響應(yīng)的MIME類型荷辕,因?yàn)轫憫?yīng)的MIME類型決定了XHR對(duì)象如何處理它凿跳。如果服務(wù)器返回的是XML文件,MIME卻是text/plain桐腌,那XHR對(duì)象就不能正確的設(shè)置responseXML拄显。
    要在send之前調(diào)用這個(gè)方法。
var xhr = createXHR(); xhr.open("get", "text.php", true); xhr.overrideMimeType("text/xml"); xhr.send(null);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末案站,一起剝皮案震驚了整個(gè)濱河市躬审,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟆盐,老刑警劉巖承边,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異石挂,居然都是意外死亡博助,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門痹愚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)富岳,“玉大人蛔糯,你說(shuō)我怎么就攤上這事〗咽剑” “怎么了蚁飒?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)萝喘。 經(jīng)常有香客問(wèn)我淮逻,道長(zhǎng),這世上最難降的妖魔是什么阁簸? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任爬早,我火速辦了婚禮,結(jié)果婚禮上启妹,老公的妹妹穿的比我還像新娘筛严。我一直安慰自己,他們只是感情好饶米,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布脑漫。 她就那樣靜靜地躺著,像睡著了一般咙崎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吨拍,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天褪猛,我揣著相機(jī)與錄音,去河邊找鬼羹饰。 笑死伊滋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的队秩。 我是一名探鬼主播笑旺,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼馍资!你這毒婦竟也來(lái)了筒主?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸟蟹,失蹤者是張志新(化名)和其女友劉穎乌妙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體建钥,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藤韵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熊经。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泽艘。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欲险,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匹涮,到底是詐尸還是另有隱情天试,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布焕盟,位于F島的核電站秋秤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏脚翘。R本人自食惡果不足惜灼卢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望来农。 院中可真熱鬧鞋真,春花似錦、人聲如沸沃于。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)繁莹。三九已至檩互,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咨演,已是汗流浹背闸昨。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薄风,地道東北人饵较。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像遭赂,于是被迫代替她去往敵國(guó)和親循诉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容