AJAX

Ajax是Asynchronous JavaScript and XML的縮寫,這一技術能夠向服務器請求額外的數據而無需卸載整個頁面,會帶來良好的用戶體驗。傳統的HTTP請求流程大概是這樣的,

1、瀏覽器向服務器發送請求
2、服務器根據瀏覽器傳來數據生成response
3、服務器把response返回給瀏覽器
4、瀏覽器刷新整個頁面顯示最新數據
5、這個過程是同步的,順序執行

一個簡單的AJAX:

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

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

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

XMLHttpRequest 對象

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

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

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對象時要調用的第一個方法是open方法

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

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

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

要想把請求發往服務器需要調用send方法,send方法接受一個參數,參數是請求主體要發送的數據,如果不需要發送數據則傳入null,在調用send方法之后請求被發往服務器,如下

xhr.send(null);

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

1、responseText:作為響應主體被返回的文本
2、responseXML:如果響應內容的類型是”text/xml”或”application/xml”,這個屬性將保存包含著相應數據的XML文檔
3、status:響應的HTTP狀態(200,404,500等)
4、statusText:HTTP狀態說明

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

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

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


我們可以利用這個事件檢查每次readyState變化的值,當為4的時候表示所有數據準備就緒,有一點我們需要注意:必須在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();

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

xhr.abort();

HTTP Header

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

1、Accept:瀏覽器能夠處理的內容類型
2、Accept-Charset:瀏覽器能夠處理的字符集
3、Accept-Encoding:瀏覽器能夠處理的壓縮編碼
4、Accept-Language:瀏覽器當前設置的語言
5、Connection:瀏覽器與服務器的連接類型
6、Cookie:當前頁面的cookie
7、Referer:發送請求的頁面的URI

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

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

要想成功發送頭部信息,必須在調用open方法之后,調用send方法之前調用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然后做響應操作。同時在服務器端也可以向瀏覽器發送額外的數據,在沒有自定義信息的情況下我們可以得到默認response header

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

GET和POST請求

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

POST請求用于把數據作為主體向服務器提交,POST請求主體可以包含多種格式數據,在open方法第一個參數傳入”POST”就可以初始化一個POST請求。發送POST請求第二步就是向send方法傳輸數據參數,參數可以是xml或者字符串,json等。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容