在IE9中,文本节点==“未知”上的“节点值”属性的类型

Type of "nodeValue" property on text node == "unknown" in IE9

本文关键字:节点 节点值 属性 类型 上的 IE9 未知 文本      更新时间:2023-09-26

我正在做一个项目,该项目正在做一些DOM树行走。 为了插入一些 span 标签以向文档添加突出显示,有时需要拆分文本节点:

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

问题是当我下次尝试调用时:

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

这个.nodeValue调用在IE9中产生了一个JavaScript错误,它简单地说,Incorrect function.至少可以说是完全没有帮助的。 想到也许发生了什么奇怪的事情,我打开调试器并执行:typeof newTextNode.nodeValue返回"unknown"

有人能够解释这种行为吗? 我想也许该功能根本不适用于文本节点,但它在其他场景中工作得很好。 只是在打电话给splitText之后,它似乎才呕吐。

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

加法:

查看 newTextNode 对象后,还有更多属性的计算结果为"不正确的函数"

  • 数据
  • 长度
  • 节点值
  • 文本内容
  • 全文

这是IE 9中的一个错误。

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

将此节点在

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

最简单的解决方案是为此情况添加检查:

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

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

我希望IE9(或IE10)会做对,但IE6也有同样的问题 - 它无法在索引处拆分文本节点,只要它的长度。

如果您传递的索引大于文本长度,其他浏览器同样会失败,因此您可以在拆分之前检查节点的 data.length。

如果长度小于或等于要拆分的索引,请将其保留,并在它旁边附加一个新的空节点。

IE9(和其他)返回使用空字符串创建的文本节点的数据或节点值的空字符串。