【发布时间】:2010-09-18 14:35:22
【问题描述】:
我正在编写一个 GreaseMonkey 脚本,在其中迭代一堆元素。对于每个元素,我需要一个字符串 ID,以后可以使用它来引用该元素。元素本身没有id 属性,我无法修改原始文档以赋予它一个(尽管我可以在我的脚本中进行DOM 更改)。我无法将引用存储在我的脚本中,因为当我需要它们时,GreaseMonkey 脚本本身就会超出范围。例如,有什么方法可以获取浏览器使用的“内部”ID?仅 Firefox 的解决方案很好;可以应用于其他场景的跨浏览器解决方案会很棒。
编辑:
如果 GreaseMonkey 脚本超出范围,您以后如何引用这些元素? GreaseMonkey 脚本正在向 DOM 对象添加事件。我无法将引用存储在数组或其他类似机制中,因为当事件触发时,数组将消失,因为 GreaseMonkey 脚本将超出范围。因此,事件需要某种方式来了解附加事件时脚本所具有的元素引用。而且有问题的元素不是它所附加的元素。
您不能只在元素上使用自定义属性吗? 可以,但问题出在查找上。我不得不求助于遍历所有元素,以寻找将自定义属性设置为所需 id 的元素。这当然可以,但在大型文档中可能非常耗时。我正在寻找浏览器可以进行查找繁重工作的东西。
等等,你能不能修改文档?我不能修改源文档,但我可以在脚本中进行 DOM 更改。我会在问题中澄清。
你不能使用闭包吗? 闭包确实有效,尽管我最初认为它们不会。看我后面的帖子。
这听起来像是问题的答案:“我可以使用一些内部浏览器 ID 吗?”是“不”。
【问题讨论】:
-
非常有趣的问题。我实际上想知道各种浏览器如何实现这一点。也许有些浏览器为所有元素分配了一个隐藏索引,这样他们就可以在内部访问它们而无需遍历整个 DOM 树。这是有道理的。问题是我们是否可以从 JavaScript 访问索引。
-
@AsGoodAsItGets 实际上,这是相反的,因为这个问题是首先创建的。 :)
-
@AsGoodAsItGets: 耸耸肩 没有人会强迫你这样做;如果你觉得你应该这样做。
-
在数据库设计中,我们通常会创建一个唯一的 ID 字段来通过一个保证永远不会更改的数字来查找记录(行),即使我们主要通过另一个字段进行查找,为了可扩展性。 DOM 设计者不会将唯一的整数放入创建的每个节点,或者至少每个元素类型的节点中,这似乎很奇怪。另一方面,Node 对象只是散布着函数值,这些函数值可能存储在静态类或实际对象之外的其他地方。只是说。
标签: javascript firefox dom greasemonkey