我正在编写一个 GreaseMonkey 脚本,我在其中迭代了一堆元素。对于每个元素,我都需要一个字符串 ID,以后可以使用它来引用该元素。该元素本身没有 id
属性,我无法修改原始文档来为它提供一个属性(尽管我可以在我的脚本中更改 DOM)。我无法将引用存储在我的脚本中,因为当我需要它们时,GreaseMonkey 脚本本身将超出范围。例如,是否有某种方法可以获取浏览器使用的“内部”ID?仅适用于 Firefox 的解决方案很好;一个可以应用于其他场景的跨浏览器解决方案会很棒。
编辑:
如果 GreaseMonkey 脚本超出范围,您稍后如何引用元素? GreaseMonkey 脚本正在向 DOM 对象添加事件。我无法将引用存储在数组或其他类似机制中,因为当事件触发时,数组将消失,因为 GreaseMonkey 脚本将超出范围。因此,事件需要某种方式来了解附加事件时脚本所具有的元素引用。并且所讨论的元素不是它所附加的元素。
不能只在元素上使用自定义属性吗? 是的,但问题出在查找上。我不得不求助于遍历所有元素,寻找将自定义属性设置为所需 ID 的元素。这当然可行,但在大型文档中,这可能非常耗时。我正在寻找浏览器可以执行查找繁琐工作的东西。
等等,你能不能修改文档?我不能修改源文档,但我可以在脚本中更改 DOM。我会在问题中澄清。
你能不使用闭包吗? 闭包确实有效,尽管我最初认为它们不会。看我后面的帖子。
这听起来像是对这个问题的回答:“是否有一些我可以使用的内部浏览器 ID?”是“否”。
最佳答案
答案是否定的,没有您可以访问的内部 ID。 Opera 和 IE(也许是 Safari?)支持 .sourceIndex
(如果 DOM 改变了)但是 Firefox 没有这种东西。
您可以通过生成给定节点的 Xpath 或从 document.getElementsByTagName('*')
中查找节点的索引来模拟源索引。这将始终按源顺序返回元素。
当然,所有这些都需要一个完全静态的文件。对 DOM 的更改将破坏查找。
我不明白的是您如何可以松散对节点的引用而不是对(理论上的)内部 ID 的引用?关闭和分配要么有效,要么无效。还是我遗漏了什么?
关于javascript - 唯一的元素 ID,即使元素没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/226689/