日期:2014-05-16 浏览次数:20478 次
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>New Document</TITLE>
<script type="text/javascript">
if(document.implementation && document.implementation.createDocument){
alert('运行了Mozilla');
/*因为Mozilla中不支持readyState和onreadystatechange特性
*所以要为Mozilla定义这些属性
*/
Document.prototype.readyState = 0;
Document.prototype.onreadystatechange = null;
/*因为Mozilla中不能监听事件状态
*所以要为Mozilla创建监听事件状态私有方法
*/
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对象赋上_checkForErrors_私有原型属性
*判断是否XML解析错误,如果解析错误,得到各个错误信息
*/
Document.prototype._checkForErrors_ = function(){
/*
*因为Mozilla中如果解析XML错误后不会报错,而是直接显示出错误(判断oXmlDom.documentElement.tagName == *'parsererror')即可
*/
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;
}
};
//Mozilla中五种状态的模拟,将字符串转化成xml
Document.prototype.loadXML = function(sXml){
this._initError_();
//即将开始载入
this._changeReadyState(1);
var oParser = new DOMParser();
//Mozilla中将字符串转化成xml对象
var oXmlDom = oParser.parseFromString(sXml,"text/xml");
//清空Docuemnt
while(this.firstChild){
this.removeChild(this.firstChild);
}
for(var i=0;i<oXmlDom.childNodes.length;i++){
//将字符串转化的xml对象的结点导入到文档对象中
var oNewNode = this.importNode(oXmlDom.childNodes[i],true);
this.appendChild(oNewNode);
}
//判断是否有错误
this._checkForErrors_();
//载入完成
this._changeReadyState(4);
};
//Mozilla中原始load,直接读取xml文件,将Mozilla中本身拥有的load方法的引用存起来
Document.prototype._load_ = Document.prototype.load;
//Mozilla中模拟load,定义新的Mozilla的load方法
Document.prototype.load = function(sURL){
//初始化错误
this._initError_();
this._changeReadyState_(1);
//调用本身已有的load方法
this._load_(sURL);
};
/*因为Mozilla没有Node.xml这个方法获得某个结点的xml字符串
*所以我们用Mozilla的_defineGetter_方法将xml特性和对应的方法绑定在一起
*
*/
Node.prototype.__defineGetter__('xml',function(){
var oSerializer = new XMLSerializer();
//将这个xml对象转换成字符串
return oSerializer.serializeToString(this,"text/xml");
});
}
//此方法是从IE和Mozilla浏览器中得到xmldom对象,并返回xml对象oXmlDom
function XmlDom(){
if(window.ActiveXObject){
alert('创建了IE的xml对象');
//IE中xml对象的各个版本
var arrSignatures =['MSXML2.DOMDocument.5.0','MSXML2.DOMDocument.4.0','MSXML2.DOMDocument.3.0','MSXMS2.DOMDocument','Microsoft.XmlDom'];
for(var i=0;i < arrSignatures.length;i++){
try{
//IE中创建基于ActiveX的ActiveXObject对象
var oXmlDom = new ActiveXObject(arrSignatures[i]);
return oXmlDom
}catch(oError){
//抛出异常
throw new Error("无法创建IE的"+arrSignatures[i]+"版本的ActiveXObject对象");
}
}
}else if(document.implementation && document.implementation.createDocument){
alert('创建了Mozilla的xml对象');
//创建Mozilla的XML DOM对象
var oXmlDom = document.implementation.createDocument('','',null);
/*IE中XML的错误特性是parseError,对parseError自身取值,返回的是errorCode代码,不等于0则表示没有错误
*因为Mozilla中如果解析XML错误后不会报错,而是直接显示出错误(判断oXmlDom.documentElement.tagName == *'parsererror')
*所以要给Mozilla的XML对象创建parseError属性,并重写valueOf和toString方法
*/
oXmlDom