【问题标题】:document.evaluate won't work from content scriptdocument.evaluate 不适用于内容脚本
【发布时间】:2011-12-01 10:27:47
【问题描述】:
var allTags = document.evaluate("//*[contains(@src,'"+imgSrc+"')]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

这是给出错误的代码,它给出:

Uncaught Error: TYPE_ERR: DOM XPath Exception 52

谁能告诉我问题出在哪里?

【问题讨论】:

  • imgSrc的值是多少?
  • 这是一条路径。出于测试目的,假设它是http://localhost/logo.png。我最终为此使用了 jQuery,但我仍然想得到一个答案,因为 jQuery 并不完全是轻量级的。

标签: javascript google-chrome xpath google-chrome-extension document.evaluate


【解决方案1】:

我没有准确的答案,但我可以猜测并给出解决方法。

首先解决方法:将UNORDERED_NODE_SNAPSHOT_TYPE 更改为不创建快照的类型(除非您需要这种方式)并返回多个节点,例如UNORDERED_NODE_ITERATOR_TYPE(或ANY_TYPE)。

我的猜测是:在阅读了spec 之后,它说这个函数'TYPE_ERR:如果结果不能转换为返回指定的类型,则引发。'。可能是它无法分配资源来创建快照或类似的东西(解决方法假设)。

编辑:

真正的问题很可能不是对document.evaluate 的调用,而是在您的代码中您执行allTags.iterateNext 并且此调用期望allTags 是*_NODE_ITERATOR_TYPE 而不是*_NODE_SNAPSHOT_TYPE,使用allTags.snapshotItem don' t 导致抛出错误。我在jsfiddle 写了一个示例,它会在 2 秒后更改边框,使用调用来评估您的问题并以正确的方式迭代元素。

【讨论】:

  • 嗯,我需要这样,因为我需要能够访问原始对象属性。
  • 您始终可以对返回的节点执行深拷贝 (developer.mozilla.org/En/DOM/Node.cloneNode) 并将副本存储在数组中。
  • 这是否允许我更改原始对象属性?
猜你喜欢
  • 2018-12-29
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多