То, что значение
i
в момент выполнения
document.getElementsByClassName("desc")[i]
будет тем же, что и в момент выполнения
acc[i].addEventListener
есть ни на чём не основанная фантазия, не соответствующая реальности.
Вот если вы объявите
i
в заголовке цикла с помощью
let
- тогда да, работать будет.
Но вообще, создавать отдельные обработчики клика для каждой кнопки и обращаться по индексу к элементам
.desc
нет необходимости. Можно от кликнутой кнопки подняться до
.tab-pane
и там переключить класс, который изменит видимость
.desc
:
.active .desc {
display: block;
}
const itemSelector = '.tab-pane';
const buttonSelector = `${itemSelector} .material_info`;
const activeClass = 'active';
// слушаем клики на кнопках
document.querySelectorAll(buttonSelector).forEach(function(n) {
n.addEventListener('click', this);
}, e => e.target.closest(itemSelector).classList.toggle(activeClass));
// или, применяем делегирование - назначаем обработчик один раз общему предку кнопок,
// внутри проверяем, где случился клик
document.addEventListener('click', ({ target: t }) => {
if (t.matches(buttonSelector)) {
t.closest(itemSelector).classList.toggle(activeClass);
}
});