Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   AddEventListener для массива (https://javascript.ru/forum/events/39658-addeventlistener-dlya-massiva.html)

Valdemor 07.07.2013 16:57

AddEventListener для массива
 
У меня есть массив элементов, полученный при помощи, например, querySelectorAll("div#menu ul#add li[name='my']"). Нужно добавить для всех этих элементов addEventListener (не через on+"действие", только через addEventListener!). Мне делать цикл, в котором я присвою для каждого элемента addEventListener, использовать делегирование или что-нибудь другое?

Valdemor 07.07.2013 17:04

я и не хотел присваивать метод, для меня это не подходит

cyber 07.07.2013 17:19

Valdemor,
используйте делегирование

danik.js 07.07.2013 17:34

И к слову, querySelectorAll возвращает не массив, а NodeList. Это массивоподобный объект.

var collection = document.querySelectorAll('*');
alert (collection instanceof Array);
alert (collection.constructor.name);

Valdemor 07.07.2013 18:09

А если у меня документ, в котором элементы разбросаны по всему body? Как тогда быть?
Будет ли огромный цикл с addEventListener влиять на производительность скрипта?

cyber 07.07.2013 18:23

Valdemor,
вешаете обработчик на body и отлавливаете событие на нужных элементах

Valdemor 07.07.2013 18:33

Значит, Вы советуете делегирование.
А как же проверку делать?
if(target.getAttribute(name)=='my'&&target.parentNode.tagName=='ul'&&target.parentNode.getAttribute(id)=='add'&&target.parentNode.parentNode.tagName=='div'&&target.parentNode.parentNode.getAttribute(id)=='menu')

Странно, как-то...
И кстати, а как заменить запись типа .parentNode.parentNode? Создать метод parent(n), где n-количество работы цикла? (рекурсию не люблю использовать, т.к. работает вдвое дольше цикла).

danik.js 07.07.2013 19:07

Цитата:

Сообщение от Valdemor
А как же проверку делать?

if (target.matches('div#menu ul#add [name="my"]')){
  // do stuff
}

Но это по спецификации. В реале же нужно использовать webkitMatchesSelector || mozMatchesSelector || msMathesSelector || oMatchesSelector (http://caniuse.com/matchesselector)
Кроме того, нет никакого смысла проверять контекст элемента, имеющего id, так что ваш пример плохой.

В jQuery есть кроссбраузерный метод проверки на соответствие селектору, но даже он вам не понадобится, так как в jQuery есть удобный способ делегирования обработки событий.

Valdemor 07.07.2013 19:16

Я не использую jQuery по неспольким причинам.
А за код спасибо!

danik.js 07.07.2013 19:38

Среди этих причин есть отсутствие необходимости поддержки старых браузеров? Если нет то желаю удачи в написании кода, состоящего наполовину из костылей )

Valdemor 07.07.2013 20:52

jQuery же тоже написан на javascript. Он не использует каких-то инопланетных технологий, поэтому - состоит из костылей!)
Я так осваиваю язык, не используя jQuery (я хочу научится и писать на чистом javascript, и не прибегать к jQuery (я его, кстати, немножко презираю с тех пор, когда весь мой код с live-методами нужно было переписывать на on...)).

danik.js 07.07.2013 21:04

Цитата:

Сообщение от Valdemor
состоит из костылей!

Все верно. Но те костыли уже написаны за тебя и тебе не нужно напрягаться с этим. А так да, если изучаешь язык, то в топку jQuery. А иначе получается например вот так.

Цитата:

Сообщение от Valdemor
(я его, кстати, немножко презираю с тех пор, когда весь мой код с live-методами нужно было переписывать на on...)

Сколько лет прошло с момента объявления метода live устаревшим до его дропа? Чем тебе угрожали когда ты не по своей воле обновлял библиотеку jQuery?

Valdemor 07.07.2013 21:38

Новостей по этому поводу я не видел, да и смысла особого удалять live нет - синтаксис практически одинаковый.
А так, функционал расширивается. Когда-нибудь, возможности jQuery подошли бы к новому уровню и смысла использовать старую версию ради одной функции не будет...

Valdemor 07.07.2013 22:33

Цитата:

Сообщение от danik.js (Сообщение 260761)
if (target.matches('div#menu ul#add [name="my"]')){
  // do stuff
}

Но это по спецификации. В реале же нужно использовать webkitMatchesSelector || mozMatchesSelector || msMathesSelector || oMatchesSelector (http://caniuse.com/matchesselector)
Кроме того, нет никакого смысла проверять контекст элемента, имеющего id, так что ваш пример плохой.

В jQuery есть кроссбраузерный метод проверки на соответствие селектору, но даже он вам не понадобится, так как в jQuery есть удобный способ делегирования обработки событий.

Нет, этот способ не подходит. target - элемент. Как мне узнать всё, сплошь до name родителя?

danik.js 08.07.2013 07:26

Цитата:

Сообщение от Valdemor
target - элемент

Это к чему вобще сказано?
Цитата:

Сообщение от Valdemor
Как мне узнать всё, сплошь до name родителя

var parentName = target.parentNode.name;

Valdemor 08.07.2013 21:01

Цитата:

Сообщение от nasqad (Сообщение 260841)
Не хочу вас разочаровывать но за полтора года осваивания вы все еще спрашиваете совета в задачах первого дня обучения.

Я изучал другие языки, а о javascript забыл.
Цитата:

Сообщение от danik.js (Сообщение 260869)
Это к чему вобще сказано?

К тому, что твой совет насчет matches не подходит - у меня есть тег, но никак не строка. Кстати, функция matches не существует.
Цитата:

Сообщение от danik.js (Сообщение 260869)
var parentName = target.parentNode.name;

Но у меня же строка не только с параметрами тегов! У меня там могут быть id'ы, классы, имена, селекторы. Мне их выделять при помощи регулярного выражения и добавить это в строку? Не многова-то ли выходит?

danik.js 08.07.2013 21:19

Цитата:

Сообщение от Valdemor
К тому, что твой совет насчет matches не подходит - у меня есть тег, но никак не строка.

Ты очень странный человек, так что спорить не буду. Ты спросил как проверять target - я предложил удобный вариант. Не подходит - тебе видней.
Цитата:

Сообщение от Valdemor
Кстати, функция matches не существует.

Да ладно???
Цитата:

Сообщение от danik.js
Но это по спецификации. В реале же нужно использовать webkitMatchesSelector || mozMatchesSelector || msMathesSelector || oMatchesSelector (http://caniuse.com/matchesselector)

Видимо я пишу в пустоту, надо завязывать...

Valdemor 09.07.2013 00:15

Ой, извините, просто гуглил matches - только о match результаты были, а о webkitMatchesSelector - так вообще 2 страницы.
Извините за отобранное время и спасибо за ответ!


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