2 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
這個(gè)問題沒有簡單的答案,因?yàn)槟仨氃L問非常深的 DOM 元素。
為了讓它不那么痛苦,你必須創(chuàng)建一個(gè)函數(shù)來訪問提供元素的影子 dom,如下所示:
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 元素看起來像是架構(gòu)錯(cuò)誤

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
我找不到在任意深度獲取元素的答案。這就是我想出的;您可以使用排序函數(shù)遞歸地下降到影子 DOM,以獲取父元素或元素本身:
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);
}
};
使用示例:
const vid = [...descend(window.parent.document.querySelector("body"), "video", false)][0]
添加回答
舉報(bào)