Как получить индекс элемента при клике?

427
23 ноября 2017, 05:04

Привет. Есть такой код

<div class='wrapper'>
<div class='dot'></div>
<div class='dot'></div>
<div class='dot'></div>
<div class='dot'></div>
<div class='dot'></div>
<div class='dot'></div>
<div class='dot'></div>
</div>

Через команду

var dots = document.getElementsByClassName('dots');

Получил массив с dot.

Как при клике на каждый в console высвечивалось его index Кликаю на первый элемент в консоль его индекс(0)

очень прошу дать пример кода,

Answer 1

Вариант 1 (плохой, но очевидный):

dots.forEach(function(dot, i) {
    dot.addEventListener("click", function() {
        console.log(i);
    });
});

Плох он тем, что приходится навешивать слишком много (а точнее, неоправданно много) обработчиков.

Вместо foreach() можно, разумеется, воспользоваться и простым циклом:

var i, length = dots.length;
for (i = 0; i < length; i++) {
    dots[i].addEventListener("click", function() {
        console.log(i);
    });
}

Вариант 2 (получше):

Для его реализации необходимо обернуть необходимые элементы в родительский элемент, своего рода "контейнер" (предположим, у него id = cont).

Тогда можно навесить один обработчик события на этот контейнер:

var cont = document.getElementById("cont");
cont.addEventListener("click", function(event) { // навешиваем один обработчик на родительский элемент
    console.log(dots.indexOf(event.target)); // в свойстве `target` будет содержаться непосредственно тот элемент, по которому кликнули
});

Но в этом случае придется искать индекс элемента в массиве отдельно (метод indexOf()).

Также стоит помнить, что искомого элемента в массиве может не быть (кликнули не на элемент с классом dot), а куда-нибудь мимо (но все еще в пределах родительского блока). В этом случае стоит сразу проверить, есть ли элемент в массиве, а затем уже выводить его индекс, если элемент найден - стандартная процедура:

cont.addEventListener("click", function(event) {
    var index = dots.indexOf(event.target);
    if (~index) {
        console.log(index);
    }
});
READ ALSO
Среднее значение параметра объекта

Среднее значение параметра объекта

Получаю Массив внутри объекты с данными

320
Пустой document.cookie в Chrome

Пустой document.cookie в Chrome

Есть код приложенный нижеВ Firefox как и в IE при первом обновлении страницы, как и при последующих будет выводится переданная мной строка

2092
Переключение таба при клике на ссылку

Переключение таба при клике на ссылку

Привет, есть группа ссылокНеобходимо сделать так, чтобы при клике на ссылку запускалась функция

229
Не работает Notification API с let&#39;s encrypt

Не работает Notification API с let's encrypt

Суть вопроса - установил на свой домен ssl сертификат let's encrypt, установка произошла корректно, при проверке показывает что сайт защищен и тд

262