有关DOM元素的哪些信息将允许JavaScript(有些)唯一地识别它? (例如,当它没有“id”时)

时间:2010-03-02 23:41:34

标签: javascript dom

这是我正在尝试做的事情:我有一个书签,正在寻找当前页面中的元素(可以是任何网站),并在匹配的事件上发送点击事件。我有那部分工作。

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

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

在最好的情况下,所述元素将具有id值,我很高兴。在其他一些情况下,它不会,我希望看到你的建议,我应该用什么信息和方法来取回它。

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

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

  • id当然
  • classNametagName会有所帮助,但在某些情况下className可能不是明确匹配
  • 如果内容是文本,
  • innerHTML应该可以在很多情况下使用 如果内容是图片,
  • src应该适用于大多数情况
  • 祖先的层次结构(但可能会变得混乱)
  • ...?

所以,我的问题有点“你会怎么做?”,不一定是代码。 谢谢!

4 个答案:

答案 0 :(得分:2)

你可以做@brendan说的话。你也可以为DOM中的每个元素组成一个jQuery样式的选择器字符串,通过根据它在父节点的子节点列表中的位置来计算元素的“索引”,然后通过将DOM向上移动来构建它。身体标签。

你最终会看到的是

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

当然,如果DOM的变化不会那么好用。你可以添加类名等,但正如你所说的那样,如果你没有一个好的“id”开头,这样的东西本来就很脆弱,那就是在页面创建的时候通过任何逻辑知道应该是什么首先是页面。

答案 1 :(得分:1)

如何找到没有ID的所有元素并为它们分配唯一ID。然后你总是可以使用id。

答案 2 :(得分:1)

一种方法是使用name,tagName和className-combination。 innerHTML可能太大了。

另一种方法是查找具有id的选择元素的子元素。

检查id =>检查id =>的孩子检查name,tagName和className-combination(if =>告诉用户选择不同的项目: - )

答案 3 :(得分:0)

如何在DOM中使用元素的索引(整数)?您可以遍历页面加载中的每个元素并将自定义属性设置为索引...

var els = document.getElementsByTagName("*");
for(var i = 0, l = els.length; i < l; i++) {
  els[i].customIndex = i;
}