IE9中文本节点上的“nodeValue”属性类型==“unknown”

时间:2011-05-10 13:09:28

标签: javascript internet-explorer-9

我正在开展一个正在做DOM树行走的项目。为了插入一些span标签以向文档添加高光,有时需要拆分textnode:

var newTextNode = treeWalker.currentNode.splitText(charOffset);

问题是当我接下来试着打电话时:

if (newTextNode.nodeValue == "")
{
    //...
}

.nodeValue调用在IE9中产生JavaScript错误,简单地说,Incorrect function.至少可以说是无用的。想到可能有些奇怪的事情,我打开了调试器并执行:typeof newTextNode.nodeValue,返回"unknown"

有人能够解释这种行为吗?我想也许这个函数根本不适用于文本节点,但它在其他场景中运行得很好。只有在致电splitText之后,它似乎才会呕吐。

我感谢大家的帮助!我的谷歌到目前为止还不够。

此外:

在查看newTextNode对象之后,还有更多属性评估为“不正确的函数”

  • 数据
  • 长度
  • 的nodeValue
  • 的textContent
  • wholeText

2 个答案:

答案 0 :(得分:6)

这是IE 9中的一个错误。

IE 9返回的内容显然不是文本节点。这是什么我还不太确定。当您调用textNode.splitText(n) n等于文本节点中文本的长度时,就会发生这种情况。这不会发生在IE 7(现在无法测试8)和所有其他主要浏览器中,并且与DOM 2 spec相反,{{3}}表示splitText()

  

将此节点分解为指定偏移量的两个节点,将两者保存在树中作为兄弟节点。拆分后,此节点将包含直到偏移点的所有内容。返回相同类型的新节点,其包含偏移点处和之后的所有内容。如果原始节点具有父节点,则插入新节点作为原始节点的下一个兄弟节点。当偏移量等于此节点的长度时,新节点没有数据。

最简单的解决方案是为这种情况添加一个检查:

if (n < textNode.length) {
    newTextNode = textNode.splitText(n);
}

答案 1 :(得分:0)

IE8正常工作,如果您以其值的长度拆分文本节点,则返回空节点。 IE9正常工作,直到您尝试拆分数据长度。

我希望IE9(或IE10)能够正确使用它,但是IE6也有同样的问题 - 只要它的长度,它就无法在索引上拆分文本节点。

如果您传递索引更大,那么其他浏览器也会失败,因此您可以在拆分之前检查节点的data.length。

如果长度小于或等于您要拆分的索引,请不要管它并在其旁边添加一个新的空节点。

IE9(和其他人)为使用空字符串创建的textnode的数据或nodeValue返回一个空字符串。