JavaScript XML 兼容处理,序列化和反序列化以及回调事件
浏览器中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,"<").replace(/>/g,">");
document.body.innerHTML+=xml_str;
};
</script>
</head>
<body></body>
</html>
JavaScript XML 兼容处理,序列化和反序列化以及回调事件的更多相关文章
- XML和JSON序列化以及反序列化
1.将文件保存序列化至文档中,然后再读取: //首先创建可序列化的实体类 [Serializable] public class Message { public string Name { get; ...
- xml对象的序列化和反序列化
对象序列化: /// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <par ...
- javascript下的json 序列化及反序列化
1.序列化 将json对象转为字符串: JSON.stringify(jsonObj) 2.反序列化 var jsonObj = eval("(" + jsonstring + & ...
- javascript中的JSON序列化与反序列化
简单粗暴上代码: function create() { this.name = "jack"; this.sex = "man"; } create.prot ...
- Javascript中JSON的序列化和反序列化(转)
parse用于从一个字符串中解析出JSON对象,如: var str = '{"name":"easonjim","age":"2 ...
- C#的XML序列化及反序列化
webservice在工作中用到的很多,基本都是以XML格式问通讯内容,其中最关键的就是XML串的序列化及反序列化. XML的运用中有两种信息传递,一种为XML的请求信息,另一种为返回信息,要运用XM ...
- C# Note4:XML序列化和反序列化(含加密解密等)
前言 在项目中,我们经常用到各种配置文件,比如xml文件.binary文件等等,这里主要根据实践经验介绍下xml文件的序列化和反序列化(毕竟最常用). 实践背景:我要做一个用户管理功能,用户账号信息存 ...
- C# 序列化和反序列化 详解
什么是序列化以及如何实现序列化? 如何将对象数据写入 XML 文件? 如何从 XML 文件读取对象数据? 什么是序列化以及如何实现序列化? 序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内 ...
- Protostuff序列化和反序列化
序列化和反序列化是在应对网络编程最常遇到的问题之一. 序列化就是将Java Object转成byte[]:反序列化就是将byte[]转成Java Object. 这里不介绍JDK serializab ...
随机推荐
- Android开发手记(22) 传感器的使用
Android的传感器主要包括八大传感器,他们分别是:加速度传感器(accelerometer).陀螺仪(gyroscope).方向传感器(orientation).磁力传感器(magnetic fi ...
- LIB库加载方法-引用百度百科
LIB库加载方法,有三种,如下: 1.LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中\"Add Files to Project\ ...
- 请描述一下 cookies,sessionStorage 和 localStorage 的区别?
http://handyxuefeng.blog.163.com/blog/static/454521722013111714040259/ http://book.51cto.com/art/201 ...
- jQuery 标签淡入淡出 个人随笔
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- HDU 5491 The Next
Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two in ...
- WPF学习(二)布局与菜单、工具栏
布局 //表格①Grid//3列 4行的表格 <Grid> <Grid.ColumDefinitions> <ColumnDefinti ...
- javascript 获取 class 样式 重新赋值class样式 为div等系列标签内更改内容
name = document.getElementById(project_not_through_id).className; // 获取目标id的 cla ...
- getimagesize函数介绍
getimagesize(); 返回结果说明 索引 0 给出的是图像宽度的像素值 索引 1 给出的是图像高度的像素值 索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 ...
- Collection View 自定义布局(custom flow layout)
Collection view自定义布局 一般我们自定义布局都会新建一个类,继承自UICollectionViewFlowLayout,然后重写几个方法: prepareLayout():当准备开始布 ...
- Codeforces Round #315 (Div. 2)
这次可以说是最糟糕的一次比赛了吧, 心没有静下来好好的去思考, 导致没有做好能做的题. Problem_A: 题意: 你要听一首时长为T秒的歌曲, 你点击播放时会立刻下载好S秒, 当你听到没有加载到的 ...