溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

反向ajax怎么實(shí)現(xiàn)

發(fā)布時間:2022-01-20 09:39:14 來源:億速云 閱讀:191 作者:iii 欄目:web開發(fā)

本文小編為大家詳細(xì)介紹“反向ajax怎么實(shí)現(xiàn)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“反向ajax怎么實(shí)現(xiàn)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

反向ajax是指客戶端不必從服務(wù)器獲取信息,服務(wù)器會把相關(guān)信息直接推送到客戶端。在一個標(biāo)準(zhǔn)的HTTP Ajax請求中,數(shù)據(jù)是發(fā)送給服務(wù)器端的,而反向Ajax可用某些特定的方式來模擬發(fā)出一個Ajax請求,讓服務(wù)器盡可能快地向客戶端發(fā)送事件。

本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。

ajax詳解


什么是ajax

ajax即“Asynchronous Javascript And XML”(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。

通過在后臺與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,AJAX 可以使網(wǎng)頁實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進(jìn)行更新。

ajax的由來

該技術(shù)在1998年前后得到了應(yīng)用。

允許客戶端腳本發(fā)送HTTP請求(XMLHTTP)的第一個組件由Outlook Web Access小組寫成。該組件原屬于微軟Exchange Server,并且迅速地成為了Internet Explorer 4.0[3]的一部分。部分觀察家認(rèn)為,Outlook Web Access是第一個應(yīng)用了Ajax技術(shù)的成功的商業(yè)應(yīng)用程序,并成為包括Oddpost的網(wǎng)絡(luò)郵件產(chǎn)品在內(nèi)的許多產(chǎn)品的領(lǐng)頭羊。

但是,真正使得Ajax被大眾所熟知卻是Google。

Google在它著名的交互應(yīng)用程序中使用了異步通訊,如Google討論組、Google地圖、Google搜索建議、Gmail等。Ajax這個詞由《Ajax: A New Approach to Web Applications》一文所創(chuàng),該文的迅速流傳提高了人們使用該項(xiàng)技術(shù)的意識。另外,對Mozilla/Gecko的支持使得該技術(shù)走向成熟,變得更為易用。

ajax的原理

Ajax的工作原理相當(dāng)于在用戶和服務(wù)器之間加了—個中間層(AJAX引擎),使用戶操作與服務(wù)器響應(yīng)異步化。并不是所有的用戶請求都提交給服務(wù)器,像—些數(shù)據(jù)驗(yàn)證和數(shù)據(jù)處理等都交給Ajax引擎自己來做,只有確定需要從服務(wù)器讀取新數(shù)據(jù)時再由Ajax引擎代為向服務(wù)器提交請求。

Ajax其核心有JavaScript、XmlHttpRequest、DOM對象組成,通過XmlHttpRequest對象來向服務(wù)器發(fā)異步請求,從服務(wù)器獲得數(shù)據(jù),然后用JavaScript來操作DOM而更新頁面。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請求數(shù)據(jù)。

讓我們來了解這幾個對象:

1) XMLHTTPRequest對象

Ajax的一個最大的特點(diǎn)是無需刷新頁面便可向服務(wù)器傳輸或讀寫數(shù)據(jù)(又稱無刷新更新頁面),這一特點(diǎn)主要得益于XMLHTTP組件XMLHTTPRequest對象。

XMLHttpRequest 對象方法描述:

反向ajax怎么實(shí)現(xiàn)

XMLHttpRequest 對象屬性描述:

反向ajax怎么實(shí)現(xiàn)

2) JavaScript

前端最吊炸天的語言。

3) DOM Document Object Model

DOM是給HTML和XML文件使用的一組API。它提供了文件的結(jié)構(gòu)表述,讓你可以改變其中的內(nèi)容及可見物。其本質(zhì)是建立網(wǎng)頁與Script或程序語言溝通的橋梁。所有WEB開發(fā)人員可操作及建立文件的屬性、方法及事件都以對象來展現(xiàn)(例如,document就代表“文件本身“這個對像,table對象則代表HTML的表格對象等等)。
這些對象可以由當(dāng)今大多數(shù)的瀏覽器以Script來取用。一個用HTML或XHTML構(gòu)建的網(wǎng)頁也可以看作是一組結(jié)構(gòu)化的數(shù)據(jù),這些數(shù)據(jù)被封在DOM(Document Object Model)中,DOM提供了網(wǎng)頁中各個對象的讀寫的支持。

4) XML

可擴(kuò)展的標(biāo)記語言(Extensible Markup Language)具有一種開放的、可擴(kuò)展的、可自描述的語言結(jié)構(gòu),它已經(jīng)成為網(wǎng)上數(shù)據(jù)和文檔傳輸?shù)臉?biāo)準(zhǔn),用于其他應(yīng)用程序交換數(shù)據(jù) 。

5) 綜合

Ajax引擎,實(shí)際上是一個比較復(fù)雜的JavaScript應(yīng)用程序,用來處理用戶請求,讀寫服務(wù)器和更改DOM內(nèi)容。

JavaScript的Ajax引擎讀取信息,并且互動地重寫DOM,這使網(wǎng)頁能無縫化重構(gòu),也就是在頁面已經(jīng)下載完畢后改變頁面內(nèi)容,這是我們一直在通過JavaScript和DOM在廣泛使用的方法,但要使網(wǎng)頁真正動態(tài)起來,不僅要內(nèi)部的互動,還需要從外部獲取數(shù)據(jù),在以前,我們是讓用戶來輸入數(shù)據(jù)并通過DOM來改變網(wǎng)頁內(nèi)容的,但現(xiàn)在,XMLHTTPRequest,可以讓我們在不重載頁面的情況下讀寫服務(wù)器上的數(shù)據(jù),使用戶的輸入達(dá)到最少。

Ajax使WEB中的界面與應(yīng)用分離(也可以說是數(shù)據(jù)與呈現(xiàn)分離),而在以前兩者是沒有清晰的界限的,數(shù)據(jù)與呈現(xiàn)分離的分離,有利于分工合作、減少非技術(shù)人員對頁面的修改造成的WEB應(yīng)用程序錯誤、提高效率、也更加適用于現(xiàn)在的發(fā)布系統(tǒng)。也可以把以前的一些服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)嫁到客戶端,利于客戶端閑置的處理能力來處理。

ajax的優(yōu)勢

傳統(tǒng)的Web應(yīng)用交互是由用戶觸發(fā)一個HTTP請求到服務(wù)器,服務(wù)器對其進(jìn)行處理后,再返回一個新的HTML頁到客戶端。

每當(dāng)服務(wù)器處理客戶端提交的請求時,客戶都只能空閑等待,并且哪怕只是一次很小的交互、只需從服務(wù)器端得到很簡單的一個數(shù)據(jù),都要返回一個完整的HTML頁,而用戶每次都要浪費(fèi)時間和帶寬去重新讀取整個頁面。

這個做法浪費(fèi)了許多帶寬,由于每次應(yīng)用的交互都需要向服務(wù)器發(fā)送請求,應(yīng)用的響應(yīng)時間就依賴于服務(wù)器的響應(yīng)時間。這導(dǎo)致了用戶界面的響應(yīng)比本地應(yīng)用慢得多。

與此不同,AJAX應(yīng)用可以僅向服務(wù)器發(fā)送并取回必需的數(shù)據(jù),它使用SOAP或其它一些基于XML的Web Service接口,并在客戶端采用JavaScript處理來自服務(wù)器的響應(yīng)。

因?yàn)樵诜?wù)器和瀏覽器之間交換的數(shù)據(jù)大量減少,結(jié)果我們就能看到響應(yīng)更快的應(yīng)用。同時很多的處理工作可以在發(fā)出請求的客戶端機(jī)器上完成,所以Web服務(wù)器的處理時間也減少了。

其實(shí)就一句話,老子不用刷整個頁面就能看到變化了,改變的更迅速了,客戶端分擔(dān)了服務(wù)器的工作,服務(wù)器壓力更小了。

反向ajax怎么實(shí)現(xiàn)

ajax的劣勢

數(shù)據(jù)、接口暴漏,安全性不太好。

反向ajax詳解


什么是反向ajax

反向 Ajax (Reverse Ajax) 本質(zhì)上則是這樣的一種概念:能夠從服務(wù)器端向客戶端發(fā)送數(shù)據(jù)。在一個標(biāo)準(zhǔn)的 HTTP Ajax 請求中,數(shù)據(jù)是發(fā)送給服務(wù)器端的,反向 Ajax 可以某些特定的方式來模擬發(fā)出一個 Ajax 請求,這樣的話,服務(wù)器就可以盡可能快地向客戶端發(fā)送事件(低延遲通信)。

反向ajax實(shí)現(xiàn)方式

1. 輪詢 (Polling)

輪詢其實(shí)是一種最笨的實(shí)現(xiàn)反向ajax的方法:用javascript在客戶端定時發(fā)送ajax請求。

setInterval(function() { 
    $.getJSON('events', function(events) { 
        console.log(events); 
    }); 
}, 2000);

為了盡快地獲得服務(wù)器端事件,輪詢的間隔(兩次請求相隔的時間)必須盡可能地小。這樣做的缺點(diǎn)就十分明顯:如果間隔減小的話,客戶端瀏覽器就會發(fā)出更多的請求,這些請求中的許多都不會返回任何有用的數(shù)據(jù),而這將會白白地浪費(fèi)掉帶寬和處理資源。

2.PiggyBack(捎帶輪詢)

捎帶輪詢是一種比輪詢更加聰明的做法,因?yàn)樗鼤h除掉所有非必需的請求(沒有返回數(shù)據(jù)的那些)。

它是一種半主動的方式,也就是說還是由Browser主動發(fā)出請求,但是每次請求的響應(yīng)中除了當(dāng)次的響應(yīng)之外,還會把上次請求以來已經(jīng)發(fā)生的變化同時發(fā)給Browser。

也就是說,當(dāng)次請求的更新會搭載到下一次請求的響應(yīng)一并發(fā)回。這樣,在Browser的感覺就好像上一次請求又有了更新。但是這種感覺取決于Browser向Server發(fā)出請求的頻率。如果,第二次請求遲遲沒有發(fā)出,那么上一次的更新就不會取到。

3. Comet(服務(wù)器推)

這是一種基于 HTTP 長連接的“服務(wù)器推”技術(shù)。

實(shí)現(xiàn)方式主要有下面兩種:

1)HTTP 流(HTTP Streaming)

在頁面里嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設(shè)為對一個長連接的請求或是采用xhr請求,服務(wù)器端就能源源不斷地往客戶端輸入數(shù)據(jù)。

優(yōu)點(diǎn):消息即時到達(dá),不發(fā)無用請求;管理起來也相對方便。

缺點(diǎn):服務(wù)器維護(hù)一個長連接會增加開銷。

實(shí)例:Gmail聊天

<script type="text/javascript">
    $(function () {
        (function iframePolling() {
            var url = "${pageContext.request.contextPath}/communication/user/ajax.mvc?timed=" + new Date().getTime();
            var $iframe = $('<iframe id="frame" name="polling" style="display: none;" src="' + url + '"></iframe>');
            $("body").append($iframe);

            $iframe.load(function () {
                $("#logs").append("[data: " + $($iframe.get(0).contentDocument).find("body").text() + " ]<br/>");
                $iframe.remove();

                // 遞歸
                iframePolling();
            });
        })();    
    });
</script>

2)HTTP 長輪詢(HTTP Long Polling)

這種情況下,由客戶端向服務(wù)器端發(fā)出請求并打開一個連接。這個連接只有在收到服務(wù)器端的數(shù)據(jù)之后才會關(guān)閉。服務(wù)器端發(fā)送完數(shù)據(jù)之后,就立即關(guān)閉連接。客戶端則馬上再打開一個新的連接,等待下一次的數(shù)據(jù)。

優(yōu)點(diǎn):在無消息的情況下不會頻繁的請求,耗費(fèi)資源小。

缺點(diǎn):服務(wù)器hold連接會消耗資源,返回數(shù)據(jù)順序無保證,難于管理維護(hù)。

實(shí)例:WebQQ、Hi網(wǎng)頁版、Facebook IM。

<script type="text/javascript">
            $(function () {

                (function longPolling() {

                    $.ajax({
                        url: "${pageContext.request.contextPath}/communication/user/ajax.mvc",
                        data: {"timed": new Date().getTime()},
                        dataType: "text",
                        timeout: 5000,
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            $("#state").append("[state: " + textStatus + ", error: " + errorThrown + " ]<br/>");
                            if (textStatus == "timeout") { // 請求超時
                                    longPolling(); // 遞歸調(diào)用

                                // 其他錯誤,如網(wǎng)絡(luò)錯誤等
                                } else { 
                                    longPolling();
                                }
                            },
                        success: function (data, textStatus) {
                            $("#state").append("[state: " + textStatus + ", data: { " + data + "} ]<br/>");

                            if (textStatus == "success") { // 請求成功
                                longPolling();
                            }
                        }
                    });
                })();

            });
        </script>

讀到這里,這篇“反向ajax怎么實(shí)現(xiàn)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI