Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.05.2018, 14:34
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Аргумент функции внутри цикла - можно?
Здравствуйте!
Я не знаю как мне правильно сформулировать вопрос.
У меня такой код:
let butShag = document.querySelectorAll('.butShag');

for (let i = 0; i < butShag.length; i++) {
    butShag[i].addEventListener('click', function () {
        title(i); //Вот здесь i можно передавать?
    })
}

Можно ли так передавать индекс в title(i); ?
При клике на первую кнопку срабатывает, а на остальных даёт ошибку.
Или это недопустимо в JavaScript?
Ответить с цитированием
  #2 (permalink)  
Старый 07.05.2018, 14:43
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

let butShag = document.querySelectorAll('.butShag');

for (let i = 0; i < butShag.length; i++) {
    butShag[i].addEventListener('click', function (i) {
        title(i);
    }.bind(butShag[i], i))
}


Но правильней будет вынести функцию обработчика, чтобы не создавать её каждый раз по новой.
А ещё правильней будет не использовать цикл, а использовать метод массива forEach, тогда и проблема с индексом отпадёт.

let butShag = document.querySelectorAll('.butShag');

function onClick(index, event) {
    title(index);
}

Array.prototype.forEach.call(butShag, (item, index) => item.addEventListener('click', onClick.bind(item, index));

Последний раз редактировалось ruslan_mart, 07.05.2018 в 14:47.
Ответить с цитированием
  #3 (permalink)  
Старый 07.05.2018, 14:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

MC-XOBAHCK,
Пример ошибочного использования
Ответить с цитированием
  #4 (permalink)  
Старый 07.05.2018, 15:16
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

возможно, стоит подумать о делегировании
Ответить с цитированием
  #5 (permalink)  
Старый 07.05.2018, 15:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от ruslan_mart
А ещё правильней будет не использовать цикл, а использовать метод массива forEach,
[].forEach.call(document.querySelectorAll('.butShag'), function(node, index) {
   node.addEventListener("click", function() {
   title(index);
  })
});
Ответить с цитированием
  #6 (permalink)  
Старый 07.05.2018, 15:49
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Спасибо всем за науку.
Для меня методы в предложенных решениях новЫ, я про них читал и видел, но никогда не использовал.
Вот видимо пришло время и повод чтобы их осваивать.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Остановить итерацию цикла из функции wadim Общие вопросы Javascript 5 28.12.2017 21:16
Как вставить в аргумент функции текущее значение переменной? polinin Общие вопросы Javascript 7 01.11.2017 10:37
window.open внутри функции rainurka Общие вопросы Javascript 2 21.09.2014 00:18
Можно ли использовать функции в качестве свойства абс_позиционируемого объекта Newgen Элементы интерфейса 1 27.07.2009 14:40
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00