Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/40: Рейтинг темы: голосов - 40, средняя оценка - 5.00
648 / 313 / 34
Регистрация: 31.05.2019
Сообщений: 2,364

Как грамотно повесить обработчик на все элементы с одним и тем же классом?

16.10.2020, 19:01. Показов 9054. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую,

В общем история такая, у меня js файл один на весь проект, на каждой странице он подгружается.
Если бы только на одной странице подгружалось, то я бы как-то так:

JavaScript
1
2
3
4
5
let elem2 = document.querySelectorAll("selector");
 
for (let i = 0; i < elem1.length; i++) {
    elem1[i].addEventListener("click", funcClick1);
}
Что в моем случае сделать? Проверить коллекцию на пустоту?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.10.2020, 19:01
Ответы с готовыми решениями:

Повесить обработчик событий на все элементы определенного класса
есть код: onload = function(){ var a = document.querySelectorAll(&quot;p.kor a&quot;); alert(a.href); ...

Как повесить обработчик событий на все ноды списка?
например, document.getElementsByClassName() возвращает список нодов. как повесить onclick на каждый элемент? цикл – не очень хороший...

Общий обработчик для кнопок с одним классом
Есть код: var btn = document.getElementsByClassName('button'); btn.onclick = function() { alert(this.id); }

9
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
16.10.2020, 19:15
Здравствуйте.
Правильнее всего, считаю, использовать делегирование событий:
JavaScript
1
2
3
4
5
6
document.body.addEventListener("click", function (event) {
  const elem = event.target.closest("selector"); // если элемент не существует, ошибки не возникнет
  if (elem) {
    funcClick1();
  }
});
1
648 / 313 / 34
Регистрация: 31.05.2019
Сообщений: 2,364
16.10.2020, 19:47  [ТС]
DrType,
У меня много одинаковых элементов, которые имеют один и тот же селектор и на которых нужно повысить обработчик, а тут вроде на один только элемент вешается
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
16.10.2020, 20:11
Понимаю, а собственно, зачем нам вешать обработчик на каждый отдельный элемент? Предполагаю, что конечная цель состоит в том, чтобы функция — обработчик события вызывалась при клике на каждый из одинаковых элементов; однако именно этого мы и добьёмся, используя делегирование, как в моём коде.
В принципе, конечно, можно навешивать обработчики в цикле, предварительно проверив коллекцию на пустоту, как Вы и написали. Но это не лучшая практика.
1
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
16.10.2020, 20:41
Sneykas, DrType, в пустой коллекции просто цикл внутрь не зайдёт и всё.
В коллекции будет просто 0 элементов. Отдельно проверять не надо.
2
648 / 313 / 34
Регистрация: 31.05.2019
Сообщений: 2,364
16.10.2020, 21:44  [ТС]
DrType,
еще один (может глупый) вопрос:

JavaScript
1
2
3
4
5
6
document.body.addEventListener("click", function (event) {
  const elem = event.target.closest("selector"); // если элемент не существует, ошибки не возникнет
  if (elem) {
    funcClick1();
  }
});
в elem будет находится коллекция и мы как бы коллекцию полностью вешаем funcClick?
Еще можно пример с callback-функцией? а то я подумал, зачем создавать отдельную функцию, если можно в коллбэк закинуть все


JavaScript
1
2
3
4
5
6
7
8
document.body.addEventListener("click", function (event) {
    const elem = event.target.closest("box");
    if (elem) {
        elem.classList.toggle('box_red');
        let window = document.querySelector('window');
        window.classList.toggle('window_show');
    }
});
amr-now, DrType,

Тыкаю на каждый квадрат, вроде все норм, изменяет свой цвет, однако у каждого квадрата рядом окна разные (сами элементы разные, однако у них одинаковый класс window). Что в этом случае предложите делать?
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
16.10.2020, 22:35
Sneykas, да, весь код можно поместить в анонимную функцию-обработчик...

Приложите Вашу HTML-разметку, станет яснее.
0
648 / 313 / 34
Регистрация: 31.05.2019
Сообщений: 2,364
17.10.2020, 00:09  [ТС]
DrType,

HTML5
1
2
3
4
5
6
<div class="book">
    <div class="sign">Отмечено</div><span class="box"></span>
    <div class="window">
        <a class="change-sign" href="/book/signs">Убрать с пометок</a>
    </div>
</div>
Приложение, пользователь как бы помечает, что прочитал, а что нет.
И таких книг на одной странице может быть максимум 10, потом идет пагинация
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
17.10.2020, 00:50
Лучший ответ Сообщение было отмечено Sneykas как решение

Решение

Чтобы не слишком зависеть от вёрстки, можно сделать так:
JavaScript
1
2
3
4
5
6
7
8
document.body.addEventListener("click", function (event) {
  const elem = event.target.closest(".box");
  if (elem) {
    elem.classList.toggle("box_red");
    const window = elem.closest(".book").querySelector(".window");
    window.classList.toggle("window_show");
  }
});
2
648 / 313 / 34
Регистрация: 31.05.2019
Сообщений: 2,364
17.10.2020, 11:42  [ТС]
DrType,

Дружище, спасибо.
Опять выручаешь : )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.10.2020, 11:42
Помогаю со студенческими работами здесь

Как повесить обработчик MouseUp?
у класса описал метод void __fastcall MainItem::MouseRightClc(TObject *Sender, TShiftState Shift, int X, int Y) { ...

Как повесить обработчик на событие выхода из MS Access?
Как повесить обработчик на событие выхода из MS Access?

Как повесить обработчик на загруженный ajax-ом контент
Здравствуйте. У меня вот такая проблема: На странице отображается 2 блока &quot;div&quot; с информацией, при клике по блокам...

Как динамический повесить на кнопку обработчик события Click ?
Оргомная просьба: не подскажет ли кто-нибудь как динамический повесить на кнопку обработчик события Click ? В макросе для Word...

Как повесить handler(обработчик события) на клик по скроллбару?
Именно на сам CLICK!!!, а не скроллинг, и также на UNCLICK, хотелось бы узнать, есть ли вообще такая возможность и как это делается?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru