Ajax —— 多並發連接及前端設計模式


   Ajax簡介

   Ajax是Asynchronous Javascript and XML的縮寫,這個術語由Jesse James Carrett創造,最早出現在他於2005年2月發表的文章“Ajax: A New Approach to Web Applications”。其主要的特點就是使用腳本操縱HTTP和Web服務器進行數據交換,不會導致頁面重載。

  Ajax並非一門新的開發語言,而是一組技術的專用術語,包括DHTML和XMLHTTPRequest對象,而DHTML通常是指HTML、CSS和javascript組合使用。Ajax的本質也就是從服務器動態請求數據后使用這些數據更改頁面。

  實現Ajax的方式有許多中,例如:利用img標簽的src屬性或者script標簽的src屬性,這種傳輸協議式的實現相對於XMLHttpRequest對象方式復雜,並且存在着各式各樣的問題,因而最常見的方式。Ajax的基礎知識點就討論到這里,今天的重點是Ajax的並發和使用技巧。

  

 

 

 

 

 

 

 

 

  Ajax並發

  Ajax是以異步的方式向服務器提交需求,這就會存在多個ajax請求同時提交,或者迭代提交的情況,這將導致資源競爭(racing),設計較好的情況下,可以通過disable提交按鈕的緩解此類問題,但一旦出現迭代提交request的情況,就可能出現XMLHttpRequest對象的引用被覆蓋,但具體會發生什么樣的情況,取決於Ajax的編碼。

   Ajax在異步的情況下,並發數並非沒有限制,Wininet 會限制每個服務器的連接數,限制它對單個 HTTP 服務器的同時連接的數量。如果超過此限制時,請求將阻止,直到完成當前的連接之一。這是設計使然,是與 HTTP 規范和行業標准。例如IE8並發數就限制在2,Firefox 21限制在6。當然IE的限制可以在注冊表中修改,HKEY_LOCAL_MACHINE\SOFTWARE\   Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTIONSPERSERVER。

 

 

ersion HTTP 1.0 server (broadband connection) HTTP 1.1 server (broadband connection) HTTP 1.0 server (dial-up connection) HTTP 1.1 server (dial-up connection)
Internet Explorer 7 and earlier 4 2 4 2
Internet Explorer 8 6 6 4 2

  超出上述限制,超出的請求將會被瀏覽器阻塞,直到先前的請求已經完成才會啟動。在這里建立使用隊列來解決這些問題。基本思路,生成XHR對象之后,檢測當前並發數量是否大於最大請求的上限,若大於上限,則將XHR對象壓入隊列之中,否則就可以直接發送,並且可以繼續增加並發請求數量。請求完成的時候,進行響應處理,並在結束之時進行並發數量減一操作,接着就可以檢測隊列中是否有等待請求,若有等待請求,就發送給隊首的XHR對象進行請求。

   Ajax前端設計模式

  更換部分HTML

  最常見的Ajax任務也就是向服務器請求更新部分HTML內容,例如:更新股票的標價,對查詢請求進行部分更新。

function resHandler(){
    if(req.readystate === 4 && req.status === 200){
        ele.innerHTML = req.responseText;
    }      
}

  讀取XML數據

  若希望javascript代碼在頁面中使用數據執行一些智能化的任務,可以使用結構化的方式將數據發送到瀏覽器客戶端,最適合的格式有:XML、JSON等。

function resHandler(){
    if(req.readystate === 4 && req.status === 200 && req.responseXML){
        var root = req.responseXML.getElementById('root');
        //讀取XML數據...
    }
}

  與上一種模式最大的區別是使用了req.responseXML,responseXML是一個XML文檔對象模型(DOM),這種模型只有在 服務器的響應是正確編碼的XML時才是可用的。responseXML對象可以直接讀取使用,但是當數據結構比較復雜之時,解析和檢索XML文檔需要花不 少時間,這時候可以考慮使用JSON格式。

  讀取JSON數據

  返回JSON格式的優點是能夠使瀏覽器高效地解析,並創建使用起來更加簡單的JSON數據。JSON格式更加容易讀取和管理,因而Ajax開發時,json格式更加受到歡迎。

function resHandler(){
    if(req.readystate === 4 && req.status === 200){
        var json = JSON.parse(req.responseText);
        //...
    }
}

  避免瀏覽器緩存

  若對同一個URL請求兩次,瀏覽器將使用緩存中的頁面。因此,最常見的解決辦法就是URL拼接一個隨機數或者拼接一個時間戳,這樣瀏覽器就不會 反悔一個緩存的結果。個人最喜歡的是想URL添加當前時間的數字值。url +=(new Date()).getTime()。

function addTimeStamp(url) {
            var getTimestamp = new Date().getTime();
            if(url.indexOf("timestamp=") > -1) return url;
            if (url.indexOf("?") > -1) 
                url = url + "&timestamp=" + getTimestamp;
            else 
                url = url + "?timestamp=" + getTimestamp;                
            return url;
        }

  

  THML模板  

  當然為了開發的便捷,你可以對HTML的修改進行模板化,通過從服務器響應讀取對應的數據對HTML模板進行填充,這種方案只是更換部分HTML的升級模式。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM