原帖地址:
http://www.cnblogs.com/huacn/archive/2007/07/23/javascript_firefox_xml_document_selectNodes.html
最近在修改项目的用到 Ajax功能的页面,发现很多写法在 Firefox下都存在问题,主要是因为当时开发时只在IE下测试通过就提交了,而Firefox的写法与IE有很大的区别,主大的问题是当在读取 XML节点或子节点的内容时,IE下一般使用 selectNodes 、 selectSingleNode 这 些方法,而Firefox并没有这些方法,所以不能使用,前几天找了好久终于,一直没有找到一个很好的解决方法,很多网站提供的要不就是根本不支持,要不 就是使用方法,不方便不实用,今天我终于找到一个很好的解决方法了,我把它弄成一个JS文件,只要引用它就可以像IE一样使用了。
代码如下:
只要把以上代码存成一个JS文件,在页面上引用它,当XML节点的读取操作就可以像IE一样使用了,已经通过测试。
Firefox XML读取类下载地址: http://www.cnblogs.com/Files/huacn/jquery.xml.js
Firefox 读XML演示地址: http://www.wathon.com/opensource/js/xmlrssreader/xmlrssreader.html
Firefox 读XML例子源代码打包下载: http://www.wathon.com/opensource/js/xmlrssreader/xmlrssreader.zip
http://www.cnblogs.com/huacn/archive/2007/07/23/javascript_firefox_xml_document_selectNodes.html
最近在修改项目的用到 Ajax功能的页面,发现很多写法在 Firefox下都存在问题,主要是因为当时开发时只在IE下测试通过就提交了,而Firefox的写法与IE有很大的区别,主大的问题是当在读取 XML节点或子节点的内容时,IE下一般使用 selectNodes 、 selectSingleNode 这 些方法,而Firefox并没有这些方法,所以不能使用,前几天找了好久终于,一直没有找到一个很好的解决方法,很多网站提供的要不就是根本不支持,要不 就是使用方法,不方便不实用,今天我终于找到一个很好的解决方法了,我把它弄成一个JS文件,只要引用它就可以像IE一样使用了。
代码如下:
var
GetNodeValue
=
function
(obj)
{
var str = "" ;
if (window.ActiveXObject) // IE
{
str = obj.text;
}
else // Mozilla
{
try
{
str = obj.childNodes[ 0 ].nodeValue;
}
catch (ex)
{
str = "" ;
}
}
return str;
}
if (document.implementation && document.implementation.createDocument)
{
XMLDocument.prototype.loadXML = function (xmlString)
{
var childNodes = this .childNodes;
for ( var i = childNodes.length - 1 ; i >= 0 ; i -- )
this .removeChild(childNodes[i]);
var dp = new DOMParser();
var newDOM = dp.parseFromString(xmlString, " text/xml " );
var newElt = this .importNode(newDOM.documentElement, true );
this .appendChild(newElt);
};
// check for XPath implementation
if ( document.implementation.hasFeature( " XPath " , " 3.0 " ) )
{
// prototying the XMLDocument
XMLDocument.prototype.selectNodes = function (cXPathString, xNode)
{
if ( ! xNode ) { xNode = this ; }
var oNSResolver = this .createNSResolver( this .documentElement)
var aItems = this .evaluate(cXPathString, xNode, oNSResolver,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null )
var aResult = [];
for ( var i = 0 ; i < aItems.snapshotLength; i ++ )
{
aResult[i] = aItems.snapshotItem(i);
}
return aResult;
}
// prototying the Element
Element.prototype.selectNodes = function (cXPathString)
{
if ( this .ownerDocument.selectNodes)
{
return this .ownerDocument.selectNodes(cXPathString, this );
}
else { throw " For XML Elements Only " ;}
}
}
// check for XPath implementation
if ( document.implementation.hasFeature( " XPath " , " 3.0 " ) )
{
// prototying the XMLDocument
XMLDocument.prototype.selectSingleNode = function (cXPathString, xNode)
{
if ( ! xNode ) { xNode = this ; }
var xItems = this .selectNodes(cXPathString, xNode);
if ( xItems.length > 0 )
{
return xItems[ 0 ];
}
else
{
return null ;
}
}
// prototying the Element
Element.prototype.selectSingleNode = function (cXPathString)
{
if ( this .ownerDocument.selectSingleNode)
{
return this .ownerDocument.selectSingleNode(cXPathString, this );
}
else { throw " For XML Elements Only " ;}
}
}
}
{
var str = "" ;
if (window.ActiveXObject) // IE
{
str = obj.text;
}
else // Mozilla
{
try
{
str = obj.childNodes[ 0 ].nodeValue;
}
catch (ex)
{
str = "" ;
}
}
return str;
}
if (document.implementation && document.implementation.createDocument)
{
XMLDocument.prototype.loadXML = function (xmlString)
{
var childNodes = this .childNodes;
for ( var i = childNodes.length - 1 ; i >= 0 ; i -- )
this .removeChild(childNodes[i]);
var dp = new DOMParser();
var newDOM = dp.parseFromString(xmlString, " text/xml " );
var newElt = this .importNode(newDOM.documentElement, true );
this .appendChild(newElt);
};
// check for XPath implementation
if ( document.implementation.hasFeature( " XPath " , " 3.0 " ) )
{
// prototying the XMLDocument
XMLDocument.prototype.selectNodes = function (cXPathString, xNode)
{
if ( ! xNode ) { xNode = this ; }
var oNSResolver = this .createNSResolver( this .documentElement)
var aItems = this .evaluate(cXPathString, xNode, oNSResolver,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null )
var aResult = [];
for ( var i = 0 ; i < aItems.snapshotLength; i ++ )
{
aResult[i] = aItems.snapshotItem(i);
}
return aResult;
}
// prototying the Element
Element.prototype.selectNodes = function (cXPathString)
{
if ( this .ownerDocument.selectNodes)
{
return this .ownerDocument.selectNodes(cXPathString, this );
}
else { throw " For XML Elements Only " ;}
}
}
// check for XPath implementation
if ( document.implementation.hasFeature( " XPath " , " 3.0 " ) )
{
// prototying the XMLDocument
XMLDocument.prototype.selectSingleNode = function (cXPathString, xNode)
{
if ( ! xNode ) { xNode = this ; }
var xItems = this .selectNodes(cXPathString, xNode);
if ( xItems.length > 0 )
{
return xItems[ 0 ];
}
else
{
return null ;
}
}
// prototying the Element
Element.prototype.selectSingleNode = function (cXPathString)
{
if ( this .ownerDocument.selectSingleNode)
{
return this .ownerDocument.selectSingleNode(cXPathString, this );
}
else { throw " For XML Elements Only " ;}
}
}
}
只要把以上代码存成一个JS文件,在页面上引用它,当XML节点的读取操作就可以像IE一样使用了,已经通过测试。
Firefox XML读取类下载地址: http://www.cnblogs.com/Files/huacn/jquery.xml.js
Firefox 读XML演示地址: http://www.wathon.com/opensource/js/xmlrssreader/xmlrssreader.html
Firefox 读XML例子源代码打包下载: http://www.wathon.com/opensource/js/xmlrssreader/xmlrssreader.zip