Sarissa 在winxp+sp2或者win2003+sp1上面的单元测试是无法全部通过的,在 testCopyChildNodes 和 testMoveChildNodes 两个试例中报错误。
跟踪了一番代码,确定了问题出现在:copyChildNodes 和 moveChildNodes这两个函数的这一行上:
if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {
这个javascript本身是没有错的,错就错在IE。最新版的IE补丁使IE支持Msxml2.DOMDocument.5.0和Msxml2.DOMDocument.4.0,这两个ActiveX虽然没有提供对importNode这个API的支持,但是却内部使用了这个API名字,并且没有很好的包装,导致在判断ownerDoc.importNode 是否存在的时候居然抛了异常。
解决方法之一,是利用逻辑短路原理,调整判断逻辑
if((!_SARISSA_IS_IE) && ownerDoc.importNode ) {
这样在IE上后面一个判断就不会被执行了。
更安全的方法是使用in关键字
if("importNode" in ownerDoc && (!_SARISSA_IS_IE)) {
in关键字不会造成浏览器误会我们要访问importNode这个内部API而抛异常,它只是很忠实的高速我们属性是否存在。
相关的讨论见:
https://sourceforge.net/forum/forum.php?thread_id=1237853&forum_id=256492