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);


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

MC-XOBAHCK 10.08.2018 00:22

Я не против call, наоборот - это очень хорошо что Вы так показали. Спасибо! У меня он часто встречается в решениях которые мне здесь на форуме подсказывали. Я его упустил.
JS это как иностранный язык - нельзя всё сразу запомнить, нужно время. Вот у меня время до call дошло. Лучше поздно чем никогда.

Aetae 10.08.2018 00:23

Сделать разок так:
[
  "slice",
  "lastIndexOf",
  "indexOf",
  "forEach",
  "map",
  "filter",
  "reduce",
  "reduceRight",
  "some",
  "every",
  "find",
  "findIndex",
  "includes"
].forEach(method => {
  if(method in NodeList.prototype) return;
  NodeList.prototype[method] = Array.prototype[method];
});
и забыть. :)

Честно говоря меня подбешивает, что NodeList не наследник Array. Для HTMLCollection причина понятна, но для NodeList - хоть убей. :(

j0hnik 10.08.2018 00:26

ну ок, за одно гляньте по bind и apply
https://youtu.be/213r4EOHfF0?list=PL...LeWwe m&t=133

j0hnik 10.08.2018 00:30

Aetae,
по разку для каждого проекта

Aetae 10.08.2018 00:31

Цитата:

Сообщение от j0hnik (Сообщение 492274)
Aetae,
по разку для каждого проекта

Ну мыж не с нуля каждый проект пишем.:)
У меня по дефалту конечно не всё так просто, но суть едина.

MC-XOBAHCK 10.08.2018 00:32

Цитата:

Сообщение от Aetae (Сообщение 492272)
Сделать разок так: и забыть. :)

Вот мне laimas очень похожее решение сделал (круто сделал), а я дуб-дерево иф, элз и вар, завис от такого кода. Пол года пошло на перезагрузку и перепрошивку. Но последствия остались - до сих пор бывает бывает подвисаю саю.

j0hnik 10.08.2018 00:33

нет, но и все наработки в одну кучу лучше тоже не запихывать.

Alexandroppolus 10.08.2018 04:06

Цитата:

Сообщение от Aetae
Честно говоря меня подбешивает, что NodeList не наследник Array.

возможно, из-за того, что NodeList задуман как read-only, а у массива много модифицирующих методов, которые в NodeList окажутся ни к селу ни к городу


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