Задать вопрос
GailWynand
@GailWynand
Интересуюсь ИТ, биржевой торговлей, стартапами

Где ошибка в счетчике?

Получаю коллекцию параграфов. Хочу, чтобы по клику по любому, число внутри увеличивалось на один.

Когда прописываю номер параграфа вручную (фрагмент в комментарии) - все работатает. При попытке написать цикл, чтобы число увеличивалось именно в параграфе, по которому кликнул, не работает.

Скорее всего ошибка детская, но глаз замылен и не вижу. Буду благодарен за помощь.

var byTag =  document.getElementsByTagName('p');

	for (var c = 0; c<byTag.length; c++) {
		byTag[c].onclick = function func () {
			 byTag[c].innerHTML = ++counter;
		}
	}
	// byTag[0].onclick = function func () {
	// 	 byTag[0].innerHTML = ++counter;
	// }
  • Вопрос задан
  • 240 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
madmaker
@madmaker
Full stack программист
for (var c = 0; c<byTag.length; c++) {
    byTag[c].onclick = function func () {
       byTag[c].innerHTML = ++counter;
    }
  }


Внутри func() переменная "c" судя по всему undefined;

Проверьте.
Перед byTag[c].innerHTML = ++counter;
напишите console.log(c);
И гляньте в консоль - что выводит.
Ответ написан
tsarevfs
@tsarevfs
C++ developer
Посмотрите конец статьи.
var byTag =  document.getElementsByTagName('p');
var counter = 0

for (var c = 0; c < byTag.length; c++) {
   byTag[c].onclick = (function (num) {
      return function() {
         byTag[num].innerHTML = ++counter;
      }
   })(c)


Суть в том, что переменная "c" глобальная и захватывается как ссылка. То есть когда вызывается onclic ее значение == byTag.length а не то, какое было в момент добавления колбека.
Ответ написан
keslo
@keslo
Просто повесьте обработчик на все. Либо вешайте обработчик на body и ловите "делегирование событий". В нем просто проверяете, например, на e.target.className и уже изменяете его содержимое через e.target.innerHTML.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы