Javascript XPath迭代异常:";试图使用不可用或不再可用的对象;

Javascript XPath迭代异常:";试图使用不可用或不再可用的对象;,javascript,exception,dom,xpath,Javascript,Exception,Dom,Xpath,来自Mozilla的稍有更改的代码段引发异常 [异常…”试图使用不可用或不再可用的对象“code:”11“nsresult:“0x8053000b(InvalidStateError)”位置:“调试器评估代码行:6”] 代码: 与原始代码的不同之处在于,我正在修改元素,而不仅仅是读取它们 为什么我会看到异常,以及如何在迭代中修改元素?我认为这是从xpath和javascript开始时的常见问题,对于每个急于阅读全文的人来说都是如此,所以应该如此 headers.resultType是4一种无

来自Mozilla的稍有更改的代码段引发异常

[异常…”试图使用不可用或不再可用的对象“code:”11“nsresult:“0x8053000b(InvalidStateError)”位置:“调试器评估代码行:6”]

代码:

与原始代码的不同之处在于,我正在修改元素,而不仅仅是读取它们


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

我认为这是从xpath和javascript开始时的常见问题,对于每个急于阅读全文的人来说都是如此,所以应该如此


headers.resultType
4
一种
无序节点迭代器类型

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

您必须知道它是哪个
resultType
,因为:

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

  • 迭代器
  • 快照
  • 第一节点
最重要的信息是:当节点集是
*\u迭代器类型之一时,您不能更改DOM

..如果在将使迭代无效的迭代之间对文档进行了变异(文档树被修改),并且XPathResult的invalidIteratorState属性设置为true,并引发NS_ERROR_DOM_INVALID_STATE_ERR异常

因此,如果您想要更改某些元素,您必须特别要求一个快照
resultType
。您有两个选择:

  • 无序\u节点\u快照\u类型
  • 有序\u节点\u快照\u类型
在您的情况下,这就是您想要的:

var headers=document.evaluate('//h2',document,null,XPathResult.ORDERED\u NODE\u SNAPSHOT\u TYPE,null);
对于(var i=0;i
并意识到你正在改变什么:

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

var headings = document.evaluate('//h2', document, null, XPathResult.ANY_TYPE, null );
var thisHeading = headings.iterateNext();

while (thisHeading) {
  thisHeading.textContent = '\n';
  thisHeading = headings.iterateNext();
}
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';
}