關於AJAX的原理如何做到非同步和區域性重新整理實現程式碼的介紹

才智咖 人氣:1.66W

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

關於AJAX的原理如何做到非同步和區域性重新整理實現程式碼的介紹

詳解:

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

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

lementById("user1")rHTML = "資料正在載入..."; if (us == 200) { e(onseText); }

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

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

業務函式:

function castVote(rank) { var url = "/ajax-demo/"; var callback = processAjaxResponse; executeXhr(callback, url);}需要非同步通訊的函式: function executeXhr(callback, url) { // branch for native XMLHttpRequest object if (ttpRequest) { req = new XMLHttpRequest(); adystatechange = callback; ("GET", url, true); ()(null); } // branch for IE/Windows ActiveX version else if (veXObject) { req = new ActiveXObject("TTP"); if (req) { adystatechange = callback; ("GET", url, true); ()(); } }}adystatechange = ("GET", url, true)

第一行定義了JavaScript回撥函式,一旦響應就緒它就自動執行,而()方法中所指定的“true”標誌說明想要非同步執行該請求。

一旦伺服器處理完XmlHttpRequest並返回給瀏覽器,使用adystatechange指派所設定的回撥方法將被自動呼叫。

回撥函式:

function processAjaxResponse() { if (yState == 4) { // only if "OK" if (us == 200) { lementById("user1")rHTML = onseText; } else { alert("There was a problem retrieving the XML data:" + usText); } }}