Как перебрать объект htmlcollection?

Я просмотрел почти каждый вопрос, который здесь задавали о htmlcollection.

Итак, у меня есть div, и я извлекаю данные и создаю div внутри этого div с помощью ajax, чтобы они не были жестко закодированы.

вот как выглядит div до получения данных

    <div id = "tivvits"></div>

так выглядит div#tivvits после вызова функции show_all_tivvits(); show_all_tivvits() — это функция, в которой я создаю запрос ajax и создаю новые элементы div. например, div#tivvit-21, div#tivvit-22 и т. д.

    <div id = "tivvits">
        <div id = "tivvit-19" class = "grid-container">...</div>
        <div id = "tivvit-20" class = "grid-container">...</div>
    </div>

это часть файла js

    document.addEventListener("DOMContentLoaded", function(){
    
        show_all_tivvits();
        var t = document.getElementById('tivvits');
        const j = t.getElementsByClassName("grid-container");
        const k = Array.prototype.slice.call(j)
        console.info(k);
        for (var i = 0; i < k.length; i++) {
            console.info(k[i]);
        }

    });

то, что я хотел сделать в функции show_all_tivvits(), это то, что я хочу получить div, которые уже находятся в div#tivvits, и таким образом я не собираюсь создавать их снова, но проблема в том, что когда я использую console.info() для распечатки document.getElementById('tivvits').getElementsByClassName('grid-container') есть элементы в коллекции html, но когда я распечатываю длину, она возвращает 0.

еще одна вещь, когда я открываю inspect> source в chrome, мой index.php не имеет обновленных div # tivvits. Я пробовал почти каждый способ зациклить эту htmlколлекцию, но она не работает.

список вещей, которые я пробовал;

Array.from(links)

Array.prototype.slice.call(links)

[].forEach.call(links, function (el) {...});

HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];

HTMLCollection.prototype.forEach = Array.prototype.forEach;

почему по id, а также по классу? Это вообще не имеет смысла

Aalexander 11.12.2020 20:42

Просто используйте let links = document.querySelectorAll(".grid-container"); links.forEach(link => {console.info(link)})

ptothep 11.12.2020 20:45

@ Алекс, я думал, что раз уж они дети div#tivvits, то я так и сделал. Итак, вы предполагаете, что я могу сделать document.getElementsByClassName('grid-container') правильно?

AK-35 11.12.2020 20:46

imo вы должны создать объект tivvits, который имеет методы get, render, show, а затем сохранить значения/компонент в массиве, который вы можете проверить перед рендерингом, вы пытаетесь сделать слишком много в одной или двух функциях

Lawrence Cherone 11.12.2020 20:47

Нет, я бы сказал, используйте что-то вроде того, что ptohtep упомянул document.querySelectorAll, будет хорошо работать

Aalexander 11.12.2020 20:48

Поскольку функция show_all_tivvits выполняет запрос AJAX, код, следующий за вызовом функции, возвращает HTML до того, как можно будет добавить ответ. Это означает, что внутри вашего целевого div нет узлов. Что вам нужно сделать, так это взять код после вызова функции и поместить его в функцию, которую вы можете использовать в качестве обратного вызова для ответа AJAX. В зависимости от того, как отправляется запрос AJAX, вам необходимо определить, как определить обратный вызов (или обратный вызов успеха) для вашего ответа.

Abrar Hossain 12.12.2020 02:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
1 242
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это

Я использую оператор распространения, чтобы разрешить использование карты в HTMLCollection.

window.addEventListener("load", function() {
  const gridContainers = document.querySelectorAll("#tivvits .grid-container");
  const ids = [...gridContainers].map(div => div.id);
  console.info(ids)
});
<div id = "tivvits">
  <div id = "tivvit-19" class = "grid-container">...</div>
  <div id = "tivvit-20" class = "grid-container">...</div>
</div>

Чтобы просто отображать изменения

const ids = [...gridContainers].map(div => div.id);

к

[...gridContainers].forEach(div => console.info(div.id));

Я попробовал ваш ответ, и я жестко закодировал div # tivvit-19 и div # tivvit-20, и это сработало, но, поскольку они на самом деле не жестко закодированы, документ не может их видеть.

AK-35 11.12.2020 20:57
<div id = "tivvits"></div> изначально пуст, затем в прослушивателе событий загрузки я вызываю функцию show_all_tivvits(), которая делает запрос ajax, и я создаю div#tivvit-19, div#tivvit-20 и т. д. внутри div#tivvits.
AK-35 11.12.2020 21:01

Пожалуйста, обновите свой вопрос тем, что вы ДЕЙСТВИТЕЛЬНО хотите сделать, так как я думаю, что вы слишком усложняете себе задачу.

mplungjan 11.12.2020 21:03

но это на самом деле то, что я хочу сделать, хотя

AK-35 11.12.2020 21:06
Ответ принят как подходящий

Не совсем понятно, но вы ищете что-то подобное?

targets = document.querySelectorAll('#tivvits > .grid-container')
for (let target of targets)
  {console.info(target.id)}

Это должно выбрать все узлы <div>, которые являются прямыми дочерними элементами узла <div id = "tivvits"> и имеют атрибут class со значением "grid-container", и извлечь из них значение атрибута id.

Другие вопросы по теме