JavaScript. Event Model (in russian)

Mikhail Davydov
Mikhail DavydovJavaScript & Node.js Developer at Yandex
JavaScript. Event Model (in russian)
Михаил Давыдов
Разработчик JavaScript
JavaScript
События
Паттерн PubSub
4
PubSub
•  Издатель (Publisher)
–  Генерирует данные одного типа
–  Издает только одну газету
–  Издателей может быть много
•  Подписчики (Subscribers)
–  Подписываются на данные издателя
–  Могут отписаться в любой момент
•  Данные – поток
–  Поздно подписался – упустил данные
–  Объем и частота публикаций задается издателем
5
var PubSub = function () {
this.readers = [];
};
PubSub.prototype = {
pub: function (data) {},
sub: function (callback) {},
unsub: function (callback) {}
};
// function callback(data) {}
PubSub – пример
6
PubSub – особенности
•  Самая простая реализация
•  Только 1 тип данных
–  А хочется еще и "Мурзилку" получать
•  Нужно напрямую общаться с объектом
Event Emitter
8
Event Emitter
•  Имеет много названий
•  Издатель
–  Генерирует данные разных типов
–  Издает газеты и журналы
–  Издателей может быть много
•  Подписчики
–  Подписываются на данные любого типа в любом количестве
–  Могут отписаться в любой момент
•  Данные – поток
–  Поздно подписался – упустил данные
–  Объем и частота публикаций задается издателем
9
var EventEmitter = function () {
// events = {"event_name": []};
this.events = {};
};
EventEmitter.prototype = {
emit: function (event, data) {},
on: function (event, callback) {},
off: function (event, callback) {}
};
// function callback(data) {}
Event Emitter – пример
10
Event Emitter – особенности
•  Много разных типов данных
•  Нужно иметь ссылку на EventEmitter
11
Event Manager
12
Event Manager
•  Имеет много названий
•  Своеобразная шина данных
•  Единственный издатель
–  Генерирует данные разных типов
•  Подписчики
–  Подписываются на данные любого типа в любом количестве
–  Могут отписаться в любой момент
•  Данные – поток
–  Поздно подписался – упустил данные
–  Объем и частота публикаций задается издателем
13
Похож на Event Emitter, но это Синглентон
var EventManager = {
events: {},
emit: function (event, data) {},
on: function (event, callback) {},
off: function (event, callback) {}
};
// function callback(data) {}
Event Manager – пример
14
Event Manager – особенности
•  Много разных типов данных
•  Об этом объекте знают все
Дополнительные фичи
Управление событиями, namespace
Накопление данных
События на дереве DOM
Делегирование событий
Фильтрация событий
Их наличие зависит от
конкретны задач
Фичи направлены на
управление группами
событий и агрегацией
18
Управление событиями
•  Группировка событий
–  namespace
•  Легкое удаление событий
–  Удаление события без callback
–  Удаление по дескриптору
19
jQuery 1.8
var handler = function () {};
$('body').on('click.ns', handler);
$('body').off('click', handler); // не удобно
$('body').off('click'); // все click
$('body').off('.ns'); // весь namespace
$('body').off(); // все события
$('body').off('**'); // все делегированные
Управление событиями – пример
20
Накопление данных
•  Опоздал с подпиской – ничего не получил
–  Это не удобно
•  Пользователь желает получить все
–  Всю подписку журналов с нуля
•  Как только подписался – сразу получил
•  Похоже на Promise
21
jQuery DOMReady
$(function () {
$(function () {
console.log('Tada!');
});
});
Накопление данных – пример
22
jQuery Ajax#done
var data = $.get('/');
data.done(function () {
data.done(function () {
console.log('Tada!');
});
});
Накопление данных – пример
DOM события
События на DOM дереве
Event bubbling
Event capturing
Не всплывающие события
24
Event bubbling
•  Событие начинается с текущего элемента
•  Поднимается по DOM дереву
•  Последний элемент – корень дерева
–  window или document
25
<div>
Event bubbling
<div>
<div>
*Click*
26
<div>
Event bubbling
<div>
<div>
*Click*
27
<div>
Event bubbling
<div>
<div>
*Click*
28
<div>
Event bubbling
<div>
<div>
*Click*
29
Event bubbling – фаза по умолчанию в jQuery
// jQuery 1.7 .on()
$('.b-form-button').on('click', function (event) {
console.log(this); // .b-form-button element
});
// Хэлперы
$('.b-form-button').click(function (event) {
console.log(event);
});
Event bubbling в jQuery
http://api.jquery.com/on/	

http://api.jquery.com/category/events/	

http://api.jquery.com/category/events/event-object/
30
Функция bindTo()
BEM.DOM.decl('b-form-input', {
onSetMod : {
'js' : {
'inited' : function () {
this
.bindTo(this.elem('input'), {
'focus' : this.onFocus,
'blur' : this.onBlur
});
}
}
}
});
Event bubbling в i-bem
http://bem.github.com/bem-bl/sets/common-
desktop/i-bem/i-bem.ru.html
31
Не всплывающие события
•  var itBubbles = event.bubbles;!
•  Специфичные события для 1 элемента
–  submit, focus, blur, load, unload, change, reset, scroll
•  Некоторые события мутаций DOM
–  DOMFocusIn, DOMFocusOut, DOMNodeRemoved
https://developer.mozilla.org/en-US/docs/
Mozilla_event_reference
32
Особенности
•  Фазы Capturing & Bubbling идут
одновременно
–  Чередуются capturing, bubbling
•  Каждый обработчик получает новый инстанс
объекта Event
http://jsfiddle.net/h2nJU/2/
Делегирование
Один обработчик – несколько целей
Основа – всплытие событий
34
<ul> onclick=delegateClick
Делегирование
<li class="good">
*Click*
<li class="good">
<li class="bad">
35
<ul> onclick=delegateClick
Делегирование – начало события
<li class="good">
*Click*
<li class="good">
<li class="bad">
36
<ul> onclick=delegateClick
Делегирование – всплытие события
<li class="good">
*Click*
<li class="good">
<li class="bad">
37
var isTarget =
event.target.classList
.contains('good');
38
<ul> onclick=delegateClick
Делегирование
<li class="good">
<li class="good">
<li class="bad">
*Click*
39
<ul> onclick=delegateClick
Делегирование – начало события
<li class="good">
<li class="good">
<li class="bad">
*Click*
40
<ul> onclick=delegateClick
Делегирование – всплытие события
<li class="good">
<li class="good">
<li class="bad">
*Click*
41
Событие не произойдет
contains('good') === false;
42
Профит делегирования
•  Меньше обработчиков событий
–  Экономия памяти
–  Меньше утечек памяти
•  Проще работать с динамическими
элементами
43
Особенности делегирования
•  Если событие не всплывает – ничего не
получится
•  Нужно максимально ограничивать событие
–  Необходимо выбрать наиболее близкого делегата
•  Возможны частые ложные вызовы события
–  Большие затраты на вызов функции
•  Ограничить делегирование у частых
событий
–  mousemove
•  Не использовать делегирование если
элемент 1
44
// jQuery 1.7+ .on()
$('.b-container')
.on('click', '.b-item', function (event) {
console.log(this); // .b-item
});
// jQuery 1.3+
$('.b-item')
.live('click', function (event) {
console.log(this); // .b-item
});
// === $(document).on('click', '.b-item')
Делегирование в jQuery
http://api.jquery.com/on/	

http://api.jquery.com/live/
Управление DOM событием
Прерывание всплытия
Прерывание действия по умолчанию
46
Прерывание всплытия
•  event.stopPropagation()
–  Прерывает всплытие события по дереву
•  event.stopImmediatePropagation()
–  Прерывает всплытие события по дереву
–  Отменяет прочие обработчики
http://www.w3.org/TR/DOM-Level-2-Events/
events.html#Events-Event-stopPropagation
47
48
Прерывание действия по умолчанию
•  Действие по умолчанию
–  Переход по ссылке
–  Раскрытие <select>
–  Сабмит формы
–  Фокус в инпут
–  Снятие фокуса
•  event.preventDefault()
–  Перерывает это действие
•  Некоторые действия прервать нельзя
–  var isCanPrevent = event.cancelable;
–  resize, scroll, focus, error, load, unload, DOM*, …
https://developer.mozilla.org/en-US/docs/DOM/
event.preventDefault
49
$('.b-link').click('click', function (event) {
return false; // preventDefault+stopPropagation
});
$('.b-form').click('submit', function (event) {
return isValid(this); // this - .b-form
});
$('.b-link').click('click', function (event) {
event.preventDefault();
event.stopPropagation();
});
Прерывание событий jQuery
http://api.jquery.com/on/	

http://api.jquery.com/live/
debounce, throttle
Фильтрация событий
http://benalman.com/projects/jquery-throttle-
debounce-plugin/
Бывает, что событий очень
много, а обрабатывать
каждое дорого
52
throttle
•  Фильтрация частоты сообщений
•  Событие вызывается не чаще чем раз в N
миллисекунд
53
$.throttle(timeout,
callback,
no_trailing);
54
$.throttle
no_trailing=false	

no_trailing=true	

Пауза
Пауза
Поток событий
Допущенные события
55
var log = $.throttle(250, function () {
console.log(arguments);
});
$(window).scroll(log);
$(window).off('scroll', log);
$.throttle
http://benalman.com/code/projects/jquery-throttle-
debounce/examples/throttle/
56
debounce
•  Склеивает вызовы в один
•  Событие вызывается только после паузы в
N милисекунд
57
$.debounce(timeout,
callback,
at_begin);
58
$.debounce
at_begin=false	

at_begin=true	

Пауза
Пауза
59
function suggest(event) {};
$('input').keyup(suggest);
$('input').keyup($.debounce(250, suggest));
$('input').unbind('keyup', suggest);
$.debounce
http://benalman.com/code/projects/jquery-throttle-
debounce/examples/debounce/
Неуместное использование
Накладные расходы
Проблемы событий
События это круто –
давайте везде
использовать!!1!
62
Вариант не удачного использования событий
DataObject.on('someData', function (data) {
console.log(data);
});
DataObject.trigger('giveMe:someData');
Событие геттер
63 DataObject.someData
Y U NO
64
События – поток. Их лучше
использовать как поток
данных
65
Module A Module B
66
Module A Module B
Data C
67
Module A Module B
Data C
Give me C
68
Module A Module B
Data C
Data C'
Give me C
69
Module A Module B
Data C
Data C'
Give me C
70
Module A Module B
Data C Data C
71
Накладные расходы
•  Событие – функция
–  n объектов, k ресурсов = n*k функций
–  функция занимает ресурсы
–  лишние скоупы, сборка мусора и JIT-компиляция
–  вызов кучи функций
–  утечки памяти
Events everywhere!
73
Не блокирующий I/O
•  Дефрагментация времени блокировок
–  Более плотная загрузка процесса
•  Выгодно применять, когда время I/O больше
времени обработки данных
•  Меньше проблем с разделяемой памятью
74
Слабое связывание
•  Элементы не знают о программе
•  Элементы общаются только событиями
•  Меньше разделенной памяти
–  Меньше проблем синхронизации
75
trigger(message)! on(message, callback)!
76
Заключение
•  События
–  PubSub
–  Event Emitter
–  Event Manager
•  Фичи событий
–  namespace
–  накопление данных
•  DOM события
–  Event Bubbling
–  Делегирование
–  Прерывание события
–  Отмена действия по умолчанию
•  Фильтрация
77
Михаил Давыдов
Разработчик JavaScript
azproduction@yandex-team.ru
azproduction
Спасибо
1 of 77

Recommended

Михаил Давыдов — JavaScript: События by
Михаил Давыдов — JavaScript: СобытияМихаил Давыдов — JavaScript: События
Михаил Давыдов — JavaScript: СобытияYandex
2.9K views77 slides
Frontend весна 2014 лекция 1 by
Frontend весна 2014 лекция 1Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Technopark
641 views91 slides
Продвинутое использование ActiveRecord в Yii2 by
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Paul Klimov
2K views42 slides
Web весна 2012 лекция 7 by
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7Technopark
552 views34 slides
Web internship java script by
Web internship   java scriptWeb internship   java script
Web internship java scriptNoveo
474 views33 slides
course js day 4 by
course js day 4course js day 4
course js day 4Georgyi Grigoryev
119 views30 slides

More Related Content

Viewers also liked

Как оценить эффективность обучения by
Как оценить эффективность обученияКак оценить эффективность обучения
Как оценить эффективность обученияAlexei Kapterev
3.4K views45 slides
Сколько слайдов в самый раз? by
Сколько слайдов в самый раз?Сколько слайдов в самый раз?
Сколько слайдов в самый раз?ProstoPreza.ru
89K views39 slides
7 базовых сюжетов сторителлинга для вашей презентации by
7 базовых сюжетов сторителлинга для вашей презентации7 базовых сюжетов сторителлинга для вашей презентации
7 базовых сюжетов сторителлинга для вашей презентацииInspired presentation
105K views46 slides
Презентация высокого полета экспресс курс by
Презентация высокого полета экспресс курсПрезентация высокого полета экспресс курс
Презентация высокого полета экспресс курсWebinar.ru
97.1K views58 slides
Почему презентации так трудно делать? by
Почему презентации так трудно делать?Почему презентации так трудно делать?
Почему презентации так трудно делать?Alexei Kapterev
177.5K views35 slides
Как стать супергероем презентаций: дизайн by
Как стать супергероем презентаций: дизайнКак стать супергероем презентаций: дизайн
Как стать супергероем презентаций: дизайнAlexey Ivanov
135.8K views79 slides

Viewers also liked(8)

Как оценить эффективность обучения by Alexei Kapterev
Как оценить эффективность обученияКак оценить эффективность обучения
Как оценить эффективность обучения
Alexei Kapterev3.4K views
Сколько слайдов в самый раз? by ProstoPreza.ru
Сколько слайдов в самый раз?Сколько слайдов в самый раз?
Сколько слайдов в самый раз?
ProstoPreza.ru89K views
7 базовых сюжетов сторителлинга для вашей презентации by Inspired presentation
7 базовых сюжетов сторителлинга для вашей презентации7 базовых сюжетов сторителлинга для вашей презентации
7 базовых сюжетов сторителлинга для вашей презентации
Презентация высокого полета экспресс курс by Webinar.ru
Презентация высокого полета экспресс курсПрезентация высокого полета экспресс курс
Презентация высокого полета экспресс курс
Webinar.ru97.1K views
Почему презентации так трудно делать? by Alexei Kapterev
Почему презентации так трудно делать?Почему презентации так трудно делать?
Почему презентации так трудно делать?
Alexei Kapterev177.5K views
Как стать супергероем презентаций: дизайн by Alexey Ivanov
Как стать супергероем презентаций: дизайнКак стать супергероем презентаций: дизайн
Как стать супергероем презентаций: дизайн
Alexey Ivanov135.8K views
Секреты презентации. Как сделать презентацию для спикера? by Inspired presentation
Секреты презентации. Как сделать презентацию для спикера?Секреты презентации. Как сделать презентацию для спикера?
Секреты презентации. Как сделать презентацию для спикера?
Inspired presentation296.1K views
САМАЯ ЛУЧШАЯ ПРЕЗА by Vasily Bogdanov
САМАЯ ЛУЧШАЯ ПРЕЗАСАМАЯ ЛУЧШАЯ ПРЕЗА
САМАЯ ЛУЧШАЯ ПРЕЗА
Vasily Bogdanov230.7K views

Similar to JavaScript. Event Model (in russian)

Behat в PHP с использованием Behat и Mink by
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
7K views53 slides
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв) by
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Ontico
1.7K views60 slides
Профилирование и оптимизация jQuery–кода by
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаprivate_face
1.4K views60 slides
FPUG Dzyga presentation by
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentationIvan Filimonov
1K views40 slides
Профилирования и оптимизация jQuery-кода by
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаprivate_face
994 views59 slides
Take more from Jquery by
Take more from JqueryTake more from Jquery
Take more from JqueryMagento Dev
461 views26 slides

Similar to JavaScript. Event Model (in russian)(20)

Behat в PHP с использованием Behat и Mink by tyomo4ka
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka7K views
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв) by Ontico
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Ontico1.7K views
Профилирование и оптимизация jQuery–кода by private_face
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
private_face1.4K views
Профилирования и оптимизация jQuery-кода by private_face
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кода
private_face994 views
Take more from Jquery by Magento Dev
Take more from JqueryTake more from Jquery
Take more from Jquery
Magento Dev461 views
Как построить DOM by Roman Dvornov
Как построить DOMКак построить DOM
Как построить DOM
Roman Dvornov10.1K views
Человекопонятные отчёты by bearoff
Человекопонятные отчётыЧеловекопонятные отчёты
Человекопонятные отчёты
bearoff817 views
ES2015+: давно пора! by Vitebsk Miniq
ES2015+: давно пора!ES2015+: давно пора!
ES2015+: давно пора!
Vitebsk Miniq305 views
Общая архитектура Yii2 by Paul Klimov
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
Paul Klimov627 views
Михаил Давыдов "Масштабируемые JavaScript-приложения" by Yandex
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex852 views
Не JS во фронтенде by Nitive
Не JS во фронтендеНе JS во фронтенде
Не JS во фронтенде
Nitive506 views
Yii development by MageCloud
Yii developmentYii development
Yii development
MageCloud744 views
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020 by OdessaJS Conf
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
OdessaJS Conf115 views
Making Scalable JavaScript Application by Mikhail Davydov
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript Application
Mikhail Davydov1.3K views
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации... by Yandex
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
Yandex7.8K views
Easy authcache 2 кэширование для pro. Родионов Игорь by PVasili
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili535 views
Школа-Студия разработки приложений для iOS. 5 лекция. Разное by Глеб Тарасов
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное

More from Mikhail Davydov

Components now! (in russian) by
Components now! (in russian)Components now! (in russian)
Components now! (in russian)Mikhail Davydov
851 views63 slides
Code Style (in russian) by
Code Style (in russian)Code Style (in russian)
Code Style (in russian)Mikhail Davydov
561 views82 slides
Ajax and Transports (in russian) by
Ajax and Transports (in russian)Ajax and Transports (in russian)
Ajax and Transports (in russian)Mikhail Davydov
570 views31 slides
Introduction in Node.js (in russian) by
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Mikhail Davydov
1.5K views56 slides
JavaScript. Loops and functions (in russian) by
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)Mikhail Davydov
680 views59 slides
JavaScript. OOP (in russian) by
JavaScript. OOP (in russian)JavaScript. OOP (in russian)
JavaScript. OOP (in russian)Mikhail Davydov
727 views77 slides

More from Mikhail Davydov(15)

Ajax and Transports (in russian) by Mikhail Davydov
Ajax and Transports (in russian)Ajax and Transports (in russian)
Ajax and Transports (in russian)
Mikhail Davydov570 views
Introduction in Node.js (in russian) by Mikhail Davydov
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
Mikhail Davydov1.5K views
JavaScript. Loops and functions (in russian) by Mikhail Davydov
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
Mikhail Davydov680 views
JavaScript. Event Loop and Timers (in russian) by Mikhail Davydov
JavaScript. Event Loop and Timers (in russian)JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)
Mikhail Davydov1.5K views
Modules and assembling of JavaScript (in russian) by Mikhail Davydov
Modules and assembling of JavaScript (in russian)Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)
Mikhail Davydov966 views
JavaScript. Introduction (in russian) by Mikhail Davydov
JavaScript. Introduction (in russian)JavaScript. Introduction (in russian)
JavaScript. Introduction (in russian)
Mikhail Davydov499 views
JavaScript on frontend and backend (in Russian by Mikhail Davydov
JavaScript on frontend and backend (in RussianJavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in Russian
Mikhail Davydov764 views
Dump-IT Загрузка и инициализация JavaScript by Mikhail Davydov
Dump-IT Загрузка и инициализация JavaScriptDump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov730 views
Dart - светлая сторона силы? by Mikhail Davydov
Dart - светлая сторона силы?Dart - светлая сторона силы?
Dart - светлая сторона силы?
Mikhail Davydov599 views

JavaScript. Event Model (in russian)