js针对IE 和 Mozilla 的差异 IEprototypeXMLJavaScript框架
程序员文章站
2022-05-29 22:47:29
...
兼容性的问题 webfx 网站已经做了很好的尝试,他们对 IE 和 Mozilla 中 JavaScript 的差异做了很好的封装。
其实我们的 Web 开发框架移植到 Mozilla 上并不是非常困难。只是目前没有明显的经济利益刺激我们做这件事。
IE 与 Mozilla 的主要差别在于:
1、对 HTML DOM 规范的支持,IE 除了支持标准的 API,还提供了 document.all() 这个便于使用的方法。但是这个方法完全可以使用标准的 getElementById() 来替代。
2、对 XML DOM,IE 提供了 selectSingleNode() 和 selectNodes() 两个便于使用的方法,而 Mozilla 使用标准的 evaluate() 方法。解决的方法是在 Mozilla 中模拟 IE 的行为。IE 中的 XML DOM 是作为 ActiveX 插件的形式(打补丁的方式)提供的,Mozilla 则本身就支持 XML DOM。
3、IE 支持 XML Data Island,而 Mozilla 由于对 XML 有更好的支持,所以完全不需要提供 XML Data Island 这种机制。但是 Mozilla 可以模拟 IE 的 XML Data Island。
http://www.mozilla.org/xmlextras/xmldataislands/
4、对于 XMLHTTP 的支持,IE 使用 ActiveX 插件实现,Mozilla 则使用 XPCOM 组件实现。但是两者的接口是相同的。
5、访问本地文件系统的方法不同,IE 使用 ActiveX 插件,Mozilla 则使用 XPCOM 组件。
6、对于事件处理的机制完全不同,IE 采用“事件传播”(“事件起泡”)方式,Mozilla 采用“事件捕捉”方式。
问题 1、2、3、4、5 都可以通过封装的方式轻易解决,但是问题 6 要很好地封装就有些难度了。
Mozilla 中的 selectSingleNode() 和 selectNodes():
其实我们的 Web 开发框架移植到 Mozilla 上并不是非常困难。只是目前没有明显的经济利益刺激我们做这件事。
IE 与 Mozilla 的主要差别在于:
1、对 HTML DOM 规范的支持,IE 除了支持标准的 API,还提供了 document.all() 这个便于使用的方法。但是这个方法完全可以使用标准的 getElementById() 来替代。
2、对 XML DOM,IE 提供了 selectSingleNode() 和 selectNodes() 两个便于使用的方法,而 Mozilla 使用标准的 evaluate() 方法。解决的方法是在 Mozilla 中模拟 IE 的行为。IE 中的 XML DOM 是作为 ActiveX 插件的形式(打补丁的方式)提供的,Mozilla 则本身就支持 XML DOM。
3、IE 支持 XML Data Island,而 Mozilla 由于对 XML 有更好的支持,所以完全不需要提供 XML Data Island 这种机制。但是 Mozilla 可以模拟 IE 的 XML Data Island。
http://www.mozilla.org/xmlextras/xmldataislands/
4、对于 XMLHTTP 的支持,IE 使用 ActiveX 插件实现,Mozilla 则使用 XPCOM 组件实现。但是两者的接口是相同的。
5、访问本地文件系统的方法不同,IE 使用 ActiveX 插件,Mozilla 则使用 XPCOM 组件。
6、对于事件处理的机制完全不同,IE 采用“事件传播”(“事件起泡”)方式,Mozilla 采用“事件捕捉”方式。
问题 1、2、3、4、5 都可以通过封装的方式轻易解决,但是问题 6 要很好地封装就有些难度了。
Mozilla 中的 selectSingleNode() 和 selectNodes():
if(isMozilla); { XMLDocument.prototype.selectSingleNode = function(tagname); { var result = this.evaluate(tagname, this, null, 0, null);; return result.iterateNext();; } //定义一个新的类以兼容 IE 中 selectNodes(); 的返回类型。 function __XMLNodes(result); { this.length = 0; this.pointer = 0; this.array = new Array();; var i = 0; while((this.array[i]=result.iterateNext(););!=null); i++; this.length = this.array.length; } XMLNodes.prototype.nextNode = function(); { this.pointer++; return this.array[pointer-1]; } XMLNodes.prototype.reset = function(); { this.pointer = 0; } XMLDocument.prototype.selectNodes = function(tagname); { var result = this.evaluate(tagname, this, null, 0, null);; var xns = new __XMLNodes(result);; return xns; } }