Mozilla Introduction to using XPath in JavaScript略有变化的片段引发异常。
[Exception... "An attempt was made to use an object that is not, or is no longer, usable" code: "11" nsresult: "0x8053000b (InvalidStateError)" location: "debugger eval code Line: 6"]
代码:
var headings = document.evaluate('//h2', document, null, XPathResult.ANY_TYPE, null );
var thisHeading = headings.iterateNext();
while (thisHeading) {
thisHeading.textContent = '\n';
thisHeading = headings.iterateNext();
}
与原始代码的区别在于我改变了元素 - 而不仅仅是阅读它们。
为什么我会看到异常以及如何在迭代中更改元素?
答案 0 :(得分:5)
我认为从xpath和javascript开始这是常见的问题,对于每个忙碌而且不读取整个introduction/documentation的人来说,它应该是在SO上。
headings.resultType
是4
和UNORDERED_NODE_ITERATOR_TYPE
当XPath表达式的结果是节点集时,这是默认的返回类型。
你必须知道它是resultType
,因为:
XPathResult对象允许以3种不同的主要类型返回节点集:
- 迭代
- 快照
- 第一节点
最重要的信息是:当节点集是*_ITERATOR_TYPE
之一时,您无法更改DOM。
..如果文档在迭代之间发生变异(文档树被修改),这将使迭代失效,并且XPathResult的invalidIteratorState属性设置为true,并且抛出NS_ERROR_DOM_INVALID_STATE_ERR异常。
因此,如果您想要更改某些元素,则必须专门要求其中一个快照resultType
。您有两种选择:
在你的情况下这是你想要的:
var headings = document.evaluate('//h2', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
for ( var i=0 ; i < headings.snapshotLength; i++ ) {
headings.snapshotItem(i).textContent = '\n';
}
请注意你正在改变的事情:
快照不随文档突变而改变,因此与迭代器不同,快照不会变为无效,但它可能与当前文档不对应,例如节点可能已被移动,它可能包含不再存在的节点,或者可以添加新节点。