当前位置: 首页 > 知识库问答 >
问题:

javascript - 查询#shadow-root内部的元素由于元素选择域不同查询的结果不同?

小牛23064
2024-05-17

查询#shadow-root内部的元素是发生了奇怪的问题

document.querySelector("#marketplace > div.css-6t2hm5 > div > div > div.css-p8gz4h > div.css-wr75lm > div > div.css-9vd5ud > div > div.css-1yhwvbb > div:nth-child(3)")

document.querySelector("#app > div.r6s-marketplace.undefined > div > div > ubisoft-connect")

分别是#shadow-root内外的两个元素通过F12在元素页面右键复制JS路径获得,当我在元素页面点击#shadow-root外部的元素代码时,可以查询#shadow-root外的元素,查询内部元素为null,当我在元素页面点击#shadow-root内部的元素代码时,可以查询#shadow-root内的元素,查询外部元素为null,默认是只能查询#shadow-root外的元素,请问下怎样在不打开F12在元素页面点击#shadow-root内部的元素代码却能够查询#shadow-root内的元素


使用间接的获取到挂载的 shadowRoot 之后再去查询内部的元素我也试过,但是shadowRoot获取能打印出来,里面的iframe和style都能打印,但一旦使用这个元素进行查询却都为null

共有2个答案

长孙作人
2024-05-17

改一下查询的方式,如果要查询 shadowRoot 内部的元素,把 document.querySelector 改动一下,使用 Element.shadowRoot 获取到挂载的 shadowRoot 之后再去查询内部的元素,比如说:

let shadowRoot = document.querySelector("ubisoft-connect").shadowRoot;let element = shadowRoot.querySelector(对应的选择器);
郁吉星
2024-05-17

在 Web Components 的 Shadow DOM 中,元素的查询确实与常规的 DOM 查询有所不同。Shadow DOM 提供了一种封装内部 DOM 结构的方式,使得从外部无法直接通过常规的选择器访问 Shadow DOM 内部的元素。这是为了提供组件化开发的封装性和独立性。

对于你提出的问题,要在不打开开发者工具(F12)的情况下,从外部查询 Shadow DOM 内部的元素,你通常需要通过组件提供的公共接口或者方法来实现。Shadow DOM 的设计初衷就是阻止外部直接访问其内部元素,因此,没有直接的方法可以通过选择器从外部穿透 Shadow DOM 边界。

不过,有几种可能的方法可以尝试:

  1. 使用组件提供的 API:如果组件开发者提供了访问 Shadow DOM 内部元素的 API 或方法,你可以通过这些 API 或方法获取到内部元素。这通常是在组件设计时就已经考虑到的,是最佳实践。
  2. 遍历 Shadow Root:如果你有对 Shadow Host 的引用,并且想要访问其 Shadow DOM,你可以通过 shadowRoot 属性来访问它,然后在里面使用查询方法。例如:

    const shadowHost = document.querySelector('#shadow-host-element');if (shadowHost.shadowRoot) {    const elementInsideShadow = shadowHost.shadowRoot.querySelector('你的选择器');    // 现在你可以操作 elementInsideShadow 了}
  3. 使用全局事件监听:如果你只是想在 Shadow DOM 内部元素上监听事件,你可以从外部添加事件监听器,并在 Shadow DOM 内部触发自定义事件。这样,即使你不能直接访问内部元素,也可以通过事件交互。
  4. 修改组件:如果你有能力并且需要修改组件的源代码,你可以考虑修改组件以暴露更多功能或接口,但这通常不是推荐的做法,因为它违反了组件封装的原则。

总之,由于 Shadow DOM 的设计特性,从外部直接查询其内部元素通常是不被允许的。最佳的做法是通过组件提供的接口和方法来与 Shadow DOM 内部的元素进行交互。如果你没有这些接口和方法的访问权限,那么你可能需要重新考虑你的设计或者与组件的开发者进行沟通。

 类似资料:
  • 我正在尝试解析下面的xml以根据某些条件获取ScId元素值。此条件在xpath字符串中提及,然后在xpath Next字符串中选择ScId值。 我使用VTD xml解析器使用嵌套的xpath查询来获取ScId值,该值以RC开头,类型=Daycare。 下面是代码 解析逻辑是 这是我的回报 解析值为SC101-91-new 虽然我期待它是 解析值为RC101-92-新

  • 问题内容: 我正在尝试测试PostgreSQL 9.3中的类型。 我在名为的表中有一个列。JSON看起来像这样: 我想查询表中所有与“对象”数组中“ src”值匹配的报告。例如,是否可以在数据库中查询所有匹配的报告?我成功地写了一个查询,可以匹配: 但是由于具有一组值,所以我似乎无法编写出有效的东西。是否可以在数据库中查询所有匹配的报告?我已经查看了这些来源,但仍然无法了解: http://www

  • 我试图测试PostgreSQL 9.3中的类型。 我在一个名为的表中有一个名为的列。JSON如下所示: 我想查询表中与'objects'数组中的'src'值匹配的所有报告。例如,是否可以查询数据库中匹配的所有报告?我成功地编写了一个可以匹配的查询: null 我不是SQL专家,所以我不知道我做错了什么。

  • 本文向大家介绍用MongoDB子元素查询?,包括了用MongoDB子元素查询?的使用技巧和注意事项,需要的朋友参考一下 您可以为此使用位置运算符$。首先让我们创建一个包含文档的集合- 以下是在方法的帮助下显示集合中所有文档的查询- 这将产生以下输出- 这是在MongoDB中查询子元素的方法- 这将产生以下输出-

  • 假设我有一个Postgres数据库(9.3),有一个名为Resources的表。在参考资料表中,我有字段id,它是int,数据是JSON类型。 假设我在上述表格中有以下记录。 1,{firstname':'Dave',lastname':'Gallant} 我想做的是编写一个查询,返回所有记录,其中数据列有一个姓氏等于“Doe”的json元素 我试着这样写: 然而,Py魅力给了我一个关于“-”的编

  • 我有一个如下所示的数据库表: 我想使用PostgreSQL的JSON查询功能来选择JSON\u数组中的某些子字典,例如字典中的a:1。 输出应为 以下查询适用于每个数组中的第一个元素,但我想检查所有元素: