浏览器中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. IOS-UIScrollView实现图片分页

    1.设置可以分页 _scrollView.pagingEnabled = YES; 2.添加PageControl UIPageControl *pageControl = [[UIPageContr ...

  2. KVC 和 OC字典

    KVC(键值编码)和OC 字典很相似,都是键值存储.但是OC 字典比较灵活,它是一种映射. [dict setObject:<#(id)#> forKey:<#(id<NSCo ...

  3. Angularjs简介

    很久没有系统学习一个新技术了,angularjs将会比较系统的讲解这个技术的语法.应用.次类型的博客将会持续更新,博主也是一个初学者,如果有问题欢迎留言讨论. angularjs简介. angular ...

  4. sharepoint的webpart开发

    前言 以前没有接触sharepoint感觉这东西好陌生,只是知道.来公司这段时间,也没有参加开发.今天自己简单的实现了一下这个开发过程,webpart部分的. 过程 其实webpart可以理解为一个放 ...

  5. 通过javascript实现页面的横竖屏固定

    javascript是不能固定页面是横屏还是竖屏的,但是我们可以通过另外一种思路来监听window.orientation状态,假设我们要固定页面为横屏显示,则当window.orientation返 ...

  6. laravel学习前期遇到的小知识点(1)

    1. 目前我用的laravel 5.2.36版本web中间件成为全局中间件(不知道从5.2.26以上就改变了还是怎样,没有深究),也就是之前的版本路由里默认会有一个Route::group的web中间 ...

  7. asp.net中的<%%>形式的详细用法实例讲解

    asp.net中的代码分离模式我们肯定都不陌生,C#(或者其它语言)写的代码一般不会和设计语言HTML混在一起,但是有的时候也避免不了,这时就会在UI页面里用<%%>来绑定显示.绑定变量数 ...

  8. finalspeed服务器端和客户端安装

    https://www.91yun.org/archives/2775 https://www.91yun.org/archives/615 1.首先安装服务器端:一键安装代码 wget -N --n ...

  9. matlab函数之diag

    diag(A) 这个看似简单的函数确认让我头疼了几个小时 该函数其实有两个作用 ① 如果A是一个矩阵,那么diag(A)的作用便是提取A的对角线元素 ② 如果A是一个向量,那么diag(A)的作用便是 ...

  10. python之requests-multipart/from-data

    示例代码:files = {"token":(None,token), "key":(None,key), "file":"hel ...