5

我们为 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

这个插件是针对 Xinha 的一个分支构建的,可以从 svn 获得: http ://svn.xinha.webfactional.com/branches/new-dialogs

4

2 回答 2

5

它在上面的代码片段中不可见,但 newel 已使用另一个元素附加到 dom,该元素本身附加到 DOM。插入 dom 元素时,如果要引用其兄弟元素,则必须重新检索句柄,因为句柄无效(我不确定,但我认为它指的是文档片段内的 DOM 元素,而不是文档内部的那个。)从插入操作中重新检索句柄后,moveToElementText 停止抛出异常。

于 2008-09-23T18:35:08.290 回答
4

在实现 WYSIWYG 编辑器时,我曾多次调试此 IE 异常的不幸经历,它总是由访问 DOM 节点(例如 .parentNode)上的属性或将 DOM 节点传递给函数(例如moveToElementText),而 DOM 节点当前不在正在呈现的文档中。

正如您所说,有时 DOM 节点是文档片段的一部分,已从浏览器呈现的“实际”DOM 中删除,有时节点还没有被插入。 无论哪种方式,DOM 节点上的许多属性和方法都无法在 IE6 中安全地访问,除非该节点已正确插入并呈现在“实际”DOM 中。

真正的问题是,这种 IE6 的“无效参数”异常的表现通常无法通过 try/catch 进行保护。

于 2008-09-24T03:01:04.487 回答