【问题标题】:XPath iteration Exception: "An attempt was made to use an object that is not, or is no longer, usable"XPath 迭代异常:“尝试使用不可用或不再可用的对象”
【发布时间】:2015-02-24 04:25:25
【问题描述】:

从 Mozilla 的 Introduction to using XPath in JavaScript 略微更改的 sn-p 正在引发异常。

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

与原始代码的不同之处在于我正在更改元素 - 而不仅仅是阅读它们。

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

【问题讨论】:

    标签: javascript exception dom xpath


    【解决方案1】:

    我认为这是从 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';
    }
    

    并注意您正在更改的内容:

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

    【讨论】:

      猜你喜欢
      • 2016-04-30
      • 2019-03-05
      • 1970-01-01
      • 2014-05-21
      • 2013-09-24
      • 2014-05-19
      • 1970-01-01
      • 2013-10-08
      • 2022-08-18
      相关资源
      最近更新 更多