我正在开展一个正在做DOM树行走的项目。为了插入一些span标签以向文档添加高光,有时需要拆分textnode:
var newTextNode = treeWalker.currentNode.splitText(charOffset);
问题是当我接下来试着打电话时:
if (newTextNode.nodeValue == "")
{
//...
}
此.nodeValue
调用在IE9中产生JavaScript错误,简单地说,Incorrect function.
至少可以说是无用的。想到可能有些奇怪的事情,我打开了调试器并执行:typeof newTextNode.nodeValue
,返回"unknown"
。
有人能够解释这种行为吗?我想也许这个函数根本不适用于文本节点,但它在其他场景中运行得很好。只有在致电splitText
之后,它似乎才会呕吐。
我感谢大家的帮助!我的谷歌到目前为止还不够。
此外:
在查看newTextNode对象之后,还有更多属性评估为“不正确的函数”
答案 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返回一个空字符串。