IE的moveToElementText吐出Invalid Argument异常时该怎么办
我们已经为Xinha文本编辑器编写了一个插件来处理脚注。我们可以看一下:
http://www.nicholasbs.com/xinha/examples/Newbie.html
为了处理Webkit和IE在行尾处处理链接的方式上的一些问题(无法使用光标移出同一行上的链接),我们插入一个空白元素并将所选内容移至该位置,而不是崩溃。这在Webkit和Gecko中可以正常工作,但是由于某些原因moveToElementText会吐出一个Invalid Argument异常。传递给哪个元素都没有关系,该功能似乎已完全损坏。但是,在其他代码路径中,此功能似乎起作用。
要使用上面的链接重现该错误,请在主文本输入区域中单击,键入任何内容,然后单击带有绿色加号的黄页图标,在灯箱对话框中键入任何内容,然后单击"插入"。导致问题的代码示例如下:
if (Xinha.is_ie) { var mysel = editor.getSelection(); var myrange = doc.body.createTextRange(); myrange.moveToElementText(newel); } else { editor.selectNodeContents(newel, false); }
有问题的代码位于svn中,网址为:
https://svn.openplans.org/svn/xinha_dev/InsertNote
此插件是针对svn的Xinha分支构建的,网址为:
http://svn.xinha.webfactional.com/branches/new-dialogs
解决方案
在上面的代码段中看不到它,但是newel已使用另一个自身添加到DOM的元素添加到了dom。插入dom元素时,如果要引用其同级元素,则必须重新获取句柄,因为该句柄无效(我不确定,但我认为它是指文档片段内的DOM元素,而不是从文档操作中检索到句柄之后,moveToElementText停止引发异常。
我在实现WYSIWYG编辑器的过程中曾经历过多次调试该IE异常的不幸经历,它总是来自访问DOM节点(例如.parentNode)上的属性或者将DOM节点传递给函数(例如DOM节点当前不在要呈现的文档中时)。
如我们所说,有时DOM节点是文档片段的一部分,已从浏览器呈现的"实际" DOM中删除了该文档片段,有时甚至还没有插入该节点。无论哪种方式,在DOM节点上都有许多属性和方法,只有在将节点正确插入并呈现在"实际" DOM中之后,才能在IE6中安全地对其进行访问。
真正的缺点是,经常无法通过try / catch保护IE6的"无效参数"异常的这种表现。