XPath迭代异常:“尝试使用不可用或不再可用的对象”

时间:2014-12-27 04:03:02

标签: javascript exception dom xpath

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();
}

与原始代码的区别在于我改变了元素 - 而不仅仅是阅读它们。

为什么我会看到异常以及如何在迭代中更改元素?

1 个答案:

答案 0 :(得分:5)

我认为从xpath和javascript开始这是常见的问题,对于每个忙碌而且不读取整个introduction/documentation的人来说,它应该是在SO上。


headings.resultType4UNORDERED_NODE_ITERATOR_TYPE

  

当XPath表达式的结果是节点集时,这是默认的返回类型。

你必须知道它是resultType,因为:

  

XPathResult对象允许以3种不同的主要类型返回节点集:

     
      
  • 迭代
  •   
  • 快照
  •   
  • 第一节点
  •   

最重要的信息是:当节点集是*_ITERATOR_TYPE 之一时,您无法更改DOM。

  

..如果文档在迭代之间发生变异(文档树被修改),这将使迭代失效,并且XPathResult的invalidIteratorState属性设置为true,并且抛出NS_ERROR_DOM_INVALID_STATE_ERR异常。

因此,如果您想要更改某些元素,则必须专门要求其中一个快照resultType。您有两种选择:

  • UNORDERED_NODE_SNAPSHOT_TYPE
  • ORDERED_NODE_SNAPSHOT_TYPE

在你的情况下这是你想要的:

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';
}

请注意你正在改变的事情:

  

快照不随文档突变而改变,因此与迭代器不同,快照不会变为无效,但它可能与当前文档不对应,例如节点可能已被移动,它可能包含不再存在的节点,或者可以添加新节点。