我花了一些时间搜索,但只看到太多常规的“walk the DOM”博客或答案,它们只升级了一级getRootnode()
伪代码:
HTML
<element-x>
//# shadow-root
<element-y>
<element-z>
//# shadow-root
let container = this.closest('element-x');
</element-z>
</element-y>
</element-x>
标准element.closest()
功能不会穿透阴影边界;
所以this.closest('element-x')
返回null
是因为shadowDom中没有 <element-x>
<element-z>
目标:
<element-x>
从后代内部查找<element z>
(任何嵌套级别)
必需的:
一个(递归).closest()
函数,它沿着(影子)DOM 走并找到<element-x>
注意:元素可能有也可能没有 ShadowDOM(参见<element y>
:只有 lightDOM)
明天我可以而且会自己做;只是想知道是否一些聪明的头脑已经做到了。
资源:
- https://developer.mozilla.org/en-US/docs/Web/API/Node/getRootNode
- https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot/host
更新
这是来自以下答案的 UNminified 代码:
closestElement(selector, base = this) {
function __closestFrom(el) {
if (!el || el === document || el === window) return null;
let found = el.closest(selector);
if (found)
return found;
else
__closestFrom(el.getRootNode().host);
}
return __closestFrom(base);
}
更新#2
我将其更改为 BaseElement 上的方法:
closestElement(selector, el = this) {
return (
(el && el != document && el != window && el.closest(selector)) ||
this.closestElement(selector, el.getRootNode().host)
);
}