ajax是一種與服務器通訊而無需重載頁面的方法(即局部刷新。)javascript
高性能的Ajax應該考慮數據傳輸技術和數據格式,以及其餘的如數據緩存等優化技術。php
請求數據css
請求數據的經常使用技術有XMLHttpRequest(XHR),動態腳本注入、Multipart XHR、iframes、Comet五種,其中前三種比較常見,後兩種每每在比較極端的狀況下使用。html
XHRjava
XMLHttpRequest是目前最經常使用的技術,能夠在請求中添加頭信息和參數,讀取服務器返回的全部頭信息和響應文本,下面是一個簡單的例子ajax
readyState的值等於3時,說明這是ajax與服務器正在進行交互,相應信息還在傳輸過程當中。json
XHR 提供了高級的控制,因此瀏覽器對其增長了一些限制。不能是用 XHR 從外域請求數據,也就是跨域。並且低版本的IE 沒有 readyState 爲 3 的狀態跨域
當請求的URL加上參數的長度接近 2048 個字符時,須要使用 post 獲取數據。過長將會致使請求的URL被截斷。數組
動態腳本注入瀏覽器
克服了XHR的限制:可以跨域請求數據
經過建立script標籤,將src指向不一樣域的url便可
與XHR相比:
(1) 動態腳本注入沒法設置頭信息,
(2) 只能使用get方式,不能使用post方式
(3) 不能訪問請求的頭信息,也不能將響應消息做爲字符串來處理,響應消息通常是可執行的javascript腳本(其餘待返回的XML、JSON或其餘格式的數據都要封裝在一個回調函數中)
Multipart XHR(新技術)
MXHR容許客戶端只用一個HTTP請求從服務器端向客戶端傳送多個資源。它經過在服務器端將多個資源(css文件、HTML片斷、js代碼、base64編碼的圖片)打包成一個由雙方約定的特定字符分割的長字符串發送到客戶端。而後,在客戶端根據那個特定的字符將這個長字符串解析成各個資源。
發起請求
var xhr = new XMLHttpRequest(); xhr.open('get','data.php',true); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ splitImage(xhr.responseText) } }
服務端處理數據
$dataArr=array(); $images=array('1.jpg','2.jpg','3.jpg'); foreach($images as $img){ $file=fopen($img,'r'); $imgdata=fread($file,filesize($img)); $imgdata=base64_encode($imgdata); fclose($file); array_push($dataArr,$imgdata); } $newchar=chr(1); echo implode($newchar,$dataArr);//使用一個不會出如今base64中的一個字符將各個圖片的base64編碼連成一個長字符串
數據到達客戶端後,再進行解析
function splitImage(imgstring){ var imgdata=imgstring.split(\u0001'); //將字符串分割 var img=document.createElement('img'); for(var i=0,len=imgdata.length;i<len;i++){ var tmpimg=img.cloneNode(); tmpimg.src="data:image/jpeg;base64,"+imgdata[i]; document.getElementById('div1').appendChild(tmpimg); } }
因爲一次性請求的資源多,因此沒必要等待全部資源都返回在進行處理,能夠根據readyState狀態值監測響應狀態,當readyState爲3時,就對接收到的部分數據進行處理。
優勢:一次能夠請求多個資源,提高性能
缺點:獲取的資源不能被瀏覽器緩存
發送數據
XHR
GET方式受瀏覽器的最大URL尺寸限制,當上傳數據量較大時,用POST方式。
對於少許數據,GET方式會更快,由於一個GET請求往服務器只發送一個數據包,而一個POST請求,至少要發送兩個數據包,一個裝載頭信息,一個裝載 POST正文。
數據格式
服務器端與客戶端進行數據傳輸時,數據的格式會影響其下載速度和解析速度,通常來講JSON形式和字符分隔的自定義格式是最好的。XML、HTML通常會增長數據量,解析較慢。
XML
最開始是流行 XML做爲數據格式,當時的優點:極佳的通用性-服務端和客戶端都能完美支持。格式嚴格,易於驗證。
JSON
json是如今ajax經常使用的數據結構,用數組和對象直接量編寫。
相比於XML 傳輸尺寸小,解析速度快。是 高性能AJAX的基礎。
HTML
服務器渲染的項目會將完整的html以及js、css傳給瀏覽器,瀏覽器直接解析成頁面。HTML代碼比XML更繁雜,這意味着須要佔用更多的網絡資源去下載html。
自定義格式
你能夠與服務器端約定好傳輸的數據的格式,好比以特定的字符做爲分隔符分隔字符串,在客戶端用split()方法切割成須要的數據。
數據格式總結
大數據量且要求解析時間的話,能夠選擇:
JSON-P數據,使用動態腳本獲取,把數據當作js腳本運行而不是字符串,解析速度極快,能跨域使用,涉及敏感數據時不該使用
自定義數據,用XHR或動態腳本注入獲取,經過split解析,比JSON-P略快
緩存數據
最快的請求就是沒有請求,有兩種方法可避免發送沒必要要的請求
在服務端,設置 HTTP 頭信息能夠確保你的響應會被瀏覽器緩存
在客戶端能夠吧獲取到的信息存儲在本地,從而避免再次請求。
第一種簡單並且好維護,第二種則有很大的控制權。
設置HTTP頭信息
$lifetime=7*24*60*60;
header('Expires'.gmdate('D,d M Y H:i:s',time()+$lifetime).'GMT');
客戶端實現:
把響應信息保存到一個本地對象中
小結
瞭解項目的具體需求,選擇正確的數據格式和與之匹配的傳輸技術
還能夠:
減小請求數
縮短頁面加載時間 主要內容加載完畢 用ajax 獲取次要文件
儘可能不要吧代碼錯誤輸出給用戶
**本章內容沒學好,有不對的地方還望指正,感激涕零