Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.09.2018, 16:12
Аватар для Nlk
Nlk Nlk вне форума
Кандидат Javascript-наук
Отправить личное сообщение для Nlk Посмотреть профиль Найти все сообщения от Nlk
 
Регистрация: 25.12.2016
Сообщений: 146

Множественная обработка событий
Здравствуйте!
Скажите пожалуйста, имею несколько событий mousedown на странице, как их лучше оформить для наилучшей производительности?
Оставить как есть все раздельно:
item-1.addEventListener('mousedown' ..
item-2.addEventListener('mousedown' ..

Или лучше объединить:
document.addEventListener('mousedown' ..
    if (event.target.classList.contains("item-1"))
    if (event.target.classList.contains("item-2"))
Ответить с цитированием
  #2 (permalink)  
Старый 24.09.2018, 16:18
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Nlk,
Зачастую лучше объединять, особенно если действия для ряда элементов однотипные.
Да и код более читабельный, имхо.
Ответить с цитированием
  #3 (permalink)  
Старый 24.09.2018, 16:49
Аватар для Nlk
Nlk Nlk вне форума
Кандидат Javascript-наук
Отправить личное сообщение для Nlk Посмотреть профиль Найти все сообщения от Nlk
 
Регистрация: 25.12.2016
Сообщений: 146

Dilettante_Pro,
спасибо
Ответить с цитированием
  #4 (permalink)  
Старый 24.09.2018, 16:52
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Сообщение от Dilettante_Pro
Да и код более читабельный, имхо.
Мое имхо противоположное, если lisneter'ы в куче хранить, читабельность пострадает.

item-1.addEventListener('mousedown',e=>{
    alert('Im first item');
});

item-2.addEventListener('mousedown',e=>{
    alert('Im second item');
});


document.addEventListener('mousedown',e=>{
    if (event.target.classList.contains("item-1")){
        alert('Im first item');

    }else if (event.target.classList.contains("item-2"))
        alert('Im second item');
});
Ответить с цитированием
  #5 (permalink)  
Старый 24.09.2018, 17:00
Аватар для Nlk
Nlk Nlk вне форума
Кандидат Javascript-наук
Отправить личное сообщение для Nlk Посмотреть профиль Найти все сообщения от Nlk
 
Регистрация: 25.12.2016
Сообщений: 146

Nexus,
спасибо.

Меня производительность в первую очередь интересует. Если они все вместе, то последний обработчик ожидает проверку предыдущих прежде чем сработает. А если он слушает определенный элемент то при клике сработает быстрее, так получается?
Ответить с цитированием
  #6 (permalink)  
Старый 24.09.2018, 17:16
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Nlk, я про читабельность писал, производительнее будет когда все в куче.
В обоих случаях обработчики будут "вызваны" по очереди.

Делегирование обработчика события самому документу производительности не прибавит, а даже на оборот, т.к. обработчик будет вызываться каждый раз, как произойдет событие на любом из его дочерних элементов (если событие всплывет к document).
Лучше делегировать обработчик ближайшему общему родителю.

Последний раз редактировалось Nexus, 24.09.2018 в 17:19.
Ответить с цитированием
  #7 (permalink)  
Старый 24.09.2018, 17:45
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

Разница пренебрежимо мала. Такие вещи должны определяться исключительно семантикой кода. Если в обработчике много общих действий - вешаешь один. Если обработчики уникальны - вешаешь каждый отдельно.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 24.09.2018, 18:31
Аватар для Nlk
Nlk Nlk вне форума
Кандидат Javascript-наук
Отправить личное сообщение для Nlk Посмотреть профиль Найти все сообщения от Nlk
 
Регистрация: 25.12.2016
Сообщений: 146

Nexus,
Aetae,
спасибо
Ответить с цитированием
  #9 (permalink)  
Старый 25.09.2018, 15:09
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

Мне кажется, это интересные рассуждения:
https://softwareengineering.stackexc...s-more-complex

https://davidwalsh.name/event-delegate

--
У яндекса в поисковике, мне так показалось, что у них глобальный слушатель.
Ответить с цитированием
  #10 (permalink)  
Старый 25.09.2018, 16:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

Вообще глобальный слушатель глобальному слушателю тоже рознь. Например при ООП очень удобно вешать обработчиком не функцию, а сам объект, тогда все события валятся в метод handlEvent этого объекта и разруливаются уже внутри.
Получается с одной стороны функция обработчик вроде как одна, с другой вешается из разных мест и на разные элементы.)
__________________
29375, 35
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка событий по клику у нескольких кнопок и передача в функцию finlolo Events/DOM/Window 3 12.08.2018 20:28
Обработка событий на динамически созданных объектах Alexey_R jQuery 28 15.02.2017 15:28
ie и другие браузеры - обработка событий torsar Javascript под браузер 1 24.05.2014 20:29
JQuery отложенная обработка событий hover DemonWather jQuery 2 09.03.2011 09:01
svg. обработка событий amigo* Элементы интерфейса 0 23.06.2010 22:31