Как узнать номер элемента, по которому щёлкнули?

Пытаюсь на все подходящие элементы повесить event listener и в зависимости от порядкового номера элемента делать то или иное действие (в примере просто выводить через alert свой номер, позже просто писать в текстовое поле формы свой номер, свой innerHTML или что-то подобное).
Пример (не рабочий, все элементы выводят номер последнего):
jsfiddle.net/ynhwzo54
<ul>
  <li name="test">My element 1</li>
  <li name="test">My element 2</li>
  <li name="test">My element 3</li>
</ul>
<script type='text/javascript'>//<![CDATA[
	var mylist = document.getElementsByName('test');
	for (var i = 0; i < mylist.length; i++) {
	  mylist[i].addEventListener('click', function() {
	    alert(i);
	  });
	}
//]]> 
</script>

Я полагаю, что в listener попадает ссылка на переменную i, а не её текущее значение и не знаю способа это исправить или сделать более цивилизованно другим способом.
  • Вопрос задан
  • 234 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Самый быстрый и простой способ - заменить var i на let i.

Но есть и другие варианты.

Можно перебирать элементы через forEach вместо обычного цикла, индекс будет всегда правильный:

document.querySelectorAll('li').forEach((n, i) => {
  n.addEventListener('click', e => {
    console.log(i);
  });
});

Или, прицепить индексы к элементам в качестве data-атрибутов:

const onClick = e => console.log(e.target.dataset.index);
const li = document.getElementsByTagName('li');

for (let i = 0; i < li.length; i++) {
  li[i].dataset.index = i;
  li[i].addEventListener('click', onClick);
}

Или, вычислять индекс самостоятельно:

document.querySelector('ul').addEventListener('click', e => {
  if (e.target.tagName === 'LI') {
    const i = [...e.currentTarget.children].indexOf(e.target);
    console.log(i);
  }
});
Ответ написан
Stalker_RED
@Stalker_RED
или сделать более цивилизованно другим способом.


Более цивилизованный: jsfiddle.net/ynhwzo54/6

Работает и при добавлении новых элементов: jsfiddle.net/ynhwzo54/5
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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