你知道反向ajax嗎?知道反向ajax是怎麼實現的嗎?都不知道,還不快來看這篇文章,介紹了關於反向ajax的詳細資訊。以下開始閱讀本篇
什麼是反向ajax
反向Ajax (Reverse Ajax) 本質上則是這樣的一種概念:能夠從伺服器端傳送數據。在一個標準的HTTP Ajax 請求中,資料是發送給伺服器端的,反向Ajax 可以某些特定的方式來模擬發出一個Ajax 請求,這樣的話,伺服器就可以盡可能快地向客戶端發送事件(低延遲通信)。
反向ajax實作方式
1. 輪詢(Polling)
輪詢其實是一種最笨的實作反向ajax的方法:用javascript在客戶端定時發送ajax請求。
setInterval(function() { $.getJSON('events', function(events) { console.log(events); }); }, 2000);12345
為了盡快取得伺服器端事件,輪詢的間隔(兩次請求相隔的時間)必須盡可能地小。這樣做的缺點就十分明顯:如果間隔減小的話,客戶端瀏覽器就會發出更多的請求,這些請求中的許多都不會返回任何有用的數據,而這將會白白地浪費掉頻寬和處理資源。
2.PiggyBack(捎帶輪詢)
#捎帶輪詢是一種比輪詢更加聰明的做法,因為它會刪除所有非必需的請求(沒有回傳資料的那些)。
它是一種半主動的方式,也就是說還是由Browser主動發出請求,但是每次請求的回應中除了當次的回應之外,還會把上次請求以來已經發生的變化同時發給Browser。
也就是說,當次請求的更新會搭載到下一次請求的回應一併發回。這樣,在Browser的感覺就好像上一次請求又有更新了。但這種感覺取決於Browser向Server發出請求的頻率。如果,第二次請求遲遲沒有發出,那麼上一次的更新就不會拿到。
3. Comet(伺服器推)
這是一種基於 HTTP 長連線的「伺服器推」技術。
實作方式主要有以下兩種:
1)HTTP 流(HTTP Streaming)
在頁面中嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設為對一個長連線的請求或是採用xhr請求,伺服器端就能源來源不斷地在客戶端輸入資料。
優點:訊息即時到達,不發無用請求;管理起來也相對方便。
缺點:伺服器維護一個長連線會增加開銷。
實例: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)
這種情況下,由客戶端向伺服器端發出請求並開啟一個連線。這個連線只有在收到伺服器端的資料之後才會關閉。伺服器端發送完資料之後,就立即關閉連線。客戶端則馬上再開啟一個新的連接,等待下一次的資料。 (想看更多就到PHP中文網AJAX開發手冊欄位中學習)
#優點:在無訊息的情況下不會頻繁的請求,耗費資源小。
缺點:伺服器hold連線會消耗資源,回傳資料順序無保證,難以管理維護。
實例:WebQQ、Hi網頁版、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(); // 递归调用 // 其他错误,如网络错误等 } else { longPolling(); } }, success: function (data, textStatus) { $("#state").append("[state: " + textStatus + ", data: { " + data + "} ]<br/>"); if (textStatus == "success") { // 请求成功 longPolling(); } } }); })(); }); </script>
這篇文章到這就結束了(想看更多就到PHP中文網AJAX使用手冊欄位中學習),有問題的可以在下方留言提問。
以上是反向ajax是什麼?如何實現反向ajax? (精選版)的詳細內容。更多資訊請關注PHP中文網其他相關文章!