首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问阴影根目录中的元素

如何访问阴影根目录中的元素
EN

Stack Overflow用户
提问于 2020-10-23 15:09:30
回答 2查看 1.3K关注 0票数 1

如何访问深埋在阴影根目录中的元素?

代码语言:javascript
复制
<vaadin-combo-box>
        #shadow-root
            <vaadin-text-field id="input">
                <vaadin-combo-box-dropdown-wrapper id="overlay">
                    #shadow-root(open)
                        <vaadin-combo-box-dropdown id="dropdown">
                            #shadow-root(open)
                                <vaadin-combo-box-overlay id="overlay">
                                    #shadow-root(open)
                                     <div part="overlay" id="overlay">
                                        <div part="content" id="conent">
                                            #shadow-root(open)
                                                <div id="scroller">
                                                    <iron-list id="selector">
                                                        #shadow-root(open)
                                                            <vaadin-combo-box-item>
                                                                ......

我想设置vaadin-combo-box-item元素的样式,但我不知道如何访问这个元素。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-23 15:24:04

这不是一个简单的答案,因为您必须访问一个非常深的DOM元素。

为了减轻一些痛苦,您必须创建一个函数,该函数提供了这样一个元素的阴影:

代码语言:javascript
复制
const getShadowRoot = (elem, selector) => elem.shadowRoot.querySelector(selector);

const vaadinComboBox = getShadowRoot(document, 'vaadin-combo-box');
const vaadinTextField = getShadowRoot(vaadinComboBox, '#input');
const vaadinComboBoxWrapper = getShadowRoot(vaadinTextField, '#overlay');
const vaadinComboBoxDropdown = getShadowRoot(vaadinComboBoxWrapper, '#dropdown');
const vaadinComboBoxOverlay = getShadowRoot(vaadinComboBoxDropdown, '#overlay');
const vaadinComboBoxContent = getShadowRoot(vaadinComboBoxOverlay, '#conent');
const vaadinComboBoxSelector = getShadowRoot(vaadinComboBoxContent, '#selector');
const vaadinComboBoxItem = getShadowRoot(vaadinComboBoxContent, 'vaadin-combo-box-item');

然而,这么多的shadowDom元素看起来像是一个架构错误。

票数 1
EN

Stack Overflow用户

发布于 2022-11-21 09:26:03

我无法在任意深度找到一个元素的答案。这就是我想出的;您可以使用这个类型的函数递归地下降到阴影DOM中,以获取父元素或元素本身:

代码语言:javascript
复制
function* descend(el, sel, parent) {
        if (el.matches(sel)) {
            yield parent ? el.parentElement : el;
        }
        if (el.shadowRoot) {
            for (const child of el.shadowRoot.children) {
                yield* descend(child, sel, parent);
            }
        }
        for (const child of el.children) {
            yield* descend(child, sel, parent);
        }
    };

示例使用:

代码语言:javascript
复制
const vid = [...descend(window.parent.document.querySelector("body"), "video", false)][0]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64502642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档