AJAX

Ajax是Asynchronous JavaScript and XML的縮寫客年,這一技術能夠向服務器請求額外的數(shù)據(jù)而無需卸載整個頁面龙填,會帶來良好的用戶體驗漾抬。傳統(tǒng)的HTTP請求流程大概是這樣的潮饱,

1谍婉、瀏覽器向服務器發(fā)送請求
2更啄、服務器根據(jù)瀏覽器傳來數(shù)據(jù)生成response
3稚疹、服務器把response返回給瀏覽器
4、瀏覽器刷新整個頁面顯示最新數(shù)據(jù)
5祭务、這個過程是同步的内狗,順序執(zhí)行

一個簡單的AJAX:

var request = new XMLHttpRequest();
request.onload = function(){
  console.log(this.responseText);
}
request.open("GET","/xxx");
request.send();

AJAX 在瀏覽器與 Web 服務器之間使用異步數(shù)據(jù)傳輸(HTTP 請求)從服務器獲取數(shù)據(jù)

這里的異步是指脫離當前瀏覽器頁面的請求、加載等單獨執(zhí)行义锥,這意味著可以在不重新加載整個網(wǎng)頁的情況下柳沙,通過JavaScript發(fā)送請求、接受服務器傳來的數(shù)據(jù)拌倍,然后操作DOM將新數(shù)據(jù)對網(wǎng)頁的某部分進行更新赂鲤,使用Ajax最直觀的感受是向服務器獲取新數(shù)據(jù)不需要刷新頁面等待了

XMLHttpRequest 對象

Ajax的核心是JavaScript對象XmlHttpRequest噪径,這個對象為向服務器發(fā)送請求和解析服務器響應提供了流暢的接口。XmlHttpRequest可以使用JavaScript向服務器提出請求并處理響應数初,而不阻塞用戶找爱。

XHR對象由IE5率先引入,在IE5中XHR對象是通過MSXML庫中一個ActiveX對象實現(xiàn)的泡孩,根據(jù)IE版本不同可能會遇到不同版本XHR對象车摄,而IE7+與其它現(xiàn)代瀏覽器均支持原生的XHR對象,在這些瀏覽器中我們只需使用XMLHttpRequest構造函數(shù)就可以構造XHR對象仑鸥,因此一個瀏覽器兼容的創(chuàng)建XHR對象的函數(shù)寫法大概是這個樣子

function createXHR(){
var xhr = null;
try {
    // Firefox, Opera 8.0+, Safari吮播,IE7+
    xhr = new XMLHttpRequest();
}
catch (e) {
    // Internet Explorer
    try {
        xhr = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e) {
        try {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {
            xhr = null;
        }
    }
}
return xhr;
}

XHR對象用法

XHR對象有兩個重要方法 open與send



在使用XHR對象時要調(diào)用的第一個方法是open方法

xhr.open('get', 'default.html', true)

這段代碼會針對default.html頁面發(fā)送get請求,關于這段代碼有三點需要注意:

1锈候、URL是相對于當前頁面的路徑薄料,也可以使用絕對路徑
2、調(diào)用open方法并不會真正的發(fā)送請求泵琳,而是初始化一個請求準備發(fā)送
3摄职、只能向同一個域中使用相同協(xié)議和端口的URL發(fā)送請求,否則會因為安全原因報錯(同源策略)

要想把請求發(fā)往服務器需要調(diào)用send方法获列,send方法接受一個參數(shù)谷市,參數(shù)是請求主體要發(fā)送的數(shù)據(jù),如果不需要發(fā)送數(shù)據(jù)則傳入null击孩,在調(diào)用send方法之后請求被發(fā)往服務器迫悠,如下

xhr.send(null);

請求發(fā)往服務器,服務器根據(jù)請求生成響應(Response)巩梢,傳回給XHR對象创泄,在收到響應后相應數(shù)據(jù)會填充到XHR對象的屬性,有四個相關屬性會被填充:

1括蝠、responseText:作為響應主體被返回的文本
2鞠抑、responseXML:如果響應內(nèi)容的類型是”text/xml”或”application/xml”,這個屬性將保存包含著相應數(shù)據(jù)的XML文檔
3忌警、status:響應的HTTP狀態(tài)(200,404,500等)
4搁拙、statusText:HTTP狀態(tài)說明

在收到響應后第一步是檢查響應狀態(tài),確保響應是否成功返回(狀態(tài)為200)法绵,如果成功responseText和responseXML可以被訪問箕速,為了確保響應有效,我們可以這樣檢查狀態(tài)碼

xhr.open('get', 'default.html, false'); //準備同步請求
xhr.send();
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){ 
    //do something
}else{ 
    //error handler
}

上面代碼在發(fā)送同步請求的時候沒問題朋譬,只有得到響應后才會執(zhí)行檢查status語句
但是在異步請求時盐茎,JavaScript會繼續(xù)執(zhí)行,不等生成響應就檢查狀態(tài)碼徙赢,這樣我們不能保證檢查狀態(tài)碼語句是在得到響應后執(zhí)行(實際上也幾乎不可能字柠,服務器再快一個HTTP請求也不會快過一條JavaScript執(zhí)行速度)
這時候我們可以檢查XHR對象的readyState
屬性滑进,該屬性表示請求/響應過程中的當前活動階段,每當readyState值改變的時候都會觸發(fā)一次onreadystatechange
事件


我們可以利用這個事件檢查每次readyState變化的值募谎,當為4的時候表示所有數(shù)據(jù)準備就緒,有一點我們需要注意:必須在open方法之前指定onreadtstatechange事件處理程序

var xhr =createXHR();
xhr.onreadystatechange = function () {
     if (xhr.readyState == 4 && xhr.status == 200) { 
        setContainer('Original Ajax: ' + xhr.responseText);
     }
}
xhr.open('get', 'ajax.aspx?action=getTime', true);
xhr.send();

我們可以在接受響應之前調(diào)用abort方法取消異步請求:

xhr.abort();

HTTP Header

每個HTTP請求都會帶有Header信息阴汇,XHR對象也提供了操作這請求Header和響應Header信息的方法数冬,在默認情況下,發(fā)送HTTP請求還會發(fā)送下列頭部信息

1搀庶、Accept:瀏覽器能夠處理的內(nèi)容類型
2拐纱、Accept-Charset:瀏覽器能夠處理的字符集
3、Accept-Encoding:瀏覽器能夠處理的壓縮編碼
4哥倔、Accept-Language:瀏覽器當前設置的語言
5秸架、Connection:瀏覽器與服務器的連接類型
6、Cookie:當前頁面的cookie
7咆蒿、Referer:發(fā)送請求的頁面的URI

可以使用setRequestHeader方法設置自定義的請求Header信息东抹,這個方法接受兩個參數(shù):

1、頭部字段的名稱
2沃测、頭部字段的值

要想成功發(fā)送頭部信息缭黔,必須在調(diào)用open方法之后,調(diào)用send方法之前調(diào)用setRequestHeader方法蒂破。

function getTime() {
    var xhr = createXHR();
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            setContainer('Original Ajax: ' + xhr.responseText);
        }
    }
    xhr.open('get', 'ajax.aspx?action=getTime', true);
    xhr.setRequestHeader(myHeader,myValue)
    xhr.send();
}

我們可以在服務器端接收自定義Header然后做響應操作馏谨。同時在服務器端也可以向瀏覽器發(fā)送額外的數(shù)據(jù),在沒有自定義信息的情況下我們可以得到默認response header

1附迷、Date:響應時間
2惧互、Server:服務器類型
3、Very:驗證Encoding類型
4喇伯、X-Power-By:語言

GET和POST請求

GET請求是最常見的請求類型喊儡,用于向服務器查詢信息,必要時可以將查詢字符串參數(shù)放在URL尾部發(fā)送給服務器艘刚,如果參數(shù)有特殊字符必須正確編碼管宵。我們上面使用的例子都是使用GET請求,非常簡單攀甚,向服務器詢問數(shù)據(jù)箩朴,然后處理數(shù)據(jù)。

POST請求用于把數(shù)據(jù)作為主體向服務器提交秋度,POST請求主體可以包含多種格式數(shù)據(jù)炸庞,在open方法第一個參數(shù)傳入”POST”就可以初始化一個POST請求。發(fā)送POST請求第二步就是向send方法傳輸數(shù)據(jù)參數(shù)荚斯,參數(shù)可以是xml或者字符串埠居,json等查牌。

相關知識可以看看ASP.NET中使用Ajax

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滥壕,隨后出現(xiàn)的幾起案子纸颜,更是在濱河造成了極大的恐慌,老刑警劉巖绎橘,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胁孙,死亡現(xiàn)場離奇詭異,居然都是意外死亡称鳞,警方通過查閱死者的電腦和手機涮较,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冈止,“玉大人狂票,你說我怎么就攤上這事∥醣” “怎么了闺属?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長周霉。 經(jīng)常有香客問我屋剑,道長,這世上最難降的妖魔是什么诗眨? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任唉匾,我火速辦了婚禮,結果婚禮上匠楚,老公的妹妹穿的比我還像新娘巍膘。我一直安慰自己,他們只是感情好芋簿,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布峡懈。 她就那樣靜靜地躺著,像睡著了一般与斤。 火紅的嫁衣襯著肌膚如雪肪康。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天撩穿,我揣著相機與錄音磷支,去河邊找鬼。 笑死食寡,一個胖子當著我的面吹牛雾狈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抵皱,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼善榛,長吁一口氣:“原來是場噩夢啊……” “哼辩蛋!你這毒婦竟也來了?” 一聲冷哼從身側響起移盆,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤悼院,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咒循,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體樱蛤,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年剑鞍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爽醋。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚁署,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚂四,到底是詐尸還是另有隱情光戈,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布遂赠,位于F島的核電站久妆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏跷睦。R本人自食惡果不足惜筷弦,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抑诸。 院中可真熱鬧烂琴,春花似錦、人聲如沸蜕乡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽层玲。三九已至号醉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辛块,已是汗流浹背畔派。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留润绵,地道東北人父虑。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像授药,于是被迫代替她去往敵國和親士嚎。 傳聞我的和親對象是個殘疾皇子呜魄,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,201評論 0 7
  • 大家好笨蚁,我是IT修真院深圳分院第3期的學員睹晒,一枚正直純潔善良的前端程序員,今天給大家分享一下括细,修真院官網(wǎng)前端工程師...
    大大頭大閱讀 7,667評論 1 72
  • Ajax:Asynchronous JavaScript + XML的簡寫伪很。Ajax技術的核心是XMLHttpRe...
    exialym閱讀 876評論 0 8
  • ajax作為前端開發(fā)必需的基礎能力之一,你可能會使用它奋单,但并不一定懂得其原理锉试,以及更深入的服務器通信相關的知識。在...
    蕭玄辭閱讀 822評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理览濒,服務發(fā)現(xiàn)呆盖,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139