国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript Ajax與Comet——“其他跨域技術(shù)”的注意要點

Hwg / 3060人閱讀

摘要:由兩部分組成回調(diào)函數(shù)和數(shù)據(jù)?;卣{(diào)函數(shù)是當響應(yīng)到來時應(yīng)該在頁面中調(diào)用的函數(shù),回調(diào)函數(shù)的名字一般是在請求中指定的。下面是以個的例子回調(diào)函數(shù)的名字就是是通過動態(tài)的元素來使用的,使用時可以為屬性指定一個跨域。是為與其他傳遞消息的很相似。

圖像Ping技術(shù)

根據(jù)一個網(wǎng)頁可以從任何網(wǎng)頁中加載圖像而不用擔心使用跨域的原理, 我們可以動態(tài)的創(chuàng)建圖像, 使用他們的onload和onerror事件處理程序來確定是否收到響應(yīng)。

動態(tài)的創(chuàng)建圖像經(jīng)常用于圖像Ping。 圖像Ping是與服務(wù)器進行簡單的單向的跨域通信的一種方式。

請求的數(shù)據(jù)通過查詢字符串形式發(fā)送的,而響應(yīng)可以是任意內(nèi)容, 但通常是像素圖或者204響應(yīng)

通過圖像Ping,瀏覽器得不到任何具體的數(shù)據(jù), 但是通過偵聽loaderror事件, 它能知道是什么時候接受的。

var img = new Image();
img.onload = img.onerror = function() {
    alert("Done");
};
img.src = "http://ww.example.com/test?name=seacean";

圖像Ping最常用于跟蹤用戶點擊頁面或動態(tài)廣告曝光次數(shù)。

它有兩個主要的缺點:只能發(fā)送get請求,無法訪問服務(wù)器的響應(yīng)文本。因此, 圖像Ping只能用于瀏覽器與服務(wù)器間的單向通信。

JSONP

JSONP是JSON with padding的簡寫,是應(yīng)用json的一種新方法,在后來的Web服務(wù)中非常流行。

callback({ "name": "Oli" });

JSONP由兩部分組成:回調(diào)函數(shù)和數(shù)據(jù)。

回調(diào)函數(shù)是當響應(yīng)到來時應(yīng)該在頁面中調(diào)用的函數(shù),回調(diào)函數(shù)的名字一般是在請求中指定的。數(shù)據(jù)就是傳入回調(diào)函數(shù)的json數(shù)據(jù)。

下面是以個JSONP的例子:

http: //freegeoip.net/json/?callback=handleResponse //回調(diào)函數(shù)的名字就是handleResponse();

JSONP是通過動態(tài)的script元素來使用的,使用時可以為src屬性指定一個跨域URL。這里的script元素有能力不受限制的同其他域加載資源。因為JSONP是有效地javascript代碼,所以在請求完成后,即在JSONP響應(yīng)加載到頁面后會立即執(zhí)行。

function handlerResponse(response) {
    alert("You"re at IP address " + response.ip + ", where is in " + response.city + ", " + response.region_name);
}
var script = document.createElement("script");
script.src = "http://freegeoip.net/json/?callback=handlerResponse";
document.body.insertBefore(script, document.body.firstChild);

JSONP的優(yōu)勢:

在于簡單易用,直接訪問響應(yīng)文本,支持瀏覽器與服務(wù)器之間的雙向通信。

JSONP的不足之處:

不能確定加載的域是否安全,要確定請求失敗并不容易。為了避免這些,開發(fā)人員的現(xiàn)行方案是用指定時間內(nèi)是否接收到了響應(yīng)來判斷。

Comet

有兩種實現(xiàn)Comet的方式:長輪詢和流。

長輪詢把傳統(tǒng)輪詢顛倒了一下,頁面發(fā)送一個到服務(wù)器的請求,然后服務(wù)器一直保持連接打開,知道有數(shù)據(jù)可發(fā)送。發(fā)送完數(shù)據(jù)后,瀏覽器關(guān)閉連接,隨即又發(fā)起一個到服務(wù)器的新請求。這個過程在頁面打開期間一直不斷持續(xù)。

第二種流行的Comet方式是HTTP流。流在頁面的整個生命周期中只使用一個HTTP連接。具體來說就是瀏覽器向服務(wù)器發(fā)送一個請求,然后服務(wù)器保持連接打開,然后周期性的向瀏覽器發(fā)送數(shù)據(jù)。下面這段php腳本就是采用流實現(xiàn)的服務(wù)器中的常見方式:

$i = 0;
while (true) {
    echo "Number is $i"; //輸出數(shù)據(jù)然后刷新緩存
    flush();
    sleep(10); //停止幾秒
    $i++;
}

這段代碼是實現(xiàn)HTTP流的關(guān)鍵。

下面這段代碼是XHR對象實現(xiàn)HTTP流的典型代碼:

function createStreamingClient(url, progress, finished) {
    var xhr = new XMLHttpRequest(),
        received = 0;
    xhr.open("get", url, true);
    xhr.onreadystatechange = function() {
        var result;
        if (xhr.readyState == 3) {
            result = xhr.responseText.substring(received);
            received += result.length;
            progress(result);
        } else if (xhr.readyState == 4) {
            finished(xhr.responseText);
        }
    };
    xhr.send(null);
    return xhr;
}
var client = createStreamingCilent("streaming.php", function(data) {
    alert("Received:" + data);
}, function(data) {
    alert("Done!");
});

這個createStreamingCilent函數(shù)接收三個參數(shù):要連接的URL,在接收到數(shù)據(jù)時調(diào)用的函數(shù)以及關(guān)閉連接時調(diào)用的函數(shù)。

服務(wù)器發(fā)送事件

SSE( Server - Sent Events, 服務(wù)器發(fā)送事件) 是圍繞只讀Comet交互推出的API或者模式。 SSE API用于創(chuàng)建到服務(wù)器的單向連接, 服務(wù)器通過這個連接可以發(fā)送任意數(shù)量的數(shù)據(jù)。 服務(wù)器響應(yīng)的MIME類型必須是text / event - stream, 而且是瀏覽器中的Javascript API能解析的格式輸出。 SSE支持短輪詢, 長輪詢和HTTP流, 而且能夠在斷開連接時自動確定何時重新連接。

SSE API

SSE是為javascript api與其他傳遞消息的javascript api很相似。 要預(yù)定新的事件流, 要創(chuàng)建新的EventSource對象, 并傳入一個入口點:

var source = new EventSource("myevents.php");

注意: 要傳入的URL必須與創(chuàng)建對象的頁面同源。 EventSource的實例有一個readyState屬性, 值為0表示正連接到服務(wù)器, 值為1表示打開了連接, 值為2表示關(guān)閉連接。 另外還有三個事件:

open: 在建立連接時觸發(fā)

message: 在從服務(wù)器接收到新事件時觸發(fā)

error: 在無法建立連接時觸發(fā)

服務(wù)器返回的數(shù)據(jù)以字符串的格式保存在event.data中。 如果想強制立即斷開并且不再重新連接, 可以調(diào)用close() 方法。

事件流

多段數(shù)據(jù)發(fā)送時, 要以換行符進行分隔不同段的數(shù)據(jù)。 而且還可以在每段數(shù)據(jù)的前面或者后面附加ID, 以便多段數(shù)據(jù)的拼接。 在設(shè)置了ID之后, EventSource對象會跟蹤上一次觸發(fā)的事件。 如果連接斷開, 會向服務(wù)器發(fā)送一個包含名為Last - Event - ID的特殊HTTP頭部請求, 以便服務(wù)器知道下次觸發(fā)那個事件。 在多次連接的事件流中, 這種機制保證了瀏覽器能夠以正確的順序接收到連接的數(shù)據(jù)段。

Web Sockets

在js中web sockets使用了自定義的協(xié)議。 未加密的協(xié)議是ws: //;加密的協(xié)議是wss://.目前支持它的的瀏覽器有FireFox6+,safari5+,Chrome,IOS4+版safari。

創(chuàng)建web sockets的例子:

var sockets = new WebSockets("ws://www.example.com/server.php");

注意, 必須給WebSockets構(gòu)造函數(shù)傳入絕對的URL。 同源策略對它不適用。 能否與特定的域通信完全取決于服務(wù)器。

sockets.close(); //關(guān)閉
sockets.send("Hello word"); //可以發(fā)送字符串,json格式的字符串

sockets的事件有onmessage: 服務(wù)器向客戶端發(fā)送消息, sockets會觸發(fā); onopen: 成功建立連接時觸發(fā); onerror: 在發(fā)生錯誤時觸發(fā), 連接時不能持續(xù); onclose: 在連接關(guān)閉時觸發(fā)。 在close事件中的event對象有三個額外的屬性: wasClean, code, reason.第一個參數(shù)表示連接是否明確的關(guān)閉, 布爾值。 第二個是服務(wù)器返回的數(shù)值狀態(tài)碼, 而reason是一個字符串, 包含服務(wù)器返回的信息。

Web Sockets協(xié)議比同于HTTP, 現(xiàn)有的服務(wù)器不能用Web Sockets通信, HTTP可以滿足要求。 如果只需要向服務(wù)器請求數(shù)據(jù), 那么SSE比較容易, 要是雙向的通信Web Sockets更好一些。 在不能使用Web Sockets的情況下, 組合XHR + SSE也能實現(xiàn)雙向通信。

在AJAX安全方面, 下列措施是得力的:
要求以SSL連接來訪問可以通過XHR請求的資源
要求每一次請求都要附帶經(jīng)過相應(yīng)算法計算得到的驗證碼

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/78752.html

相關(guān)文章

  • JavaScript AjaxComet——“進度事件”注意要點

    摘要:有以下個進度事件在接收到響應(yīng)數(shù)據(jù)的第一個字節(jié)時觸發(fā)。在接收響應(yīng)數(shù)據(jù)期間持續(xù)的觸發(fā)在請求發(fā)生錯誤時觸發(fā)在因調(diào)用方法而終止連接時觸發(fā)在接收到完整的響應(yīng)數(shù)據(jù)時觸發(fā)在通信完成或者觸發(fā),,事件后觸發(fā)。 有以下6個進度事件: loadstart: 在接收到響應(yīng)數(shù)據(jù)的第一個字節(jié)時觸發(fā)。 progress: 在接收響應(yīng)數(shù)據(jù)期間持續(xù)的觸發(fā) error: 在請求發(fā)生錯誤時觸發(fā) abort: 在因調(diào)用ab...

    ad6623 評論0 收藏0
  • JavaScript AjaxComet——“XMLHttpRequest2級”注意要點

    摘要:并非所有的瀏覽器都完整的實現(xiàn)了級的規(guī)范,但是所有的瀏覽器都實現(xiàn)了它部分的規(guī)范。超時設(shè)定唯一支持的超時設(shè)定事件,對象的事件。方法用于重寫響應(yīng)的類型。它能強迫服務(wù)器返回的數(shù)據(jù)類型給些為本方法提供的類型。 并非所有的瀏覽器都完整的實現(xiàn)了XMLHttpRequest 2 級的規(guī)范, 但是所有的瀏覽器都實現(xiàn)了它部分的規(guī)范。 FormData FormData類型 append()向其添加數(shù)據(jù),...

    melody_lql 評論0 收藏0
  • JavaScript AjaxComet——“XMLHttpRequest對象”注意要點

    摘要:在中,對象是通過庫中的對象實現(xiàn)的??梢詸z測對象的屬性,該屬性表示請求響應(yīng)過程的當前活動階段。已經(jīng)調(diào)用但尚未接收到響應(yīng)接收。由于內(nèi)存原因,不建議重用對象。頭部信息對象提供了操作請求頭部和響應(yīng)頭部信息的方法。建議使用自定義的頭部名稱。 在IE5中,XHR對象是通過MSXML庫中的ActiveX對象實現(xiàn)的。在IE中可能會遇到三種不同版本的XHR對象,即MSXML2.XMLHttp、MSXML...

    Martin91 評論0 收藏0
  • JavaScript AjaxComet——“跨源資源共享”注意要點

    摘要:注意請求和響應(yīng)都不包含信息。對象的安全機制部分實現(xiàn)了的規(guī)范。請求返回后會觸發(fā)事件,響應(yīng)數(shù)據(jù)保存在屬性中。無論是同源請求還是跨域請求,對于本地資源最好使用相對,在訪問遠程資源時再使用絕對。發(fā)送請求之后,服務(wù)器決定是否允許這種類型的請求。 通過XHR實現(xiàn)Ajax通信的一個主要限制,來源于跨域安全策略。在默認情況下,Ajax只能訪問與包含它的頁面位于同一個域中的資源。但是有時也需要一些跨域的...

    haobowd 評論0 收藏0
  • 高程3總結(jié)#第21章AjaxComet

    摘要:頁面發(fā)起一個到服務(wù)器的請求,然后服務(wù)器一直保持連接打開,直到有數(shù)據(jù)可發(fā)送。 Ajax與Comet XMLHttpRequest對象 IE5是第一款引入XHR對象的瀏覽器,在IE5中,XHR對象是通過MSXML庫中的一個ActiveX對象實現(xiàn)的 //適用于 IE7 之前的版本 function createXHR(){ if (typeof arguments.callee.acti...

    MudOnTire 評論0 收藏0

發(fā)表評論

0條評論

Hwg

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<