Я использую Apple MapKit JS для встраивания карты в веб-страницу. Мне нужно получить доступ к аннотациям маркеров в базовом HTML Shadow Dom, я хочу добавить имя класса к элементам. Используя инструменты разработчика браузера, я вижу теневой дом
Я использую следующий код для обхода теневого дома:
let annotationContainer = document.querySelector(".mk-annotation-container");
let mapAnnotations = annotationContainer.shadowRoot.querySelector(".mk-annotations");
console.log(mapAnnotations);
if (!mapAnnotations.hasChildNodes()) {
console.log("There are NO child nodes");
}
let firstAnnotation = mapAnnotations.firstElementChild;
console.log("First Child: "+firstAnnotation);
var annotationMarkers = mapAnnotations.children;
console.log(annotationMarkers)
При его запуске в журналах консоли показано, что mapAnnotations действительно имеет childElementCount, равный 2, а узлы отображаются в атрибутах childNodes и children. Однако при чтении дочерних узлов или дочерних узлов отображается, что дочерних элементов нет, и результирующая коллекция HTMLCollection в переменной annotationMarkers имеет два элемента, но имеет длину 0.
Вывод консоли, показывающий родительский узел с дочерними элементами
Вывод в консоль сообщений журнала регистрации
Я видел несколько похожих вопросов, ответ на которые, похоже, заключается в том, что модель DOM загружена не полностью, хотя при регистрации родительского узла здесь отображаются дочерние элементы.
Итак, мой вопрос состоит из двух частей: знает ли родительский элемент, что у него есть 2 дочерних элемента, но эти элементы фактически не загружены в этот момент и
во-вторых, есть ли способ выполнить аналогичный вызов функции $ (document) .ready на shadowDom? Таким образом, гарантируя, что все элементы в shadowDom (или все дочерние элементы родительского узла mapAnnotations) были загружены?
Я пробовал готовую функцию для элемента shadowRoot, и к нему был подключен eventListener, который прослушивает событие DomContentLeaded, но это вообще не срабатывает.
Обновление 30.09.2020 в 20:30
Я поместил setTimeout в JS, и теперь количество дочерних узлов отображается как 2 после истечения времени ожидания. Мне нужно найти способ дождаться завершения shadowDom и существования элементов: /
afterUpdate
. Вы должны подождать вconnectedCallback
, пока EventLoop не будет готов сsetTimeout( func , 0)
или чем-то подобным. Помните о различиях FireFox: stackoverflow.com/questions/61971919/ - person Danny '365CSI' Engelman   schedule 01.10.2020