代码之家  ›  专栏  ›  技术社区  ›  Douglas Mayle

当IE的moveToElementText抛出无效参数异常时该怎么办

  •  5
  • Douglas Mayle  · 技术社区  · 17 年前

    我们为Xinha文本编辑器编写了一个插件来处理脚注。你可以看看: http://www.nicholasbs.com/xinha/examples/Newbie.html

    为了处理Webkit和IE处理行末链接的方式的一些问题(无法使用光标离开同一行的链接),我们插入一个空白元素并将选择移动到该元素,然后向右折叠。这在Webkit和Gecko中运行良好,但由于某种原因,moveToElementText抛出了一个无效参数异常。无论我们传递给它哪个元素,函数似乎都完全坏了。然而,在其他代码路径中,此函数似乎有效。

    要使用上面的链接重现错误,请在主文本输入区域中单击,键入任何内容,然后单击带有绿色加号的黄页图标,在lightbox对话框中键入任何内容并单击Insert。导致问题的代码示例如下:

      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

    2 回复  |  直到 17 年前
        1
  •  5
  •   Douglas Mayle    17 年前

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

        2
  •  4
  •   kamens    17 年前

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

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

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