const querytStr = createQueryStringForElement(myElement); // return string or undefined
if (querytStr) {
const element = document.querySelector(queryStr);
console.log(element === myElement); // expected result true
}
如果函数无法创建唯一定位元素的查询,则返回undefined。否则返回查询字符串。
示例结果
"#editor > div.ace_scroller > div.ace_content > div.ace_layer.ace_text-layer > div.ace_line:nth-child(45) > span.ace_punctuation.ace_operator"
"#buttons" // A UI container
"#buttons > div.buttons" // A sub UI container
"#buttons > div.buttons:nth-child(2)" // A button element by position
"#buttons > div.buttons:nth-child(3)" // A button element by position
2条答案
按热度按时间6yt4nkrj1#
在构建Chrome扩展时,我发现在返回页面时需要唯一地定位元素。要做到这一点,我需要创建一个查询字符串为选定的元素(自定义上下文菜单点击)
在寻找答案的过程中,我发现了一个没有答案的问题。
由于我找不到现成的解决方案或API来完成任务,我编写了以下函数。它未经测试,非常粗糙和现成(使用可怜的节点遍历技术)。我把它贴在这个州,以免我忘记,这个问题仍然没有答案。
创建元素查询字符串
用于构建查询字符串的函数,该查询字符串将从元素的引用中唯一定位元素。
如果函数无法创建唯一定位元素的查询,则返回
undefined
。否则返回查询字符串。示例结果
工作原理
id
(例如"#elementId"
)开头,但如果元素没有id,则查询将使用标签和类名。例如"div.my-class"
。标记和类名不能唯一标识元素。要检查查询是否唯一,可以使用查询字符串从元素父级查询DOM。
如果需要,查询字符串将使用元素位置来细化查询
"div.my-class:nth-child(2)"
。不幸的是,这使得结果查询字符串对元素顺序的更改不敏感。id
的元素,或者没有更多的父元素。代码
pn9klfpd2#
我遇到了同样的问题,最后编写了一个简单的递归解决方案。如果布局是动态的或层次结构发生了变化,这将不起作用,但对于大多数静态站点,这很有效
您可以通过以下方式进行测试: