Я потратил некоторое время на поиск, но видел только слишком много обычных блогов или ответов "ходи по 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
, поскольку в <element-z>
<element-x>
*1023* *1022*
1026 * Цель:
Найти <element-x>
изнутри потомка <element z>
(любой вложенный уровень)
Требуется:
A (рекурсивная) .closest()
функция, которая поднимается вверх по (shadow) DOM s и находит <element-x>
Примечание: элементы могут иметь или не иметь ShadowDOM (см. <element y>
: только lightDOM)
Я могу и буду делатьэто сам завтра;Я просто подумал, что какой-то яркий ум уже сделал это.
Ресурсы:
Обновление
Это Унифицированный код из ответа ниже:
closestElement(selector, base = this) {
function __closestFrom(el) {
if (!el || el === document || el === window) return null;
let found = el.closest(selector);
return found ? found : __closestFrom(el.getRootNode().host);
}
return __closestFrom(base);
}