與Ajax邂逅.

來源:互聯網
上載者:User
                        與Ajax邂逅.
                                作者:ShellEx(全金屬外殼)
    上下文(此部分加密):
       ^*&$*UE*W&E*@()$*()@$@)($DWDWW.
    環境:
       Windows 2k3 sp1
           *FireFox 2.0
           *Opera 9.10
           *IE 7 beta 3

    問題與解決方案:
    問題一:在Opera和IE中頁面資料不會定時更新.根據setInterval('Refresh()',1000);每次Refresh函數完畢後應當能從伺服器端得到新資料來更新頁面元素,但是只有FireFox工作正常,其他倆瀏覽器的資料會保持第一次的資料.
    解決方案1: 估計是緩衝問題. 先把
        xmlRequest.open('GET', file, true);
        改成
        xmlRequest.open('POST', file, true);
    Opera有效,IE無效.
    在資料來源頁面clock.php後加隨機參數:
        ajaxRead('clock.php?id=' + Math.random() * 10);
    Opera有效,IE無效.   
    通過調試,發現問題二:
    問題二: xmlRequest.onreadystatechange只觸發一次.本來根據setInterval('Refresh()',1000);, Refresh函數應當會執行若干次,每次發出一個XMLHttpRequest請求.但是在IE中確行不通.這可能是問題一無法根本解決的原因.
    解決方案2: 把原來只建立一個全域XMLHttpRequest對象改成每次請求都重新建立:
                function ajaxRead(file){
                    var xmlRequest = CreateXMLObj();
                    .....
                }
    同樣的,IE也存在緩衝問題,於是測試 解決方案1:
        xmlRequest.open('POST', file, true);
    Opera有效,IE無效.
    在資料來源頁面clock.php後加隨機參數:
        ajaxRead('clock.php?id=' + Math.random() * 10);
    Opera有效,IE有效.
    於是問題一,二得到解決.
    問題三: FireFox和IE對XML的解析. clock.php返回的是一個xml格式的字串.開始我是這樣解析的:
                var xmlDoc = xmlRequest.responseXML;
                var root_node = xmlDoc.getElementsByTagName('time')[0];
                Updata('xmlObj', root_node.firstChild.data);
    很遺憾,該方法只在Opera中解析成功.在FF下Firebugs提示getElementsByTagName有錯,在IE下測試後我發現root_node始終為null.
    解決方案3:
    對於FF,在建立 XMLHttpRequest對象後應當這麼寫:
                xmlObj = new XMLHttpRequest();
                try{
                    xmlObj.overrideMimeType('text/xml');
                }catch(e) {....}
    因為伺服器響應若沒有XML mime-type header,後面的xmlDoc.getElementsByTagName('time')無法正常工作.
    如果不添加xmlObj.overrideMimeType('text/xml')也可以,使用DOMParser()解析XML就可以了.代碼如下:
                 var parser=new DOMParser();
                 var xmlDoc=parser.parseFromString(xmlRequest.responseText,"text/xml");   
                //代替var xmlDoc = xmlRequest.responseXML;
    對於IE,則應當用XMLDOM:
                 var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
                 xmlDoc.async="false";
                 xmlDoc.loadXML(xmlRequest.responseText);
    結合起來,就是這樣                if (! window.ActiveXObject) ...{
                    var parser=new DOMParser();
                    var xmlDoc=parser.parseFromString(xmlRequest.responseText,"text/xml");   
                    //var xmlDoc = xmlRequest.responseXML;
                } else  ...{       
                    var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
                    xmlDoc.async="false";
                    xmlDoc.loadXML(xmlRequest.responseText);
                }
                var root_node = xmlDoc.getElementsByTagName('time')[0];
                Updata('xmlObj', root_node.firstChild.data);

    解決問題三.
    嗯,記錄下來,留作備忘.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.