成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript Ajax與Comet——“XMLHttpRequest對(duì)象”的注意要點(diǎn)

Martin91 / 3274人閱讀

摘要:在中,對(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

相關(guān)文章

  • JavaScript AjaxComet——“跨源資源共享”注意要點(diǎn)

    摘要:注意請(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í)也需要一些跨域的...

    haobowd 評(píng)論0 收藏0
  • AjaxComet-JavaScript高級(jí)程序設(shè)計(jì)第21章讀書筆記(1)

    摘要:技術(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,但...

    imingyu 評(píng)論0 收藏0
  • JavaScript AjaxComet——“進(jìn)度事件”注意要點(diǎn)

    摘要:有以下個(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...

    ad6623 評(píng)論0 收藏0
  • JavaScript AjaxComet——“XMLHttpRequest2級(jí)”注意要點(diǎn)

    摘要:并非所有的瀏覽器都完整的實(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ù),...

    melody_lql 評(píng)論0 收藏0
  • JavaScript AjaxComet——“其他跨域技術(shù)”注意要點(diǎn)

    摘要:由兩部分組成回調(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事件處理程序...

    Hwg 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<