@Kesantielu

Почему цикл for (forEach) обрабатывает элементы через один?

Столкнулся со странным поведением во время обработки массива элементов DOM в цикле — обрабатываются через один.

var a = document.getElementsByClassName('nahren');
Array.prototype.forEach.call(a, function(e) {
	e.classList.remove('nahren')
})


Пример на JSFiddle
  • Вопрос задан
  • 232 просмотра
Решения вопроса 1
@masterfreelance
программист со стажем
Потому что удаляя класс по которому вы произвели выборку элементов, тем самым вы удаляете этот элемент из массива выборки, а индекс увеличивается на единицу.
То есть:
первый вызов - индекс = 0, кол-во элементов = 10,обрабатывается 1-й элемент исходного массива;
второй вызов - индекс = 1, кол-во элементов = 9,обрабатывается 3-й элемент исходного массива;
третий вызов - индекс = 2, кол-во элементов = 8,обрабатывается 5-й элемент исходного массива;
четвертый вызов - индекс = 3, кол-во элементов = 7,обрабатывается 7-й элемент исходного массива;
пятый вызов - индекс = 4, кол-во элементов = 6,обрабатывается 9-й элемент исходного массива;

Если сделаете так:
var a = document.getElementsByClassName('hren');
Array.prototype.forEach.call(a, function(e) {
  e.classList.remove('nahren')
})

класс удалится у всех элементов массива
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Перевел html-коллекцию в обычный массив.
Пример подсмотрел решение тут
Ответ написан
Комментировать
mlnkv
@mlnkv
JavaScript Developer
var links = document.querySelectorAll('.class-name')
Array.prototype.slice.call(links).forEach(function(link) {
  link.classList.remove('class-name')
})
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы