浏览器中XML DOM的支持

IE中通过ActiveXObject实现了XML的支持,存在一下几个版本:
Microsoft.XmlDom,MSXML2.DOMDocument,MSXML2.DOMDocument.3.0,MSXML2.DOMDocument.4.0,MXXML2.DOMDocument.5.0

IE678使用ActiveXObject来实现XML支持,可以通过loadXML()来传入XML字符串;
在现代浏览器下通过document.implementation.createDocument来实现XML支持,
反序列化需要通过DOMParse对象以及parseFromString方法来完成。

对于载入文档完成后的事件触发,IE678使用的是onreadystatechange事件以及判断readyState属性来得知状态;
对于现代浏览器使用的是onload事件。

对于一个XML对象,IE678提供了xml属性序列化;
对于现代浏览器,需要(new XMLSerializer).serializeToString来序列化。

如上分析,想要实现兼容,
可以通过document.prototype.loadXML来实现现代浏览器的loadXML兼容;
可以通过ES5的Object.defineProperty来定义现代浏览器的readyState属性,在set为4的时候触发onreadystatechange事件;
可以通过ES5的Object.defineProperty来定义现代浏览器的xml属性,读取的时候通过XMLSerializer对象来序列化。

不考虑异常和错误,测试代码如下:

 <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style rel="stylesheet" type="text/css">
</style>
<script type="text/javascript">
function createXMLDOM() {
if(!createXMLDOM.cache){
// 现代浏览器分支.
if(document.implementation && document.implementation.createDocument){
createXMLDOM.cache=function(){
var xmldom=document.implementation.createDocument("","",null); // 兼容onreadystatechange方法.
_fix_onreadystatechange.call(xmldom);
// 添加一个触发事件.
xmldom.addEventListener("load",function(){
// 设置readyState为4.被动触发onreadystatechange事件.
this.readyState=4;
},false);
return xmldom;
};
// 兼容loadXML方法.
_fix_loadXML();
// 兼容xml属性
_fix_xml();
return createXMLDOM.cache();
}
// IE678分支.
else if(window.ActiveXObject){
var vs=["MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0",
"MSXML2.DOMDocument.3.0","MSXML2.DOMDocument",
"Microsoft.XmlDom"];
for(var i=0,j=vs.length;i<j;i++){
try{
var oxmldom=new ActiveXObject(vs[i]);
createXMLDOM.cache=new Function("x","return new ActiveXObject('"+vs[i]+"');"); return oxmldom;
}
catch(ex){}
}
}
// 都不兼容.
else{
createXMLDOM.cache=new Function("return null;");
return null;
}
}
else{
return createXMLDOM.cache();
}
} /* loadXML的兼容处理.现代浏览器. */
function _fix_loadXML(){
Document.prototype.loadXML=function(sxml){
var oparse=new DOMParser();
var oxmldom=oparse.parseFromString(sxml, "text/xml");
while(this.firstChild){
this.removeChild(this.firstChild);
}
for(var i=0,j=oxmldom.childNodes.length;i<j;i++){
// 获取另一个文档的某个节点以及所有子节点.
var onewnode=this.importNode(oxmldom.childNodes[i],true);
// 添加到该文档中.
this.appendChild(onewnode);
}
// 这里修正readyState属性.
this.readyState=4;
};
}
/* 处理onreadystatechange的兼容. */
function _fix_onreadystatechange(){
if(Object.defineProperty){
Object.defineProperty(this,"readyState",{
get:function(){
return this.__readyState__;
},
set:function(i){
this.__readyState__=i;
this.onreadystatechange();
}
});
}
}
/* 现代浏览器需要通过DOMParser对象并通过parseFromString来转换XML文档为字符串 */
function _fix_xml(){
// ES5新特性.
if(Object.defineProperty){
Object.defineProperty(Node.prototype,"xml",{
get:function(){
return (new XMLSerializer).serializeToString(this,"text/xml");
}
})
}
// 如下分支IE9开始不支持了.非W3C标准.
//else if(Node.prototype.__defineGetter__){
// Node.prototype.__defineGetter__("xml",function(){
// return (new XMLSerializer).serializeToString(this,"text/xml");
// });
//}
} /* 测试 */
window.onload=function(){
var xml1=createXMLDOM();
var xml2=createXMLDOM();
xml2.onreadystatechange=function(){
// 这里不能用this.因为在处理ActiveX对象可能出现问题.
if(xml2.readyState==4){
document.body.innerHTML+="load xml ok<br/>";
}
}
xml2.loadXML("<xml><blog>xf_z1988</blog></xml>");
var xml_str=xml2.xml.replace(/</g,"&lt;").replace(/>/g,"&gt;");
document.body.innerHTML+=xml_str;
};
</script>
</head>
<body></body>
</html>

JavaScript XML 兼容处理,序列化和反序列化以及回调事件的更多相关文章

  1. XML和JSON序列化以及反序列化

    1.将文件保存序列化至文档中,然后再读取: //首先创建可序列化的实体类 [Serializable] public class Message { public string Name { get; ...

  2. xml对象的序列化和反序列化

    对象序列化: /// <summary>        /// 将一个对象序列化为XML字符串        /// </summary>        /// <par ...

  3. javascript下的json 序列化及反序列化

    1.序列化 将json对象转为字符串: JSON.stringify(jsonObj) 2.反序列化 var jsonObj = eval("(" + jsonstring + & ...

  4. javascript中的JSON序列化与反序列化

    简单粗暴上代码: function create() { this.name = "jack"; this.sex = "man"; } create.prot ...

  5. Javascript中JSON的序列化和反序列化(转)

    parse用于从一个字符串中解析出JSON对象,如: var str = '{"name":"easonjim","age":"2 ...

  6. C#的XML序列化及反序列化

    webservice在工作中用到的很多,基本都是以XML格式问通讯内容,其中最关键的就是XML串的序列化及反序列化. XML的运用中有两种信息传递,一种为XML的请求信息,另一种为返回信息,要运用XM ...

  7. C# Note4:XML序列化和反序列化(含加密解密等)

    前言 在项目中,我们经常用到各种配置文件,比如xml文件.binary文件等等,这里主要根据实践经验介绍下xml文件的序列化和反序列化(毕竟最常用). 实践背景:我要做一个用户管理功能,用户账号信息存 ...

  8. C# 序列化和反序列化 详解

    什么是序列化以及如何实现序列化? 如何将对象数据写入 XML 文件? 如何从 XML 文件读取对象数据? 什么是序列化以及如何实现序列化? 序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内 ...

  9. Protostuff序列化和反序列化

    序列化和反序列化是在应对网络编程最常遇到的问题之一. 序列化就是将Java Object转成byte[]:反序列化就是将byte[]转成Java Object. 这里不介绍JDK serializab ...

随机推荐

  1. Spring处理id相同的bean

    http://www.360doc.com/content/13/1018/05/41237_322247510.shtml(应该可以解决) http://www.2cto.com/kf/201601 ...

  2. uniq和sort的用法

    uniq和sort都是按行操作的linux命令. sort按文本行排序,如下所示的log文件:直接sort log即可将其排序. 容易忽略的是sort -n命令,在如下例子中将看到 如果直接sort则 ...

  3. 【实习记】2014-08-26都是回车惹的祸——shell脚本必须是unix行尾

        事情由起:svn的url在excel里,我复制到txt文本下,vi做些文本处理,只提取了url,保存为url.txt.再用vi处理url.txt,加上svn checkout等词,变成可以运行 ...

  4. Android学习4—短信发送器的实现

    界面预览: 由图中可以看出,此APP需要的组件有:两个TextView,一个用于显示手机号码的标题,另一个用于显示短信内容的标题.                                    ...

  5. js获取星期几

    function getweek(time) { /*显示星期*/ /*time为date格式*/ var str; var d = time.getDay(); switch (d) { case ...

  6. 使用css3画饼图

    CSS3 Gradient介绍参考地址: http://www.cnblogs.com/lhb25/archive/2013/01/30/css3-linear-gradient.html http: ...

  7. js实现中文简繁切换效果

    html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  8. [CSS]文本属性(Text)

      CSS 文本属性(Text) 属性 描述 CSS color 设置文本的颜色. 1 direction 规定文本的方向 / 书写方向. 2 letter-spacing 设置字符间距. 1 lin ...

  9. iOS: 神奇的addSubView

    看着addSubView, 本以为是添加多个对象, 但通过测试代码, 发现同一个对象在addSubView中只会添加一次. 想想, 视图对象是通过引用得到的. 在视图的子视图集中, 只保存一个相应的对 ...

  10. iOS: 属性列表介绍 Introduction to Property Lists

    iOS: 属性列表介绍 Introduction to Property Lists 从本质上说, 属性列表就是苹果的对象数据序列化与反序列化方式 属性列表使用几种数据类型把数据组织为键值表和值表 P ...