在javascript中操作兼容IE/Firefox浏览器的XMLDOM及扩展[最新]

本文提供了一套解决XMLDOM在IE与Firefox浏览器间兼容性的方案,包括创建XMLDOM对象、扩展Document的loadXML方法、扩展Element的text属性及XPath查询方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    一谈起XMLDOM在IE/Firefox浏览器的兼容性,向来都是头疼的问题,也苦了众多前辈在多标准的现状下总结出了颇有价值的代码,以免后人再走弯路。随着javascript和dom版本的不断升级,旧的代码在效率和实现上也适时的出现些变化,达到适应最新同时向下兼容的效果。在javascript中操作xmldom常用的有以下几种场景:

    一、创建XMLDOM对象

 1None.gifvar _xmlDom = null;
 2ExpandedBlockStart.gifContractedBlock.gif    if (!window.DOMParser  && window.ActiveXObject)dot.gif{
 3InBlock.gif        var arrXmlDomTypes = ['MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','Microsoft.XMLDOM'];
 4ExpandedSubBlockStart.gifContractedSubBlock.gif        for(var i = 0;i<arrXmlDomTypes.length;i++)dot.gif{
 5ExpandedSubBlockStart.gifContractedSubBlock.gif            trydot.gif{
 6InBlock.gif                _xmlDom = new ActiveXObject(arrXmlDomTypes[i]);
 7ExpandedSubBlockStart.gifContractedSubBlock.gif            }
catch(ex)dot.gif{}//不支持MSXML.XMLDOM对象的IE
 8ExpandedSubBlockEnd.gif        }

 9ExpandedBlockStart.gifContractedBlock.gif    }
elsedot.gif{// Mozilla browsers have a DOMParser
10ExpandedSubBlockStart.gifContractedSubBlock.gif        trydot.gif{
11ExpandedSubBlockStart.gifContractedSubBlock.gif            if(_xmlDom == null && document.implementation && document.implementation.createDocument)dot.gif{
12InBlock.gif                _xmlDom = document.implementation.createDocument("","",null);
13ExpandedSubBlockEnd.gif            }

14InBlock.gif            isIE = false;
15ExpandedSubBlockStart.gifContractedSubBlock.gif        }
catch (ex)dot.gif{}
16ExpandedBlockEnd.gif    }



   二、针对Firefox扩展Document的loadXML方法,使XMLDOM能像在IE中一样使用loadXML加载XML

 1ExpandedBlockStart.gifContractedBlock.gifDocument.prototype.loadXML = function(sXml)dot.gif{
 2InBlock.gif    var oParser= new DOMParser();
 3InBlock.gif    var _xmlDom = oParser.parseFromString(sXml, "text/xml");
 4InBlock.gif    
 5ExpandedSubBlockStart.gifContractedSubBlock.gifwhile(this.firstChild)dot.gif{
 6InBlock.gif       this.removeChild(this.firstChild);
 7ExpandedSubBlockEnd.gif    }

 8InBlock.gif
 9ExpandedSubBlockStart.gifContractedSubBlock.giffor(var i=0;i<_xmlDom.childNodes.length;i++)dot.gif{
10InBlock.gif       var oNewNode = this.importNode(_xmlDo.childNodes[i],true);
11InBlock.gif        this.appendChild(oNewNode);
12ExpandedSubBlockEnd.gif    }

13ExpandedBlockEnd.gif}


三、针对Firefox扩展Element的text属性,使XMLDOM能像在IE中一样使用text获取节点的文本内容

1ExpandedBlockStart.gifContractedBlock.gifElement.prototype.__defineGetter__("text",function()dot.gifreturn this.textContent; });


四、针对Firefox扩展Element的selectNodes,selectSingleNode方法,使XMLDOM能像在IE中一样使用XPath获取节点。在这里我不得不介绍一下网上盛传的版本如下:
 1None.gifif(document.implementation.hasFeature("XPath""3.0") )
 2ExpandedBlockStart.gifContractedBlock.gifdot.gif{   
 3InBlock.gif   Document.prototype.selectNodes = function(cXPathString, xNode)
 4ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
 5ExpandedSubBlockStart.gifContractedSubBlock.gif      if!xNode ) dot.gif{ xNode = this; } 
 6InBlock.gif      var oNSResolver = this.createNSResolver(this.documentElement)
 7InBlock.gif      var aItems = this.evaluate(cXPathString, xNode, oNSResolver, 
 8InBlock.gif                   XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
 9InBlock.gif      var aResult = [];
10InBlock.gif      forvar i = 0; i < aItems.snapshotLength; i++)
11ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
12InBlock.gif         aResult[i] =  aItems.snapshotItem(i);
13ExpandedSubBlockEnd.gif      }

14InBlock.gif      return aResult;
15ExpandedSubBlockEnd.gif   }

16InBlock.gif
17InBlock.gif   Element.prototype.selectNodes = function(cXPathString)
18ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
19InBlock.gif      if(this.ownerDocument.selectNodes)
20ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
21InBlock.gif         return this.ownerDocument.selectNodes(cXPathString, this);
22ExpandedSubBlockEnd.gif      }

23ExpandedSubBlockStart.gifContractedSubBlock.gif      elsedot.gif{throw "For XML Elements Only";}
24ExpandedSubBlockEnd.gif   }
 
25InBlock.gif   
26InBlock.gif   Document.prototype.selectSingleNode = function(cXPathString, xNode)
27ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
28ExpandedSubBlockStart.gifContractedSubBlock.gif      if!xNode ) dot.gif{ xNode = this; } 
29InBlock.gif      var xItems = this.selectNodes(cXPathString, xNode);
30InBlock.gif      if( xItems.length > 0 )
31ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
32InBlock.gif         return xItems[0];
33ExpandedSubBlockEnd.gif      }

34InBlock.gif      else
35ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
36InBlock.gif         return null;
37ExpandedSubBlockEnd.gif      }

38ExpandedSubBlockEnd.gif   }

39InBlock.gif      
40InBlock.gif   Element.prototype.selectSingleNode = function(cXPathString)
41ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{    
42InBlock.gif      if(this.ownerDocument.selectSingleNode)
43ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
44InBlock.gif         return this.ownerDocument.selectSingleNode(cXPathString, this);
45ExpandedSubBlockEnd.gif      }

46ExpandedSubBlockStart.gifContractedSubBlock.gif      elsedot.gif{throw "For XML Elements Only";}
47ExpandedSubBlockEnd.gif   }

48ExpandedBlockEnd.gif}

看过上面代码片段之后,大家也都会觉得相当麻烦,用了四个方法才扩展了Element的selectNodes,selectSingleNode方法,其实只需要稍作改进就行了,示范如下:

 1ExpandedBlockStart.gifContractedBlock.gifElement.prototype.selectSingleNode=function(sXPath)dot.gif{
 2InBlock.gif                    var oEvaluator = new XPathEvaluator();
 3InBlock.gif                    var oResult = oEvaluator.evaluate(sXPath,this,null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);
 4ExpandedSubBlockStart.gifContractedSubBlock.gif                    if(null != oResult)dot.gif{
 5InBlock.gif                        return oResult.singleNodeValue;
 6ExpandedSubBlockEnd.gif                    }

 7InBlock.gif                    return null;
 8ExpandedBlockEnd.gif                }

 9None.gif                
10ExpandedBlockStart.gifContractedBlock.gif                Element.prototype.selectNodes = function(sXPath)dot.gif{
11InBlock.gif                    var oEvaluator = new XPathEvaluator();
12InBlock.gif                    var oResult = oEvaluator.evaluate(sXPath,this,null, XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
13InBlock.gif                    var aNodes = new Array();
14ExpandedSubBlockStart.gifContractedSubBlock.gif                    if(null != oResult)dot.gif{
15InBlock.gif                        var oElement = oResult.iterateNext();
16ExpandedSubBlockStart.gifContractedSubBlock.gif                        while(oElement)dot.gif{
17InBlock.gif                            aNodes.push(oElement);
18InBlock.gif                            oElement = oResult.iterateNext();
19ExpandedSubBlockEnd.gif                        }

20ExpandedSubBlockEnd.gif                    }

21InBlock.gif                    return aNodes;
22ExpandedBlockEnd.gif                }


综合上面几项,我们可以整理出一套较为完整的片段以备使用:
 1None.gifvar _xmlDom = null;
 2ExpandedBlockStart.gifContractedBlock.gif    if (!window.DOMParser  && window.ActiveXObject)dot.gif{
 3InBlock.gif        var arrXmlDomTypes = ['MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','Microsoft.XMLDOM'];
 4ExpandedSubBlockStart.gifContractedSubBlock.gif        for(var i = 0;i<arrXmlDomTypes.length;i++)dot.gif{
 5ExpandedSubBlockStart.gifContractedSubBlock.gif            trydot.gif{
 6InBlock.gif                _xmlDom = new ActiveXObject(arrXmlDomTypes[i]);
 7ExpandedSubBlockStart.gifContractedSubBlock.gif            }catch(ex)dot.gif{}//不支持MSXML.XMLDOM对象的IE
 8ExpandedSubBlockEnd.gif        }
 9ExpandedBlockStart.gifContractedBlock.gif    }elsedot.gif{// Mozilla browsers have a DOMParser
10ExpandedSubBlockStart.gifContractedSubBlock.gif        trydot.gif{
11ExpandedSubBlockStart.gifContractedSubBlock.gif            if(_xmlDom == null && document.implementation && document.implementation.createDocument)dot.gif{
12InBlock.gif                _xmlDom = document.implementation.createDocument("","",null);
13InBlock.gif
14ExpandedSubBlockStart.gifContractedSubBlock.gif               Document.prototype.loadXML = function(sXml)dot.gif{
15InBlock.gif    var oParser= new DOMParser();
16InBlock.gif    var _xmlDom = oParser.parseFromString(sXml, "text/xml");
17InBlock.gif    
18ExpandedSubBlockStart.gifContractedSubBlock.gif    while(this.firstChild)dot.gif{
19InBlock.gif    this.removeChild(this.firstChild);
20ExpandedSubBlockEnd.gif    }

21InBlock.gif
22ExpandedSubBlockStart.gifContractedSubBlock.gif    for(var i=0;i<_xmlDom.childNodes.length;i++)dot.gif{
23InBlock.gif    var oNewNode = this.importNode(_xmlDo.childNodes[i],true);
24InBlock.gif        this.appendChild(oNewNode);
25ExpandedSubBlockEnd.gif    }

26ExpandedSubBlockEnd.gif}

27InBlock.gif
28ExpandedSubBlockStart.gifContractedSubBlock.gif Element.prototype.__defineGetter__("text",function()dot.gifreturn this.textContent; });
29InBlock.gif
30ExpandedSubBlockStart.gifContractedSubBlock.gifElement.prototype.selectSingleNode=function(sXPath)dot.gif{
31InBlock.gif                    var oEvaluator = new XPathEvaluator();
32InBlock.gif                    var oResult = oEvaluator.evaluate(sXPath,this,null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);
33ExpandedSubBlockStart.gifContractedSubBlock.gif                    if(null != oResult)dot.gif{
34InBlock.gif                        return oResult.singleNodeValue;
35ExpandedSubBlockEnd.gif                    }

36InBlock.gif                    return null;
37ExpandedSubBlockEnd.gif                }

38InBlock.gif                
39ExpandedSubBlockStart.gifContractedSubBlock.gif                Element.prototype.selectNodes = function(sXPath)dot.gif{
40InBlock.gif                    var oEvaluator = new XPathEvaluator();
41InBlock.gif                    var oResult = oEvaluator.evaluate(sXPath,this,null, XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
42InBlock.gif                    var aNodes = new Array();
43ExpandedSubBlockStart.gifContractedSubBlock.gif                    if(null != oResult)dot.gif{
44InBlock.gif                        var oElement = oResult.iterateNext();
45ExpandedSubBlockStart.gifContractedSubBlock.gif                        while(oElement)dot.gif{
46InBlock.gif                            aNodes.push(oElement);
47InBlock.gif                            oElement = oResult.iterateNext();
48ExpandedSubBlockEnd.gif                        }

49ExpandedSubBlockEnd.gif                    }

50InBlock.gif                    return aNodes;
51ExpandedSubBlockEnd.gif                }

52ExpandedSubBlockEnd.gif            }

53InBlock.gif            isIE = false;
54ExpandedSubBlockStart.gifContractedSubBlock.gif        }
catch (ex)dot.gif{}
55ExpandedBlockEnd.gif    }
    将它包装成function或者分开使用,悉听尊便,希望借此良策以解众博友之困,更欢迎好的建议在这里汇集。

转载于:https://www.cnblogs.com/BeanHsiang/archive/2008/01/08/1030130.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值