2016-09-12 2 views
2

Я пытаюсь выполнить итерацию по массиву элементов и добавить слушателя событий к каждому из них.Прокрутите массив и добавьте прослушиватель событий «нажмите» для каждого

Наполнение массив:

var sliders = [].slice.call(document.getElementsByClassName("sliderControlLi")); 

Перебор массива:

sliders.forEach(function (i){ 
    addEventListener("click", function(){ 
    console.log("you clicked slider controler " + this.index + "!"); 
    }); 
}); 

Но с этим кодом, всякий раз, когда я нажимаю на любой из ползунков, которые я получаю несколько console.log распечаток - один раз каждый слайдер в массиве.

Я искал похожие проблемы, но я все еще не могу решить эту проблему.

Спасибо за помощь!

+0

И что 'addEventListener'? Где вы ссылаетесь на элемент, чтобы добавить onclick? – epascarello

+0

Используйте 'i.addEventListener (..)' ... –

+0

Возможный дубликат [Закрытие JavaScript внутри цикла - простой практический пример] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple -practical-example) –

ответ

6

Вы должны использовать addEventListener() как:

target.addEventListener(type, listener[, options]); 

Вы также могли бы получить индекс от forEach:

arr.forEach(function (element_value,element_index){ }) 

Надеюсь, что это поможет.

var sliders = [].slice.call(document.getElementsByClassName("sliderControlLi")); 
 

 
sliders.forEach(function (element, index){ 
 
    element.addEventListener("click", function(){ 
 
    console.log("you clicked slider controler " +index + "!"); 
 
    }); 
 
});
<div class="sliderControlLi">slider 1</div> 
 
<div class="sliderControlLi">slider 2</div> 
 
<div class="sliderControlLi">slider 3</div> 
 
<div class="sliderControlLi">slider 4</div>

3

Вы должны использовать

EventTarget.addEventListener(...) 
^^^^^^^^^^^^ 

так в вашем случае

sliders.forEach(function (elem){ 
    elem.addEventListener(...); 
}); 
Смежные вопросы