Я новичок в Javascript.
Я открываю веб-страницу через window.onload
, мне нужно найти группу элементов по имени их класса ( slide
) и перераспределить их в разные узлы на основе некоторой логики. У меня есть функция, Distribute(element)
которая принимает элемент в качестве входных данных и выполняет распределение. Я хочу сделать что-то вроде этого (как указано, например, здесь или здесь ):
var slides = getElementsByClassName("slide");
for(var i = 0; i < slides.length; i++)
{
Distribute(slides[i]);
}
однако это не делает для меня волшебства, потому getElementsByClassName
что на самом деле возвращает не массив, а a NodeList
, который ...
... это мои предположения ...
... изменяется внутри функции Distribute
(дерево DOM изменяется внутри этой функции, и происходит клонирование определенных узлов). For-each
структура петли тоже не помогает.
Переменные слайды действуют действительно недетерминированно, на каждой итерации они дико меняют длину и порядок элементов.
Как правильно перебирать NodeList в моем случае? Я думал о заполнении временного массива, но не знаю, как это сделать ...
РЕДАКТИРОВАТЬ:
Важный факт, который я забыл упомянуть, - это то, что один слайд может быть внутри другого, это на самом деле то, что меняет slides
переменную, как я только что узнал благодаря пользователю Alohci .
Решение для меня заключалось в том, чтобы сначала клонировать каждый элемент в массив, а затем передавать массив по очереди Distribute()
.
источник
Distribute()
функция является длительным и сложным , чтобы скопировать здесь, но я уверен , что я изменяю структуру DOM внутри, я также тиражирование (клонирование) элементы там. Когда я отлаживаю его, я вижу, что переменнаяslides
меняется каждый раз, когда она передается внутрь.getElementsByClassName()
возвращает livenodeList
, так как элементы с этим классом добавляют длину,nodeList
по которой вы повторяете изменения.Ответы:
Согласно MDN, способ получить элемент из a
NodeList
:Таким образом:
Я сам не пробовал (обычный
for
цикл у меня всегда работал), но попробую.источник
for(var el in document.getElementsByClassName("foo")){}
?for ... of
позволяет вам перебирать NodeList сейчас, как вfor (slide of slides) Distribute(slide)
. Поддержка браузером неоднородна, но если вы транспилируете, онаfor ... of
будет преобразована, ноNodeList.forEach
не будет.Если вы используете новый querySelectorAll, вы можете вызвать forEach напрямую.
В комментарии ниже. В списках узлов нет функции forEach.
Если вы используете это с babel, вы можете добавить,
Array.from
и он преобразует списки без узлов в массив forEach.Array.from
не работает изначально в браузерах ниже, включая IE 11.На нашей встрече вчера вечером я обнаружил еще один способ обработки списков узлов, не имеющих forEach
Браузерная поддержка [...]
Отображение в виде списка узлов
Отображается как массив
источник
if ( !NodeList.prototype.forEach ) {NodeList.prototype.forEach = Array.prototype.forEach;}
[...document.getElementsByClassName('.edit')].forEach(function(button) {
[...document.getElementsByClassName('edit')].forEach(function(button) {
Вы всегда можете использовать методы массива:
источник
Я последовал рекомендациям Алохси о лупе в обратном направлении, потому что это концерт
nodeList
. Вот что я сделал для любопытных ...источник
источник
У меня была аналогичная проблема с итерацией, и я приземлился здесь. Возможно, кто-то другой совершает ту же ошибку, что и я.
В моем случае проблема вовсе не в селекторе. Проблема заключалась в том, что я испортил код javascript: у меня был цикл и подцикл. Подцикл также использовался
i
как счетчик, а неj
, поэтому, поскольку подцикл переопределял значениеi
основного цикла, этот так и не попал на вторую итерацию.источник