4。错误处理,同样与IE不同,Mozilla当解析错误时会返回一段代码,以标签<prasereoor>包括其中的代码解释了错误发生的原因以及位置等信息,我们只有通过正则表达式解析此段代码,提取错误信息。
- var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
- //返回代码的标签名为parsererror,表示错误发生
- if (oXmlDom.documentElement.tagName == "parsererror") {
- reError.test(oXmlDom.xml);
- alert("An error occurred:\n描述: "
- + RegExp.$1 + "\n"
- + "文件名: " + RegExp.$2 + "\n"
- + "行数: " + RegExp.$3 + "\n"
- + "列数: " + RegExp.$4 + "\n"
- + "原因: " + RegExp.$5);
- }
三,提供一个跨浏览器的XML DOM对象解决方案,来自于《javascript高级程序设计》
- function XmlDom() {
- //通过对象/属性检测法,判断是IE来是Mozilla
- if (window.ActiveXObject) {
- var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",
- "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument",
- "Microsoft.XmlDom"];
- for (var i=0; i < arrSignatures.length; i++) {
- try {
- var oXmlDom = new ActiveXObject(arrSignatures[i]);
- return oXmlDom;
- } catch (oError) {
- //ignore
- }
- }
- throw new Error("MSXML is not installed on your system.");
- //同上
- } else if (document.implementation && document.implementation.createDocument) {
- var oXmlDom = document.implementation.createDocument("","",null);
- //创建Mozilla版本的parseError对象
- oXmlDom.parseError = {
- valueOf: function () { return this.errorCode; },
- toString: function () { return this.errorCode.toString() }
- };
- //初始化parseError对象
- oXmlDom.__initError__();
- oXmlDom.addEventListener("load", function () {
- this.__checkForErrors__();
- this.__changeReadyState__(4);
- }, false);
- return oXmlDom;
- } else {
- throw new Error("Your browser doesn't support an XML DOM object.");
- }
- }
- //此处用到了该书中一个浏览器系统检测js文件,如果是Mozilla
- if (isMoz) {
- Document.prototype.readyState = 0;
- Document.prototype.onreadystatechange = null;
- Document.prototype.__changeReadyState__ = function (iReadyState) {
- this.readyState = iReadyState;
- if (typeof this.onreadystatechange == "function") {
- this.onreadystatechange();
- }
- };
- //初始化parseError对象
- 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.prototype.__checkForErrors__ = function () {
- 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的loadXML方法
- Document.prototype.loadXML = function (sXml) {
- this.__initError__();
- this.__changeReadyState__(1);
- var oParser = new DOMParser();
- var oXmlDom = oParser.parseFromString(sXml, "text/xml");
- while (this.firstChild) {
- this.removeChild(this.firstChild);
- }
- for (var i=0; i < oXmlDom.childNodes.length; i++) {
- var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
- this.appendChild(oNewNode);
- }
- //载入后检查错误
- this.__checkForErrors__();
- //没有问题,设置readyState属性为4
- this.__changeReadyState__(4);
- };
- Document.prototype.__load__ = Document.prototype.load;
- Document.prototype.load = function (sURL) {
- this.__initError__();
- this.__changeReadyState__(1);
- this.__load__(sURL);
- };
- Node.prototype.__defineGetter__("xml", function () {
- var oSerializer = new XMLSerializer();
- return oSerializer.serializeToString(this, "text/xml");
- });
- }
第1页:不同浏览器的XMLDOM 对象(1) 第2页:不同浏览器的XMLDOM 对象(2)
© CopyRight 2008-2010, JSJGZ.CN, 计算机故障 Inc. All Rights Reserved
闽ICP备09000710号 增值电信业务经营许可证闽B2-20080004号 Rss订阅