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 ...
随机推荐
- mvc5 + ef6 + autofac搭建项目(四)
在列表页面,点击新增,弹出窗口实现视屏上传,这里存在一个问题,就是大文件上传的问题,iis出于安全问题,有限制,当然这不是大问题,解决也很容易: 见截图: 请忽略视屏文件,看得懂的请装作不懂. 源码 ...
- Delphi Excel
用delphi写excel文件 2007-03-18 21:12 1.引用: Excel2000, OleServer,Comobj, StdCtrls 2.声明变量: ExcelA ...
- JS控制文字一个一个出现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Eclipse反编译工具Jad及插件
Eclipse反编译工具Jad及插件下载路径 http://download.csdn.net/detail/lijun7788/9689312 http://files.cnblogs.com/fi ...
- Windows+Git+TortoiseGit+COPSSH安装图文教程 转载
准备工作: 1. Git-1.8.1.2-preview20130201.exe 下载地址: https://code.google.com/p/msysgit/downloads/list 2. C ...
- Windows下的 mysql 5.5主从同步配置
环境说明: Master:127.0.0.1 3306 Slave:127.0.0.1 3307 MySQL 的 Master 配置: 配置my.ini: [mysqld] # ...
- div section article aside的理解
div 是一个大的容器 内部可以包含header main nav aside footer等标签 没有语义,多用于为脚本添加样式 section的语义比div语义强些,用于主题性比较强的内容,比如一 ...
- 配置并学习微信JS-SDK(2)—扫一扫接口http://www.qq210.com/shoutu/android
http://www.qq210.com/shoutu/android //c_开头的js变量是服务器传过来的 var c_access_token = "<?=$access_tok ...
- __unset()魔术方法 删除类内私有属性
__unset()魔术方法 删除私有属性 unset()对共有属性进行删除 可通过__unset()魔术方法对私有属性进行操作 当在类外部执行unset()函数时,自动执行类内__unset()魔术方 ...
- python 过滤html方法
from HTMLParser import HTMLParser class MLStripper(HTMLParser): """ 过滤html方法 "&q ...