關於AJAX的原理如何做到異步和局部刷新實現代碼的介紹

學識都 人氣:1.67W

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); } }}