DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> AJAX入門 >> AJAX詳解 >> 不同浏覽器的XMLDOM 對象
不同浏覽器的XMLDOM 對象
編輯:AJAX詳解     

一 IE中的XML DOM
1.微軟通過ActiveX的MSXML庫提供了支持,通過:

  1. var oXMLDom = new ActiveXObject("MSXML2.DOMDocument.5.0") 

得到一個XML DOM對象,這是在IE6中的,如果你的IE是更老版本的,可以使用下面的函數得到,如果你沒有安裝MSXML,將不能得到:

  1. function createXMLDOM() {  
  2.           
  3.             var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",  
  4.                                  "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument",  
  5.                                  "Microsoft.XMLDom"];  
  6.                                    
  7.             for (var i=0; i < arrSignatures.length; i++) {  
  8.                 try {  
  9.                   
  10.                     var oXMLDom = new ActiveXObject(arrSignatures[i]);  
  11.                       
  12.                     return oXMLDom;  
  13.                   
  14.                 } catch (oError) {  
  15.                     //ignore  
  16.                 }  
  17.             }                
  18.               
  19.             throw new Error("你的系統沒有安裝MSXML");             
  20.         }    

當然,如果你使用prototype庫,可以使用Try.these函數。

2.XML DOM對象可以通過load和loadXML方法載入XML文件或者字符串:

  1. oXMLDom.load("test.XML");  
  2. oXmlDom.loadXML("<root></root>"); 

然後這個oXMLDom就可以使用所有的DOM對象方法,比如documentElement.tagName,參見:
 《Javascript之DOM技術(一)》
 《Javascript之dom技術(二)》

3.XML DOM默認是通過異步載入XML文件的,可以通過設置async值來選擇是同步還是異步:

  1. oXMLDom.async=true; 

4.IE的XML DOM擁有一個readyState值用來表示載入文件的狀態:


0——准備載入
1——正在載入
2——載入完成
3——載入完成並可用,但有一部分數據也許不可用
4——完全載入,完全可用。

相應的有一個onreadystatechange事件,當狀態改變時發生,我們可以通過監聽此事件來判斷XML DOM對象的可用性

  1. oXMLDom.onreadystatechange = function () {  
  2.                 if (oXMLDom.readyState == 4) {  
  3.                     alert("load test.XML done!");  
  4.                     alert("Tag name of the root element is " + oXMLDom.documentElement.tagName);  
  5.                     alert("The root element has this many children: " + oXMLDom.documentElement.childNodes.length);  
  6.  
  7.                 }  
  8.             }; 

5.IE的XML DOM對象有一個xml屬性,用來返回XML文件的字符串形式,比如

  1. oXMLDom.async=false;  
  2. oXMLDom.load("test.XML");  
  3. alert(oXmlDom.XML); 

alert出:<root><child/><child/></root>

6.IE,當載入的XML文件或者字符串解析錯誤時,將產生一個parseError對象,我們在下面的代碼中演示此對象的屬性:

  1. oXMLDom.async = false;  
  2. oXMLDom.load("errors.XML");  
  3.  
  4. //0表示沒有錯誤  
  5. if (oXMLDom.parseError != 0) {  
  6.     var oError = oXMLDom.parseError;  
  7.  
  8.     alert("An error occurred:\n錯誤代碼: " 
  9.           + oError.errorCode + "\n" 
  10.           + "行數: " + oError.line + "\n" 
  11.           + "列數: " + oError.linepos + "\n" 
  12.           + "原因: " + oError.reason);  
  13.             

二.Mozilla的XML DOM對象
1.XML DOM對象的創建,符合DOM標准的,通過document.implementation.createDocument()方法。比如:

  1. var oXMLDom=document.implementation.createDocument("","",null); 

這三個參數分別是文檔命名空間、文檔元素的標簽名以及一個文檔類型對象(總為null),比如:

 

  1. var oXMLDom=document.implementation.createDocument("http://www.rubyeye.Net","root",null); 

這段代碼創建了一個<a0:root XMLns="http://www.rubyeye.Net"/>的XML DOM對象

2.載入xml,Mozilla與IE不同的是只提供了一個load()方法用於載入xml文件,沒有提供loadXML()方法用於載入XML字符串。同步載入XML文件的代碼與IE相同:

  1. oXMLDom.async=false;  
  2. oXMLDom.load("test.XML"); 

異步載入稍有不同,因為Mozilla並不支持readyState屬性,並且沒有onreadystatechange事件,它只有一個onload的事件,當載入完成時觸發;或者說相當於IE的readyState屬性等於4的狀態。

  1. oXMLDom.onload=function(){  
  2. alert("done");  
  3. }  
  4. oXMLDom.load("test.XML"); 

要將XML字符串解析為DOM對象,必須使用DOMParser對象:

  1. var oParser=new DOMParser();  
  2. var oXMLDom=oParser.parseFromString("<root><child/></root>,"text/XML"); 

兩個參數:要解析的XML字符串以及字符串的內容類型(只能為text/xml或者application/XML)。
不過我們可以實現自己的loadXML方法:

  1. Document.prototype.loadXML = function (sXML) {  
  2.       
  3.             var oParser = new DOMParser();  
  4.             var oXmlDom = oParser.parseFromString(sXML, "text/XML");  
  5.            
  6.             //刪除原文檔內容  
  7.             while (this.firstChild) {  
  8.                 this.removeChild(this.firstChild);  
  9.             }  
  10.             //導入新的文檔內容  
  11.             for (var i=0; i < oXMLDom.childNodes.length; i++) {  
  12.                 var oNewNode = this.importNode(oXMLDom.childNodes[i], true);  
  13.                 this.appendChild(oNewNode);  
  14.             }  
  15.           
  16.         };  

3.Mozilla沒有提供IE的xml屬性來返回XML文檔內容,只能通過使用XMLSerializer對象:

  1. var oSerializer=new XMLSerializer();  
  2. var sXml=oSerializer.serializeToString(oXMLDom,"text/XML"); 

同樣兩個參數:XML DOM對象以及轉化成的文檔類型。

同樣,我們也可以給Mozilla的XML DOM對象定義一個屬性XML,通過defineGetter方法:

  1. Node.prototype.__defineGetter__("XML",function(){  
  2. var oSerializer=new XMLSerializer();  
  3. var sXML=oSerializer.serializeToString(this,"text/XML");  
  4. }); 

以後就可以以IE的方式,oXmlDom.xml來獲取XML文檔內容。

4。錯誤處理,同樣與IE不同,Mozilla當解析錯誤時會返回一段代碼,以標簽<prasereoor>包括其中的代碼解釋了錯誤發生的原因以及位置等信息,我們只有通過正則表達式解析此段代碼,提取錯誤信息。

  1. var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;  
  2.              
  3.             //返回代碼的標簽名為parsererror,表示錯誤發生  
  4.             if (oXMLDom.documentElement.tagName == "parsererror") {  
  5.                 reError.test(oXmlDom.XML);  
  6.                 alert("An error occurred:\n描述: " 
  7.                     + RegExp.$1 + "\n" 
  8.                     + "文件名: " + RegExp.$2 + "\n" 
  9.                     + "行數: " + RegExp.$3 + "\n" 
  10.                     + "列數: " + RegExp.$4 + "\n" 
  11.                     + "原因: " + RegExp.$5);  
  12.             } 

三,提供一個跨浏覽器的XML DOM對象解決方案,來自於《Javascript高級程序設計》

  1. function XMLDom() {  
  2.     //通過對象/屬性檢測法,判斷是IE來是Mozilla  
  3.     if (window.ActiveXObject) {  
  4.         var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",  
  5.                              "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument",  
  6.                              "Microsoft.XMLDom"];  
  7.                            
  8.         for (var i=0; i < arrSignatures.length; i++) {  
  9.             try {  
  10.           
  11.                 var oXMLDom = new ActiveXObject(arrSignatures[i]);  
  12.               
  13.                 return oXMLDom;  
  14.           
  15.             } catch (oError) {  
  16.                 //ignore  
  17.             }  
  18.         }            
  19.  
  20.         throw new Error("MSXML is not installed on your system.");   
  21.              
  22.     //同上            
  23.     } else if (document.implementation && document.implementation.createDocument) {  
  24.           
  25.         var oXMLDom = document.implementation.createDocument("","",null);  
  26.  
  27.         //創建Mozilla版本的parseError對象  
  28.         oXMLDom.parseError = {  
  29.             valueOf: function () { return this.errorCode; },  
  30.             toString: function () { return this.errorCode.toString() }  
  31.         };  
  32.           
  33.         //初始化parseError對象  
  34.         oXMLDom.__initError__();  
  35.                   
  36.           
  37.         oXMLDom.addEventListener("load", function () {  
  38.             this.__checkForErrors__();  
  39.             this.__changeReadyState__(4);  
  40.         }, false);  
  41.  
  42.         return oXMLDom;          
  43.           
  44.     } else {  
  45.         throw new Error("Your browser doesn't support an XML DOM object.");  
  46.     }  
  47. }  
  48.  
  49. //此處用到了該書中一個浏覽器系統檢測JS文件,如果是Mozilla  
  50. if (isMoz) {  
  51.  
  52.     Document.prototype.readyState = 0;  
  53.     Document.prototype.onreadystatechange = null;  
  54.  
  55.       
  56.     Document.prototype.__changeReadyState__ = function (iReadyState) {  
  57.         this.readyState = iReadyState;  
  58.  
  59.         if (typeof this.onreadystatechange == "function") {  
  60.             this.onreadystatechange();  
  61.         }  
  62.     };  
  63.     //初始化parseError對象  
  64.     Document.prototype.__initError__ = function () {  
  65.         this.parseError.errorCode = 0;  
  66.         this.parseError.filepos = -1;  
  67.         this.parseError.line = -1;  
  68.         this.parseError.linepos = -1;  
  69.         this.parseError.reason = null;  
  70.         this.parseError.srcText = null;  
  71.         this.parseError.url = null;  
  72.     };  
  73.       
  74.     Document.prototype.__checkForErrors__ = function () {  
  75.  
  76.         if (this.documentElement.tagName == "parsererror") {  
  77.  
  78.             var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;  
  79.  
  80.             reError.test(this.XML);  
  81.               
  82.             this.parseError.errorCode = -999999;  
  83.             this.parseError.reason = RegExp.$1;  
  84.             this.parseError.url = RegExp.$2;  
  85.             this.parseError.line = parseInt(RegExp.$3);  
  86.             this.parseError.linepos = parseInt(RegExp.$4);  
  87.             this.parseError.srcText = RegExp.$5;  
  88.         }  
  89.     };  
  90.       
  91.      //定義Mozilla的loadXML方法     
  92.     Document.prototype.loadXML = function (sXML) {  
  93.       
  94.         this.__initError__();  
  95.       
  96.         this.__changeReadyState__(1);  
  97.       
  98.         var oParser = new DOMParser();  
  99.         var oXmlDom = oParser.parseFromString(sXML, "text/XML");  
  100.    
  101.         while (this.firstChild) {  
  102.             this.removeChild(this.firstChild);  
  103.         }  
  104.  
  105.         for (var i=0; i < oXMLDom.childNodes.length; i++) {  
  106.             var oNewNode = this.importNode(oXMLDom.childNodes[i], true);  
  107.             this.appendChild(oNewNode);  
  108.         }  
  109.           
  110.         //載入後檢查錯誤  
  111.         this.__checkForErrors__();  
  112.           
  113.         //沒有問題,設置readyState屬性為4  
  114.         this.__changeReadyState__(4);  
  115.  
  116.     };  
  117.       
  118.     Document.prototype.__load__ = Document.prototype.load;  
  119.  
  120.     Document.prototype.load = function (sURL) {  
  121.         this.__initError__();  
  122.         this.__changeReadyState__(1);  
  123.         this.__load__(sURL);  
  124.     };  
  125.       
  126.     Node.prototype.__defineGetter__("XML", function () {  
  127.         var oSerializer = new XMLSerializer();  
  128.         return oSerializer.serializeToString(this, "text/XML");  
  129.     });  
  130.  
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved