浏览器兼容性改造之为XML支持
来源:互联网 发布:php短网址源码 编辑:程序博客网 时间:2024/05/23 13:25
1、问题描述
1.1、序列化XML
在IE中,提供xml属性,轻松序列化DOM文档,如下:
var xml = xmldom.xml;
为了将XML DOM文档序列化为XML字符串,FireFox 引入了XMLSerializer类型。其他浏览器Opera、Chrome和Safari都支持XMLSerializer,但IE8仍然不支持XMLSerializer。要序列化DOM文档,首先必须创建XMLSerializer的实例,然后将文档传入其中serializeToString()方法,如下:
var serializer = new XMLSerializer();
var xml = serializer.serializerToString(xmldom);
1.2、加载XML
IE中的XML文档对象可以加载来自服务器的文件。要加载XML文档必须与页面中运行的JavaScript代码来自同一台服务器。代码如下:
var xmldom = createDocument();
xmldom.async = false;
xmldom.load(“books.xml”);
Chrome由于安全方面的考虑,不支持load()方法,需要使用AJAX请求方式。
FireFox同样不支持,须为此添加load()方法。
1.3、解析XML
IE浏览器下,解析XML字符串,可通过如下方式:
var xmldom = createDocument();
xmldom.async = false;
xmldom.loadXML(“<BOOKS><BOOK><NAME>UML</NAME></BOOK></BOOKS>”);
为了将XML解析为DOM文档,FireFox引入了DOMPareser类型;后来,Opera也支持该类型。在解析XML之前,首先必须创建一个DOMParser的实例,然后再调用parseFromString()方法。这个方法接受两个参数:要解析的XML字符串和内容类型。返回值为Document的一个实例。如下例子:
var parse = new DOMParser();
var xmldom = parser.parseFromString(“<root></root>”, “text/xml”);
1.4、XPath支持
IE对XPath的支持是内置在XML DOM 文档对象中的。这个节库在每个节点上额外定义了两个方法:selectSingleNode()和selectNodes()。其中,selectSingleNode()方法接受一个XPath模式,在找到匹配节点是返回第一个匹配的节点,如果没有找到匹配的节点就返回null;
另一个方法selectNodes()也接受一个XPath模式作为参数,但它返回与模式匹配的所有节点的NodeList。
鉴于IE对XPath功能的支持有限,因此跨浏览器XPath只能保证到IE支持的功能。也就是要在其他使用DOM3级XPath对象的浏览器中,重新创建selectSingleNode()和selectNodes()方法。
2、解决方案
示例代码:
if (typeof ActiveXObject === "" && document.implementation.hasFeature("XPath", "3.0")) {Document.prototype.readyState = 0;Document.prototype.onreadystatechange = null;Document.prototype.__changeReadyState__ = function(iReadyState) { this.readyState = iReadyState; if (typeof this.onreadystatechange == "function") { this.onreadystatechange(); } }; Document.prototype.__initError__ = function () { this.parseError.errorCode = 0; this.parseError.filepos = -1; this.parseError.line = -1; this.parseError.linepos = -1; this.parseError.reason = null; this.parseError.srcText = null; this.parseError.url = null; }; Document.prototype.__checkForErrors__ = function() { if (this.documentElement.tagName == "parsererror") { var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/; reError.test(this.xml); this.parseError.errorCode = -999999; this.parseError.reason = RegExp.$1; this.parseError.url = RegExp.$2; this.parseError.line = parseInt(RegExp.$3); this.parseError.linepos = parseInt(RegExp.$4); this.parseError.srcText = RegExp.$5; } }; Document.prototype.loadXML = function(sXml) { this.__initError__(); this.__changeReadyState__(1); var oParser = new DOMParser(); var oXmlDom = oParser.parseFromString(sXml, "text/xml"); while (this.firstChild) { this.removeChild(this.firstChild); } for (var i=0; i < oXmlDom.childNodes.length; i++) { var oNewNode = this.importNode(oXmlDom.childNodes[i], true); this.appendChild(oNewNode); } this.__checkForErrors__(); this.__changeReadyState__(4); }; Document.prototype.load = function (sURL) { this.__initError__(); this.__changeReadyState__(1); this.__load__(sURL); }; Document.prototype.__load__ = Document.prototype.load; Document.prototype.__defineGetter__("xml", function() { return (new XMLSerializer()).serializeToString(this, "text/xml"); }); Node.prototype.__defineGetter__("text", function() { var sText = ""; for (var i = 0; i < this.childNodes.length; i++) { if (this.childNodes[i].hasChildNodes()) { sText += this.childNodes[i].text; } else { sText += this.childNodes[i].nodeValue; } } return sText; });Node.prototype.__defineSetter__("text", function(_value) {this.textContent = _value;}); Node.prototype.__defineGetter__("xml", function() { return (new XMLSerializer()).serializeToString(this, "text/xml"); }); Document.prototype.selectSingleNode = Element.prototype.selectSingleNode = function(xpath) { var x = this.selectNodes(xpath); if (!x || x.length < 1) { return null ; } return x[0]; }; Document.prototype.selectNodes = Element.prototype.selectNodes = function(xpath) { var xpe = new XPathEvaluator(); var nsResolver = xpe.createNSResolver(this.ownerDocument == null ? this.documentElement : this.ownerDocument.documentElement); var result = xpe.evaluate(xpath, this, nsResolver, 0, null); var found = []; var res; while(res = result.iterateNext()) { found.push(res); } return found; }; HTMLElement.prototype.__defineGetter__( "innerText", function(){ var anyString = ""; var childS = this.childNodes; for(var i=0; i <childS.length; i++) { if(childS[i].nodeType==1) anyString += childS[i].tagName=="BR" ? '\n' : childS[i].innerText; else if(childS[i].nodeType==3) anyString += childS[i].nodeValue; } return anyString; }); HTMLElement.prototype.__defineSetter__( "innerText", function(sText){ this.textContent=sText; }); }
3、参考
无。
- 浏览器兼容性改造之为XML支持
- 浏览器兼容性改造之为Element添加innerText属性
- 浏览器兼容性改造之创建兼容性XHR
- 浏览器兼容性改造之Core Document
- 浏览器兼容性改造之HTML Event
- struts.xml中namespace的配置之浏览器兼容性
- IE、Safari、Chrome浏览器JavaScript兼容性改造总结
- IE、Safari、Chrome浏览器JavaScript兼容性改造总结 .
- 浏览器兼容性改造过程中遇到的问题
- 文档兼容性之浏览器模式
- XML 浏览器支持
- XML--浏览器支持
- XML 浏览器支持
- 浏览器兼容性之背景色渐变
- div+css之浏览器间的兼容性
- 2017年面试之浏览器兼容性
- 浏览器支持&兼容性查询(CSS、Html5、SVG、JS-Api)
- 浏览器兼容性
- PHP在FastCGI模式时fastcgi_finish_request的妙用
- 风的世界里有海的七滴泪水
- 用Jaxp包中的SAX技术对XML文件进行解析并完成对文件的读取操作.doc
- 心得5--XML编程(CRUD)--dom、sax解析案例分析
- 我的世界观(二)智能存在的意义
- 浏览器兼容性改造之为XML支持
- undefined reference to 'pthread_create' 问题解决
- CentOS6.3配置samba文件服务器
- java中多种方式读文件
- lucene简单安装使用笔记
- 数据库版本控制
- 利用DLL在进程间共享数据
- 关于Python的super用法研究
- maven pom.xml详解