@alekamisleforma

Как к каждому элементу массива прикрепить функцию?

Здравствуйте! Есть массив какой-то длины. Нужно к каждому элементу массива прикрепить по функции. Если делать так
var btn = document.querySelectorAll('.circle');
for(i=0; i<btn.length; i++){
		btn[i].onclick = function(){elem.style.marginLeft = i * (-100) + '%';}
	}


то получаем такой результат:
btn[2].onclick = function(){elem.style.marginLeft = 2 * (-100) + '%';}


И мне понятно почему. Но непонятно как получить следующее:
btn[0].onclick = function(){elem.style.marginLeft = 0 * (-100) + '%';}
btn[1].onclick = function(){elem.style.marginLeft = 1 * (-100) + '%';}
btn[2].onclick = function(){elem.style.marginLeft = 2 * (-100) + '%';}

??
  • Вопрос задан
  • 95 просмотров
Решения вопроса 2
potapchino
@potapchino
так происходит из-за того, что все ваши обработчики смотрят на одну и ту же i, т.к. она находится в их общйе области видимсти. когда цикл отработает она будет для всех обработчиков равна 2. чтобы исправить это, нужно замкнуть каждый обработчик на своей i.
сделать это можно несколькими способами:
1. инициализируйете счетчик через let:
for(let i = 0; i < btn.length; i++) {...}

2. вешайте обработчик внутри iife:
for(var i = 0; i < btn.length; i++){
  (function(i) {
    btn[i].onclick = function(e){e.target.style.marginLeft = i * (10) + 'px';}
  })(i)
}


3. forEach()
btn.forEach((el, i) => {
  el.onclick = function(e){e.target.style.marginLeft = i * (-100) + '%';}
})
Ответ написан
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Смотрите первый комментарий к вашему вопросу.
Это будет работать потому что у вас i действует в области видимости вне тела цикла. А если ее объявить как let, то она будет доступна только в области видимости в которой объявленна (то есть в теле цикла) и каждую итерацию цикла будет создаваться новая i, значение которой сохраниться в добавляемой функции как замыкание.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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