HTMLCollection показывает длину 0, когда элементы существуют в родительском элементе

Я использую Apple MapKit JS для встраивания карты в веб-страницу. Мне нужно получить доступ к аннотациям маркеров в базовом HTML Shadow Dom, я хочу добавить имя класса к элементам. Используя инструменты разработчика браузера, я вижу теневой дом

Shadow Dom Structure

Я использую следующий код для обхода теневого дома:

  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 и существования элементов: /


person davecymru    schedule 30.09.2020    source источник
comment
Я предлагаю вам использовать jquery, он очень удобен для пользователя. Также добавьте часть своего html-кода.   -  person ilyas Jumadurdyew    schedule 30.09.2020
comment
спасибо ilyas. Я не думал об использовании jquery, но да, было бы более дружелюбно;) Я сконвертирую его и попробую еще раз, хотя подозреваю, что проблема все еще существует. Более релевантного HTML нет, читаемый раздел DOM находится на изображении. У меня есть все вызовы .js в конце основного HTML (т.е. для jQuery и Apple Mapkit, а также у моего собственного .js, где я читаю DOM). Я попытался поместить приведенный выше код в тег скрипта на $ .ready, но без разницы. Я подозреваю, что, возможно, функция готовности не обнаруживает, что теневой DOM не завершен. : /   -  person davecymru    schedule 30.09.2020
comment
Попробуйте использовать функцию call_back, например: function some_action (call_back_function) {}   -  person ilyas Jumadurdyew    schedule 01.10.2020
comment
jQuery ничего не знает о пользовательских элементах, но вы можете добавить дополнительную загрузку 87 КБ. Поскольку Custom Element API является простым, вы должны разработать это поведение самостоятельно; где в Frameworks и Libraries есть что-то вроде afterUpdate. Вы должны подождать в connectedCallback, пока EventLoop не будет готов с setTimeout( func , 0) или чем-то подобным. Помните о различиях FireFox: stackoverflow.com/questions/61971919/   -  person Danny '365CSI' Engelman    schedule 01.10.2020


Ответы (1)


С библиотекой JQuery

var child_items = $('.your_parrent_class').find('li');

console.log(child_items.length);
person ilyas Jumadurdyew    schedule 30.09.2020
comment
попробовал, результат тот же. родительский класс .mk-annotations имеет 2 дочерних элемента DIV, но child_items.length по-прежнему показывает 0. Я могу только сказать, что речь идет о времени для элементов, фактически существующих в Shadow Dom, и когда .length называется элементами, поэтому не существует, но отображается в журнале консоли в режиме реального времени. элементы есть. - person davecymru; 30.09.2020
comment
Это какое-то невозможно, пробовал и работает. - person ilyas Jumadurdyew; 01.10.2020