Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   addEventListener внутри forEach можно? (https://javascript.ru/forum/misc/74817-addeventlistener-vnutri-foreach-mozhno.html)

MC-XOBAHCK 09.08.2018 18:46

addEventListener внутри forEach можно?
 
Подскажите, можно ли в js устанавливать слушатель addEventListener внутри forEach ?
Если я вот такой код:
for (var i = 0; i < inpPrim.length; i++) {
    inpPrim[i].addEventListener('change', () => plankiPrim())
}

перепишу вот так:
inpPrim.forEach(el => el.addEventListener('change', () => plankiPrim()));

Так допускается? Может так не рекомендуется (нагрузки, замедление)?
Или лучше для addEventListener делать первый вариант на for ?

рони 09.08.2018 18:55

Цитата:

Сообщение от MC-XOBAHCK
Так допускается?

да, и так часто лучше, c i меньше шансов ошибиться.
но зачем в данном случае () => plankiPrim(), можно просто plankiPrim?

MC-XOBAHCK 09.08.2018 19:07

рони, Спасибо, буду знать.
А вот как можно сразу? Можете показать код?
Я вот так попробовал запустить:
inpPrim.forEach(el => el.addEventListener('change', plankiPrim()));

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

Aetae 09.08.2018 19:25

MC-XOBAHCK, ответьте на вопросы:
1. Что делают скобочки после имени функции?
2. Что именно ожидает вторым аргументом addEventListener?
Найдите противоречие.

MC-XOBAHCK 09.08.2018 19:27

Цитата:

Сообщение от Aetae (Сообщение 492257)
MC-XOBAHCK, ответьте на вопрос: что значат скобочки в конце имени функции?

Вызов функции.
Сейчас попробую без скобочек.

MC-XOBAHCK 09.08.2018 19:30

Aetae, Спасибо за намёк!
inpPrim.forEach(el => el.addEventListener('change', plankiPrim));

Работает!!! : )

MC-XOBAHCK 09.08.2018 23:35

А можно ещё спросить, вот такое можно ещё сократить?
const inpPrim = document.querySelectorAll('input[name="vvPl"]'); // это остаётся (используется ещё в других местах)

let size = [];
inpPrim.forEach((el, i) => size[i] = +el.value);

Типа вот как то так нельзя? :
let size = [].inpPrim.forEach((el, i) => size[i] = +el.value);

j0hnik 09.08.2018 23:39

let size = [].map.call(inpPrim, el => +el.value);


forEach метод который ничего не возвращает (у него только побочный эффект)

MC-XOBAHCK 10.08.2018 00:01

j0hnik, Круто!
Метод call это новое для меня. Вроде на моём примере он вполне понятен, но я лучше подробненько перечитаю весь урок.

j0hnik 10.08.2018 00:04

да все потому что inpPrim это нод лист, а так можно было бы и без кол.


var inpPrim = [...document.querySelectorAll('input')];
let size = inpPrim.map(el => +el.value);


но с кол в данном случает будет быстрей.


Часовой пояс GMT +3, время: 03:10.