关于DOM元素的哪些信息允许JavaScript(某种程度上)唯一地标识它?(例如,当它没有“id”时)

关于DOM元素的哪些信息允许JavaScript(某种程度上)唯一地标识它?(例如,当它没有“id”时),javascript,dom,Javascript,Dom,我想做的是:我有一个bookmarklet,它在当前页面(可以是任何站点)中查找元素,并在匹配的页面上发送一个click事件。我让那部分工作 但在某些情况下,没有自动匹配的内容,我希望能够显示(通过将其悬停)应该激活的元素,然后在localStorage中保存有关该元素的一些信息。下次在该页面上使用bookmarklet时,我希望检索该信息以标识DOM中的元素,然后发送一个click事件 问题是:我应该保存哪些信息才能识别它?(在大多数情况下,因为总是可以创建一个不起作用的案例) 在最好的情况下

我想做的是:我有一个bookmarklet,它在当前页面(可以是任何站点)中查找元素,并在匹配的页面上发送一个click事件。我让那部分工作

但在某些情况下,没有自动匹配的内容,我希望能够显示(通过将其悬停)应该激活的元素,然后在
localStorage
中保存有关该元素的一些信息。下次在该页面上使用bookmarklet时,我希望检索该信息以标识DOM中的元素,然后发送一个click事件

问题是:我应该保存哪些信息才能识别它?(在大多数情况下,因为总是可以创建一个不起作用的案例)

在最好的情况下,所述元素将有一个
id
值,我可以开始了。在其他一些情况下,它不会,我想看看你的建议,我应该使用什么样的信息和方法来取回它

到目前为止,我的想法是保存元素的一些属性,并遍历DOM以找到与所有内容匹配的元素。并非所有属性都能工作(例如,
clientWidth
将取决于浏览器的大小),并且并非所有类型的元素都具有所有属性(例如,
div
节点不会有
src
值),这意味着一方面我不能盲目保存所有属性,但另一方面,我需要选择适用于任何类型元素的有限属性列表(冒着丢失一些有用信息的风险),或者为不同的元素选择不同的案例(听起来不太好)

我认为我可以使用的东西:

  • id
    当然可以
  • 类名
    标记名
    会有所帮助,尽管在某些情况下,
    类名
    可能不是一个明确的匹配项
  • innerHTML
    如果内容是文本,则在很多情况下都可以使用
  • 如果内容是图像,则在大多数情况下,
    src
    应该可以工作
  • 祖先的等级制度(但这可能会变得混乱)
所以,我的问题是“你会怎么做?”,不一定是代码。
谢谢

如何查找所有没有ID的元素并为它们分配唯一的ID。然后您可以始终使用ID。

一种方法是使用名称、标记名和类名组合。innerHTML可能太大了

另一种方法是查找choosen元素中具有id的子元素


检查id=>检查id为=>的儿童检查名称、标记名和类名组合(如果=>告诉用户选择不同的项目:-)

您可以按照@brendan所说的做。您还可以为DOM中的每个元素创建一个jQuery样式选择器字符串,方法是根据元素在其父元素的子节点列表中的位置计算出元素的“索引”,然后通过向上遍历DOM到body标记来构建该索引

你最终得到的是一种

body > :nth-child(3) > :nth-child(0) > :nth-child(4)

当然,如果DOM发生了变化,这将不会很好地工作。您可以添加类名等,但正如您自己所说的,如果您没有一个好的“id”来开始,那么像这样的事情本质上是脆弱的,这个id是在页面创建时放在那里的,无论什么逻辑都知道页面中应该是什么。

在DOM中使用元素的索引(整数)怎么样?您可以循环页面加载中的每个元素,并为索引设置一个自定义属性

var els = document.getElementsByTagName("*");
for(var i = 0, l = els.length; i < l; i++) {
  els[i].customIndex = i;
}
var els=document.getElementsByTagName(“*”);
对于(变量i=0,l=els.length;i
但如何确保重新加载页面后生成的
id
相同?你会以什么为基础的
id
s:基于其他信息的某种散列?如果是这样的话,那就回到我的问题,关于使用什么信息。和孩子们一起去的有趣想法(如果有的话)。默认情况下,我会先和祖先一起去(主要是因为祖先比孩子更可能有祖先),但如果我能找到一个具有
id
的后代,那么祖先
n
级别应该是我想要的。如果我与拥有
id
的祖先同行,可能会更容易产生混淆。我会把你关于“故障转移”的想法挖掘到一些不太确定的方法,从
id
,到
className