Это потому, что document.getElementsByClassName()
ссылается на массив фактических элементов, соответствующих вашему классу.
Таким образом, при итерации и изменении своего класса сам элемент больше не принадлежит массиву таким образом, индекс становится index-1.
Обходной путь, если у вас нет другого пути для достижения объекта, - это полагаться на другой класс / селектор для получения списка элементов:
let visibleTags = document.getElementsByClassName('test');
console.log(visibleTags.length) // length is 2
for (let index = 0; index < visibleTags.length; index++) {
console.log(index); // 0
visibleTags[index].classList.remove('show'); // removes 'show' from element 0
}
.test {
width: 300px;
height: 300px;
border: 1px solid #ccc;
}
.show {
background-color: red;
}
<div>
<div class="show test">1</div>
<div class="show test">2</div>
</div>