计算机故障交流论坛
域名注册

不同浏览器的XMLDOM 对象

发表时间:09-6-12   来源:计算机故障网   点击:

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.  

 第1页:不同浏览器的XMLDOM 对象(1)   第2页:不同浏览器的XMLDOM 对象(2)  

© CopyRight 2008-2010, JSJGZ.CN, 计算机故障 Inc. All Rights Reserved

闽ICP备09000710号 增值电信业务经营许可证闽B2-20080004号 Rss订阅