Ajax的一些有用的小技巧(特別是ie經過ajax用responseXML得到xml的處理)

在使用Ajax過程當中,有時候總會遇到一些難題,瀏覽器兼容、編碼、IE下的特殊處理等等,偶爾會搞的人頭昏腦脹啼笑皆非,這裏列一些小貼士,或許有些用。
使用Javascript庫
Ajax的流行和巨大威力,讓咱們從新審視了Javascript的開發,也直接促使各類庫的出現。對於普通的開發者,使用一些適合本身的Javascript庫不只能夠避免Ajax應用上的瀏覽器兼容等問題,也使其開發更加的穩定和高效。這裏列一些我知曉的輕量級的Javascript庫:
  1. YUI:YAHOO出品,組件豐富強大健壯穩定,是團隊協做開發的首選。
  2. JQuery:靈活、高效,其基於CSS3 和XPath的選擇器語法引擎很是的強大和完整。
  3. Prototype:是一個很是優雅的Javascript庫,最經典的莫過於$符號了,DWR,JQuery都被它吸引了。在它基礎上出現了script.aculo.us。
  4. Mootools:核心語法和Prototype比較相似,可是用過以後才知道什麼叫簡單輕巧和短小精悍。
編碼問題
經過XMLHttpRequest獲取的數據,默認的字符編碼是UTF-8,若是前端頁面是GB2312或者其它編碼,顯示獲取的數據就是亂碼。經過XMLHTTPRequest,POST的數據也是UTF-8編碼,若是後臺是GB2312或者其餘編碼也會出現亂碼。解決方法:
  1. 統一到UTF-8。這也是國際化的必然趨勢。
  2. 輸出經過XMLHttpRequest獲取的文本文本時,在headers中增長文本聲明(直接HTML聲明沒有做用)。如:
    PHP:header('Content-Type:text/html;charset=GB2312');
    ASP:Response.Charset = "GB2312"
    JSP:response.setHeader("Charset","GB2312");
  3. WWW服務器上強制聲明。好比:apache下的配置:
    AddDefaultCharset GB2312

    這種狀況主要是應對經過XMLHttpRequest訪問的文件是靜態文件,沒法聲明headers的狀況下。
    靜態頁面通常都會通過Apache的deflate或gzip壓縮,此時在上面狀況下IE中,首次經過XMLhttpRequest得到的數據能夠正常顯示,但再獲取數據顯示時出現亂碼,此次由於再次獲取的數據來自緩存,可能因爲瀏覽器解壓縮的問題致使Apache設置的默認編碼聲明丟失。因爲這種狀況下通常是純文本,可能還沒法禁止緩存,能夠設置XMLhttpRequest訪問的文本文件不壓縮來解決這個問題。
  4. 非UTF-8頁面經過XMLHttpRequest獲取的文本文本輸出前字符轉碼成unicode,或者編碼直接是UTF-8,能夠正常顯示。如實例所示
IE下的緩存問題
因爲IE的緩存處理機制問題,每次經過XMLHttpRequest訪問動態頁面返回的老是首次訪問的內容,解決方法有:
  1. 客戶端經過添加隨機字符串解決。如:
    var url = 'http://dancewithnet.com/';
    url +=  '?temp=' + new Date().getTime();
    url +=  '?temp=' + Math.random();
  2. 在HTTP headers禁止緩存。如:
    HTTP:
    <meta http-equiv="pragma" content="no-cache" />
    <meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
    <meta http-equiv="expires" content="Thu, 01 Jan 1970 00:00:01 GMT" />
    <meta http-equiv="expires" content="0" />
    PHP:
    header("Expires: Thu, 01 Jan 1970 00:00:01 GMT");
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");
    ASP:
    Response.expires=0
    Response.addHeader("pragma","no-cache")
    Response.addHeader("Cache-Control","no-cache, must-revalidate")
    JSP:
    response.addHeader("Cache-Control", "no-cache");
    response.addHeader("Expires", "Thu, 01 Jan 1970 00:00:01 GMT");
  3. 在XMLHttpRequest發送請求以前加上:
    XMLHttpRequest.setRequestHeader("If-Modified-Since","0");
    XMLHttpRequest.send(null);
IE下的reponseXML問題
使用responseXML時,IE下只能接受.xml爲後綴的XML文件,若是不能以.xml文件爲結尾的,則須要以下處理:
  1. 在服務器端聲明是xml文件類型。如:
    PHP:header("Content-Type:text/xml;charset=utf-8");
    ASP:Response.ContentType = "text/xml";
    JSP:response.setHeader("ContentType","text/xml");
  2. 利用responseText獲取,而後封裝成XML。
  3. 在AJAX應用上,JSON和JsonML是XML很是好的替代品。
相關文章
相關標籤/搜索