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

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

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

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

    为了处理WebKit和IE在行尾处理链接的方式方面的一些问题(无法使用光标从同一行的链接中移出),我们插入一个空白元素并将所选内容移动到该元素,而不是向右折叠。这在webkit和gecko中很有效,但出于某种原因,moveToelementText抛出了一个无效的参数异常。不管我们将哪个元素传递给它,函数似乎完全被破坏了。然而,在其他代码路径中,这个函数似乎可以工作。

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

      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 回复  |  直到 16 年前
        1
  •  5
  •   Douglas Mayle    16 年前

    它在上面的代码片段中不可见,但是newel已经使用另一个元素附加到了dom中。在插入一个dom元素时,如果希望引用它的兄弟元素,则必须重新检索句柄,因为该句柄无效(我不确定,但我认为它引用的是文档片段内的dom元素,而不是文档片段内的dom元素)。从插入操作重新检索句柄后,moveToelementText停止了throwi一个例外。

        2
  •  4
  •   kamens    16 年前

    在实现WYSIWYG编辑器的过程中,我经历过多次调试这个IE异常的不幸经历,它总是源于访问DOM节点(如.parentnode)上的属性或将DOM节点传递给函数(如moveToelementText),而当前正在呈现的文档中没有DOM节点。

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

    真正的问题是,IE6的“无效参数”异常的这种表现通常不能被Try/Catch保护。