1. 程式人生 > >AJAX的原理-如何做到非同步和區域性重新整理

AJAX的原理-如何做到非同步和區域性重新整理

Overriew: onReadyStateChange被回撥函式賦值,則能實現非同步呼叫,回撥函式直接操作DOM,則能實現區域性重新整理。那麼XMLHttpRequest的onReadyStateChange如何知道服務ready了呢?狀態如何change了呢(觀察者模式)?則是通過客戶端對服務的狀態詢問(定期輪詢)所實現的。


參考:http://www.cnblogs.com/mingmingruyuedlut/archive/2011/10/18/2216553.html

詳解:

1. XMLHttpRequest 負責與伺服器端的通訊,其內部有很多重要的屬性:readyStatus=4,status=200等等。當XMLHttpRequest

的整體狀態並且保證它已經完成(readyStatus=4),即資料已經發送完畢。然後根據伺服器的設定詢問(類似於客戶端會輪詢伺服器的返回狀態,仍然是http短連線,並非長連線的伺服器端push)請求狀態,如果一切已經就緒(status=200),那麼就執行需要的操作。

操作一般就是直接操作DOM,所以AJAX能做到所謂的“無重新整理”使用者體驗

[javascript] view plain copy
  1. document.getElementById("user1").innerHTML = "資料正在載入...";  
  2.             if (xmlhttp.status == 200) {  
  3.                 document.write(xmlhttp.responseText);  
  4.             }  


2. 那麼在AJAX客戶端如何做到的非同步呢?實際上就是Javascript的回撥函式起的作用

提供一個回撥JavaScript函式,一旦伺服器響應可用,該函式就被執行

業務函式:

[javascript] view plain copy
  1. function castVote(rank) {  
  2.   var url = "/ajax-demo/static-article-ranking.html";  
  3.   var callback = processAjaxResponse;  
  4.   executeXhr(callback, url);  
  5. }  

需要非同步通訊的函式:[javascript]
 view plain copy
  1. function executeXhr(callback, url) {  
  2.   // branch for native XMLHttpRequest object
  3.   if (window.XMLHttpRequest) {  
  4.     req = new XMLHttpRequest();  
  5.     req.onreadystatechange = callback;  
  6.     req.open("GET", url, true);  
  7.     req.send()(null);  
  8.   } // branch for IE/Windows ActiveX version
  9.   elseif (window.ActiveXObject) {  
  10.     req = new ActiveXObject("Microsoft.XMLHTTP");  
  11.     if (req) {  
  12.       req.onreadystatechange = callback;  
  13.       req.open("GET", url, true);  
  14.       req.send()();  
  15.     }  
  16.   }  
  17. }  

req.onreadystatechange = callback
req.open("GET", url, true)

第一行定義了JavaScript回撥函式,一旦響應就緒它就自動執行,而req.open()方法中所指定的“true”標誌說明想要非同步執行該請求。
一旦伺服器處理完XmlHttpRequest並返回給瀏覽器,使用req.onreadystatechange指派所設定的回撥方法將被自動呼叫。

回撥函式:

[javascript] view plain copy
  1. function processAjaxResponse() {  
  2.   if (req.readyState == 4) {  
  3.     // only if "OK"
  4.     if (req.status == 200) {  
  5.       document.getElementById("user1").innerHTML = req.responseText;  
  6.     } else {  
  7.       alert("There was a problem retrieving the XML data:  
  8. " + req.statusText);  
  9.     }  
  10.   }  
  11. }  

Overriew: onReadyStateChange被回撥函式賦值,則能實現非同步呼叫,回撥函式直接操作DOM,則能實現區域性重新整理。那麼XMLHttpRequest的onReadyStateChange如何知道服務ready了呢?狀態如何change了呢(觀察者模式)?則是通過客戶端對服務的狀態詢問(定期輪詢)所實現的。


參考:http://www.cnblogs.com/mingmingruyuedlut/archive/2011/10/18/2216553.html

詳解:

1. XMLHttpRequest 負責與伺服器端的通訊,其內部有很多重要的屬性:readyStatus=4,status=200等等。當XMLHttpRequest的整體狀態並且保證它已經完成(readyStatus=4),即資料已經發送完畢。然後根據伺服器的設定詢問(類似於客戶端會輪詢伺服器的返回狀態,仍然是http短連線,並非長連線的伺服器端push)請求狀態,如果一切已經就緒(status=200),那麼就執行需要的操作。

操作一般就是直接操作DOM,所以AJAX能做到所謂的“無重新整理”使用者體驗

[javascript] view plain copy
  1. document.getElementById("user1").innerHTML = "資料正在載入...";  
  2.             if (xmlhttp.status == 200) {  
  3.                 document.write(xmlhttp.responseText);  
  4.             }  


2. 那麼在AJAX客戶端如何做到的非同步呢?實際上就是Javascript的回撥函式起的作用

提供一個回撥JavaScript函式,一旦伺服器響應可用,該函式就被執行

業務函式:

[javascript] view plain copy
  1. function castVote(rank) {  
  2.   var url = "/ajax-demo/static-article-ranking.html";  
  3.   var callback = processAjaxResponse;  
  4.   executeXhr(callback, url);  
  5. }  

需要非同步通訊的函式:[javascript] view plain copy
  1. function executeXhr(callback, url) {  
  2.   // branch for native XMLHttpRequest object
  3.   if (window.XMLHttpRequest) {  
  4.     req = new XMLHttpRequest();  
  5.     req.onreadystatechange = callback;  
  6.     req.open("GET", url, true);  
  7.     req.send()(null);  
  8.   } // branch for IE/Windows ActiveX version
  9.   elseif (window.ActiveXObject) {  
  10.     req = new ActiveXObject("Microsoft.XMLHTTP");  
  11.     if (req) {  
  12.       req.onreadystatechange = callback;  
  13.       req.open("GET", url, true);  
  14.       req.send()();  
  15.     }  
  16.   }  
  17. }  

req.onreadystatechange = callback
req.open("GET", url, true)

第一行定義了JavaScript回撥函式,一旦響應就緒它就自動執行,而req.open()方法中所指定的“true”標誌說明想要非同步執行該請求。
一旦伺服器處理完XmlHttpRequest並返回給瀏覽器,使用req.onreadystatechange指派所設定的回撥方法將被自動呼叫。

回撥函式:

[javascript] view plain copy
  1. function processAjaxResponse() {  
  2.   if (req.readyState == 4) {  
  3.     // only if "OK"
  4.     if (req.status == 200) {  
  5.       document.getElementById("user1").innerHTML = req.responseText;  
  6.     } else {  
  7.       alert("There was a problem retrieving the XML data:  
  8. " + req.statusText);  
  9.     }  
  10.   }  
  11. }  

轉載自:http://blog.csdn.net/fyxxq/article/details/22219361

相關推薦

AJAX原理-如何做到非同步區域性重新整理

Overriew: onReadyStateChange被回撥函式賦值,則能實現非同步呼叫,回撥函式直接操作DOM,則能實現區域性重新整理。那麼XMLHttpRequest的onReadyStateChange如何知道服務ready了呢?狀態如何change了呢(觀察者模式)

ajax實現分頁的區域性重新整理(基於Jeesite框架)

因為jeesite框架帶的分頁實現它的重新整理是整個jsp頁面的重新整理,所以這一點就很苦惱。下面我用ajax來解決這個問題。 點選分頁時觸發ajax事件,將後臺需要的引數通過ajax傳過去,然後後臺返回的資料再ajax裡畫的html部分顯示出來,主意你需要重新整理拿個部分

使用Ajax在HTML頁面中區域性重新整理頁面(左邊選單右邊頁面)

index.html<a href="javascript:void(0);" onclick="loadXMLDoc('member.html')">檢視使用者</a><div id="mainbody">歡迎登入!</div>

ionic頁面快取區域性重新整理

最近兩天在做專案時,發現ionic的快取功能非常方便好用,提高了再低端手機特別是android比較低版本上的流暢性!可是,後來發現,整體的快取整個頁面並不是一個一勞永逸的辦法,結合區域性重新整理功能,感覺就完美極了!建議有一定的ionic基礎。 面, 1.根據想實現快

JS與Ajax實現非同步區域性重新整理原理

function sendGet() { //開啟子執行緒的物件(需要考慮瀏覽器的相容性) var xmlhttp; if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼 xmlhttp=n

Ajax實現區域性重新整理非同步處理簡單應用(實現簡單註冊驗證)

4.//從資料庫中查詢相應欄位並反饋給servlet 部分 @SuppressWarnings({ "unused", "null" })  public User find(String name){   List<Map<String,Object>> lists=new Arra

ajax非同步載入 實現區域性重新整理

這是用jquery進行資料互動<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-2.1.0.js"></script> <scri

利用ajaxJSP技術實現網頁中表單的區域性重新整理(只重新整理表單資料,而不重新整理整個頁面)

在web開發中有時有區域性重新整理的需求,這樣做的好處是克服了頁面整體重新整理對網路速度受限的情況。 1.MySQL資料表如下(簡單舉例): 表名:stu_info stuId                 int                    PK    NN

jQuery的區域性重新整理——get、postajax方法寫法小結

在前臺頁面的編寫中,為了考慮到業務的科學性和使用者的體驗性,常常需要驗證使用者的輸入資料是否合理有效。一般來講,普通的js即可以做到,但更多時候往往需要跟後臺進行互動。例如使用者註冊,判斷使用者所輸入的使用者名稱是否已經存在。下面用jQuery的get、post和ajax方法來實現判斷,同時對這三種常見的區

.Net MVC框架使用ajax區域性重新整理

很基礎的內容加深一下自己的記憶力,下面就介紹一下,大神勿噴!: 下面是前臺的樣式: <style> .menu-panel dt a { background-colo

ajax非同步請求,生成表格,區域性重新整理

通過點選form的查詢按鈕,請求後臺資料,並生成表格新增到table中 先來一段簡單的html的form和table: <form onsubmit="return false" id="formAddtr" method="post">

extjs中Ext.Ajax.request同步請求非同步請求

用Ext.Ajax.request請求預設是非同步請求,這就導致定義的物件無法識別,沒有定義,因此需要將請求方式改為同步。請看程式碼。 function showFormPanel(){ if(centerPanel.getSelectionModel().hasSelection()){

Ajax實現 頁面區域性 重新整理

 web開發中我們經常會遇到區域性重新整理頁面的需求,以前我經常使用ajax和iframe實現區域性重新整理,後來做政府的專案,對頁面的樣式要求比較多,發現使用iframe控制樣式什麼的很麻煩,所以就採用了新的辦法,就是下面我們要說的ajax配合div區域性重新整理頁面,其實很簡單,下面我

解決ajax區域性重新整理後,滾動條位置變化的問題

問題描述:網頁底部實現了點贊和收藏功能,給長篇文點贊並更新點 贊數量之後,滾動條回到網頁頂部。 修改之前: <a href="#" th:onclick="'javascript:updateNum('+${article.id}+')'" > <i clas

js區域性重新整理本地重新整理

1. 使用ajax進行區域性重新整理 $('#btn').click(function(){ var orderid = $(this).attr('data-order');//獲取訂單號 $.post(url,{orderid:orderid},func

js-關於非同步原理的理解總結

我們經常說JS是單執行緒的,比如Node.js研討會上大家都說JS的特色之一是單執行緒的,這樣使JS更簡單明瞭,可是大家真的理解所謂JS的單執行緒機制嗎?單執行緒時,基於事件的非同步機制又該當如何,這些知識在《JavaScript權威指南》並沒有介紹,我也一直困惑了,

Ajax請求返回一個頁面,實現頁面區域性重新整理

本文實現Ajax的區域性重新整理。思路如下: 首先,從JSP頁面A.jsp向服務端發起一個Ajax請求,由Action中方法MethodA處理,該MethodA方法進行資料組裝後,返回一個jsp頁面Result.jsp,然後在Ajax的返回結果中,將Result.jsp元素

mui的上拉重新整理下拉載入日期選擇器

var pageCount = 1;//頁碼 var date_inputs = document.getElementsByClassName('select_date'); var today = new Date(); var thisyear = today.getF

ajax提交動態重新整理

$.get('http://52ivi.sh.1251443851.clb.myqcloud.com/chatman/msg_viewThis.do', {fid:dt[0],owner:dt[1],sort:dt[2],search:$('.search_i

jquery通過ajax在jsp中區域性重新整理頁面

在jquery中ajax的呼叫已經非常方便了。也提供了一些新的呼叫方式。 這裡有兩個 在jsp中區域性重新整理頁面 的例子。 一種是json返回內容再拼接 html  一種是直接返回 一個jsp 到另一個jsp中 這裡的框架用的是springMVC 其它框架 類推 js