摘要:在中,對(duì)象是通過庫中的對(duì)象實(shí)現(xiàn)的??梢詸z測對(duì)象的屬性,該屬性表示請(qǐng)求響應(yīng)過程的當(dāng)前活動(dòng)階段。已經(jīng)調(diào)用但尚未接收到響應(yīng)接收。由于內(nèi)存原因,不建議重用對(duì)象。頭部信息對(duì)象提供了操作請(qǐng)求頭部和響應(yīng)頭部信息的方法。建議使用自定義的頭部名稱。
在IE5中,XHR對(duì)象是通過MSXML庫中的ActiveX對(duì)象實(shí)現(xiàn)的。在IE中可能會(huì)遇到三種不同版本的XHR對(duì)象,即MSXML2.XMLHttp、MSXML2.XMLHttp.3.0和MXSML.XMLHttp.6.0。
適用于IE7之前的瀏覽器的代碼:
function createXHR() { if (typeof arguments.callee.activeXString != "string") { var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"], i, len; for (var i = 0, len = versions.length; i < len; i++) { try { new ActiveXObject(versions[i]); arguments.callee.activeXString = versions[i]; break; } catch (e) { // } } } return new ActiveXObject(arguments.callee.activeXString); }
IE7之后的版本和其他瀏覽器都會(huì)使用下面的函數(shù)來創(chuàng)建:
var xhr = new XMLHttpRequest();
兼容代碼:
function createXHR() { if (typeof XMLHttpRequest != "undefined") { return new XMLHttpRequest(); } else if (typeof ActiveXObject != "undefined") { if (typeof arguments.callee.activeXString != "string") { var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"], i, len; for (var i = 0, len = versions.length; i < len; i++) { try { new ActiveXObject(versions[i]); arguments.callee.activeXString = versions[i]; break; } catch (e) { // } } } return new ActiveXObject(arguments.callee.activeXString); } else { throw new Error("No XHR Object available."); } }
兼容代碼的應(yīng)用:
var xhr = new createXHR();XHR的用法
在使用XHR對(duì)象時(shí),要調(diào)用的第一方法時(shí)
open(),它接收三個(gè)參數(shù):要發(fā)送請(qǐng)求的類型,請(qǐng)求的URL和表示是否異步發(fā)送請(qǐng)求的布爾值。
如:
xhr.open("get", "note.txt", false);
open()表示啟動(dòng)一個(gè)請(qǐng)求以備發(fā)送,send()方法才是真正的發(fā)送;
要發(fā)送特定的請(qǐng)求,要向下面一樣調(diào)用
send()方法:
如:
xhr.open("get", "note.txt", false); xhr.send(null);
XHR從服務(wù)器返回后,發(fā)生變化的屬性,即保存服務(wù)器相應(yīng)數(shù)據(jù)的屬性為:
responseText:作為響應(yīng)主體被返回的文本
responseXML:如果響應(yīng)類型是"text/xml"和"application/xml",則保存著響應(yīng)數(shù)據(jù)的XML DOM文檔
status:響應(yīng)的HTTP狀態(tài)
statusText:HTTP狀態(tài)的說明
一般來說,可以將HTTP狀態(tài)嗎為200作為成功標(biāo)志,此時(shí)responseText屬性內(nèi)容準(zhǔn)備就緒,responseXML也應(yīng)該能夠訪問。此外狀態(tài)嗎為304表示請(qǐng)求的資源沒有被修改,可以直接使用瀏覽器中緩存的版本。
完整代碼如下:
var xhr = new XMLHttpRequest(); xhr.open("get", "note.txt", false); xhr.send(null); if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) { document.write(xhr.responseText); } else { alert("Request was unsuccessful: " + xhr.status); }
要注意的是:
我們?cè)诙鄶?shù)情況下都要發(fā)送異步請(qǐng)求的,才能讓js繼續(xù)執(zhí)行而不必等待響應(yīng)。
可以檢測XHR對(duì)象的readyState屬性,該屬性表示請(qǐng)求/響應(yīng)過程的當(dāng)前活動(dòng)階段。這個(gè)屬性可取的值如下:
0:未初始化。尚未調(diào)用open();
1:啟動(dòng)。已經(jīng)調(diào)用open()但未調(diào)用send();
2:發(fā)送。已經(jīng)調(diào)用send()但尚未接收到響應(yīng);
3:接收。已經(jīng)接收到部分響應(yīng)數(shù)據(jù);
4:完成。已經(jīng)接收到全部響應(yīng)數(shù)據(jù),而且可以在客戶端中使用;
具體格式如下:
var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if ((xhr.status >= 200 && xhr.status <= 300) || xhr.status == 304) { //...... } } }; xhr.open("get", "user.json", true); xhr.send();
舉個(gè)例子:
json文件:
[{ "name": "oliver", "age": 18, "user": true }, { "name": "troy", "age": 26, "user": true }]
dom:
js:
var btn = document.getElementById("btn"), pre = document.getElementById("pre"), obj = null; btn.onclick = function() { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if ((xhr.status >= 200 && xhr.status <= 300) || xhr.status == 304) { console.log(xhr.responseText); obj = JSON.parse(xhr.responseText); pre.innerHTML = obj[1].name; //troy } } }; xhr.open("get", "user.json", true); xhr.send(); };
當(dāng)點(diǎn)擊btn時(shí),pre部分顯示獲取的json文件中的部分信息。
另外在接收到響應(yīng)之前還可以調(diào)用
abort()方法來取消異步請(qǐng)求。
如下所示:
xhr.abort();
在終止請(qǐng)求之后,還應(yīng)該對(duì)XHR對(duì)象進(jìn)行解引用操作。由于內(nèi)存原因,不建議重用XHR對(duì)象。
HTTP頭部信息XHR對(duì)象提供了操作請(qǐng)求頭部和響應(yīng)頭部信息的方法。 在默認(rèn)情況下,在發(fā)送XHR請(qǐng)求同時(shí),還會(huì)發(fā)送下列頭部信息:
Accept: 瀏覽器能夠處理的內(nèi)容類型
Accept - Charset: 瀏覽器能夠顯示的字符集
Accept - Encoding: 瀏覽器能夠處理的壓縮編碼
Accept - Language: 瀏覽器當(dāng)前設(shè)置的語言
Connection: 瀏覽器與服務(wù)器之間連接的類型
Cookie: 當(dāng)前頁面設(shè)置的任何Cookie
Host: 發(fā)送請(qǐng)求的頁面所在的域
Referer: 發(fā)送請(qǐng)求的頁面的URI
User - Agent: 瀏覽器的用戶代理字符串
使用
setRequestHeader()方法可以設(shè)置自定義的請(qǐng)求頭部信息。
這個(gè)方法接收兩個(gè)參數(shù): 頭部字段名和頭部字段值。 要成功發(fā)送請(qǐng)求頭部信息, 必須在調(diào)用open() 方法之后且send() 方法之前調(diào)用它。 建議使用自定義的頭部名稱。如:
var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if ((xhr.status >= 200 && xhr.status <= 300) || xhr.status == 304) { //...... } } }; xhr.open("get", "user.json", true); xhr.setRequestHeader("MyHeader", "MyValue"); //這里定義 xhr.send();
另外,調(diào)用XHR對(duì)象的getResponseHeader()方法傳入頭部字段名稱,可以取得相應(yīng)的響應(yīng)頭部信息。而調(diào)用getAllResponseHeaders()方法則可以取得一個(gè)包含所有頭部信息的長字符串:
var myHeader = xhr.getResponseHeader("MyHeader"); var allHeaders = xhr.getAllResponseHeaders();GET請(qǐng)求
用encodeURIComponent()編碼后的格式如下:
xhr.open("get", "example.php?name1=value1&name2=value2", true);
下面的函數(shù)可以輔助向現(xiàn)有的URL的末尾添加查詢字符串參數(shù):
function addURLParam(url, name, value) { url += (url.indexOf("?") == -1 ? "?" : "&"); //檢查URL是否包含問號(hào)(以確定是否已經(jīng)有參數(shù)存在),沒有就加上問好,否則添加一個(gè)和號(hào) url += encodeURIComponent(name) + "=" + encodeURIComponent(value); return url; }
舉個(gè)例子:
var url = "example.php"; url = addURLParam(url, "name", "oli"); url = addURLParam(url, "book", "js"); xhr.open("get", url, false);POST請(qǐng)求
POST請(qǐng)求通常用于向服務(wù)器發(fā)送應(yīng)該保存的數(shù)據(jù)
使用post提交,要設(shè)置頭部屬性Content-type。如果不設(shè)置,會(huì)出現(xiàn)數(shù)據(jù)無法解碼和獲取等問題。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78742.html
摘要:注意請(qǐng)求和響應(yīng)都不包含信息。對(duì)象的安全機(jī)制部分實(shí)現(xiàn)了的規(guī)范。請(qǐng)求返回后會(huì)觸發(fā)事件,響應(yīng)數(shù)據(jù)保存在屬性中。無論是同源請(qǐng)求還是跨域請(qǐng)求,對(duì)于本地資源最好使用相對(duì),在訪問遠(yuǎn)程資源時(shí)再使用絕對(duì)。發(fā)送請(qǐng)求之后,服務(wù)器決定是否允許這種類型的請(qǐng)求。 通過XHR實(shí)現(xiàn)Ajax通信的一個(gè)主要限制,來源于跨域安全策略。在默認(rèn)情況下,Ajax只能訪問與包含它的頁面位于同一個(gè)域中的資源。但是有時(shí)也需要一些跨域的...
摘要:技術(shù)的核心是對(duì)象即。收到響應(yīng)后,響應(yīng)的數(shù)據(jù)會(huì)自動(dòng)填充對(duì)象的屬性,相關(guān)的屬性有作為響應(yīng)主體被返回的文本。收到響應(yīng)后,一般來說,會(huì)先判斷是否為,這是此次請(qǐng)求成功的標(biāo)志。中的版本會(huì)將設(shè)置為,而中原生的則會(huì)將規(guī)范化為。會(huì)在取得時(shí)報(bào)告的值為。 Ajax(Asynchronous Javascript + XML)技術(shù)的核心是XMLHttpRequest對(duì)象,即: XHR。雖然名字中包含XML,但...
摘要:有以下個(gè)進(jìn)度事件在接收到響應(yīng)數(shù)據(jù)的第一個(gè)字節(jié)時(shí)觸發(fā)。在接收響應(yīng)數(shù)據(jù)期間持續(xù)的觸發(fā)在請(qǐng)求發(fā)生錯(cuò)誤時(shí)觸發(fā)在因調(diào)用方法而終止連接時(shí)觸發(fā)在接收到完整的響應(yīng)數(shù)據(jù)時(shí)觸發(fā)在通信完成或者觸發(fā),,事件后觸發(fā)。 有以下6個(gè)進(jìn)度事件: loadstart: 在接收到響應(yīng)數(shù)據(jù)的第一個(gè)字節(jié)時(shí)觸發(fā)。 progress: 在接收響應(yīng)數(shù)據(jù)期間持續(xù)的觸發(fā) error: 在請(qǐng)求發(fā)生錯(cuò)誤時(shí)觸發(fā) abort: 在因調(diào)用ab...
摘要:并非所有的瀏覽器都完整的實(shí)現(xiàn)了級(jí)的規(guī)范,但是所有的瀏覽器都實(shí)現(xiàn)了它部分的規(guī)范。超時(shí)設(shè)定唯一支持的超時(shí)設(shè)定事件,對(duì)象的事件。方法用于重寫響應(yīng)的類型。它能強(qiáng)迫服務(wù)器返回的數(shù)據(jù)類型給些為本方法提供的類型。 并非所有的瀏覽器都完整的實(shí)現(xiàn)了XMLHttpRequest 2 級(jí)的規(guī)范, 但是所有的瀏覽器都實(shí)現(xiàn)了它部分的規(guī)范。 FormData FormData類型 append()向其添加數(shù)據(jù),...
摘要:由兩部分組成回調(diào)函數(shù)和數(shù)據(jù)?;卣{(diào)函數(shù)是當(dāng)響應(yīng)到來時(shí)應(yīng)該在頁面中調(diào)用的函數(shù),回調(diào)函數(shù)的名字一般是在請(qǐng)求中指定的。下面是以個(gè)的例子回調(diào)函數(shù)的名字就是是通過動(dòng)態(tài)的元素來使用的,使用時(shí)可以為屬性指定一個(gè)跨域。是為與其他傳遞消息的很相似。 圖像Ping技術(shù) 根據(jù)一個(gè)網(wǎng)頁可以從任何網(wǎng)頁中加載圖像而不用擔(dān)心使用跨域的原理, 我們可以動(dòng)態(tài)的創(chuàng)建圖像, 使用他們的onload和onerror事件處理程序...
閱讀 1916·2021-11-24 09:39
閱讀 2583·2021-10-14 09:43
閱讀 3340·2021-10-08 10:10
閱讀 2359·2021-09-22 15:54
閱讀 2361·2019-08-29 17:20
閱讀 1590·2019-08-28 18:14
閱讀 2391·2019-08-26 13:28
閱讀 1129·2019-08-26 12:16