Хорошо. Я займусь этим.
Существует несколько основных причин использования излучателей событий.
Одна из основных причин заключается в том, что браузер, в котором родился JavaScript, иногда заставляет вас. Независимо от того, подключаете ли вы свои события прямо в свой HTML, используя jQuery или какую-либо другую инфраструктуру/библиотеку или что-то еще, базовый код по-прежнему в основном тот же (erm, в основном ...)
Итак, сначала, если вы хотите реагировать на клавиатуре или мыши событие, как вы упомянули, вы могли бы просто трудно связать непосредственно обработчик события (обратный вызов), как это:
<div onclick="myFunc(this)">Click me</div>
... или вы могли бы сделать то же самое в JS с помощью DOM ссылка:
document.getElementById('my_element').onclick = function (evt) {
alert('You clicked me');
};
Это был основной способ, которым мы подключили u p кликов. Одним из смертельных недостатков этого шаблона является то, что вы можете присоединить только один обратный вызов к каждому событию DOM. Если вы хотите иметь второй обратный вызов, который реагировал на одно и то же событие, вам нужно либо объединить его в существующий обработчик кликов, либо создать функцию делегата для обработки задания вызова двух функций. Кроме того, ваш эмитент событий в конечном итоге тесно связан с прослушивателем событий, и это, как правило, плохо.
Поскольку приложения стали более сложными, имеет смысл использовать прослушиватели событий. производители браузеров (в конечном счете) поселились на одном пути, чтобы сделать это:
// Build the handler
var myHandler = function (evt) {
alert('You clicked me too');
window.myHandlerRef = this; // Watch out! See below.
};
// Bind the handler to the DOM event
document.getElementById('my_element').addEventListener('click', myHandler);
Преимущество этой модели в том, что вы можете прикрепить несколько обработчиков для одного события DOM, или вызвать один единственный обработчик события из нескольких различных событий DOM , Недостаток заключается в том, что вы должны быть осторожны, чтобы не просачиваться: в зависимости от того, как вы их пишете, закрытие событий (например, myHandler
выше) может продолжаться и после того, как элемент DOM, к которому они были прикреплены, был уничтожен и GCed. Это означает, что всегда полезно делать removeEventListener('click', myHandler)
. (В некоторых библиотеках есть метод off()
, который делает то же самое).
Эта модель хорошо работает для событий клавиатуры, а также:
var giveUserAHeadache = function (evt) {
alert('Annoying, isn\'t it?');
};
document.addEventListener('keypress', giveUserAHeadache);
Хорошо.Так вы обычно обрабатываете собственные события браузера. Но разработчикам также нравится использовать этот шаблон делегирования событий в своем собственном коде. Причина, по которой вы захотите сделать это, - это максимально возможное разделение кода.
Например, в пользовательском интерфейсе вы можете запускать событие каждый раз, когда браузер пользователя переходит в автономный режим (например, вы можете посмотреть navigator.onLine
). Возможно, у вас может быть зеленая/красная лампа на заголовке вашей страницы, чтобы показать онлайн-состояние, и, возможно, вы можете отключить все кнопки отправки в автономном режиме и, возможно, также показывать предупреждающее сообщение в нижнем колонтитуле страницы. С помощью прослушивателей/излучателей событий вы можете записать все эти файлы как полностью развязанные модули, и они все равно могут работать в режиме блокировки. И если вам нужно реорганизовать свой пользовательский интерфейс, вы можете удалить один компонент (например, лампу), заменить его чем-то другим, не беспокоясь о том, чтобы вставить логику в какой-то другой модуль.
В качестве другого примера, в приложении Node вы можете захотеть, чтобы ваш код базы данных выдавал условие ошибки конкретному контроллеру, а также регистрировал ошибку - и, возможно, отправил электронное письмо. Вы можете видеть, как эти вещи могут быть добавлены итеративно. С прослушивателями событий это легко сделать.
Вы можете написать свой собственный или использовать любой шаблон, доступный в вашей конкретной среде. У jQuery, Angular, Ember и Node есть свои особые методы, но вы также можете создавать свои собственные, что я и хотел бы предложить вам попробовать.
Это все варианты одной и той же базовой идеи, и есть много размытия над точным определением или самой правильной реализацией (на самом деле, некоторые могут задаться вопросом, если они вообще разные). Но вот основные виновники:
- Observer
- Pub-Sub
- Mediator
код вы упомянули на сервере, в то время как то, что вы ищете находится на стороне клиента. На стороне клиента вы можете захватывать такие события, а затем вызывать сервер для обработки этих событий. Я уверен, что вы слышали о Javascript Front-side и популярном JQuery. – Ravi
№. мы не делаем клика и превращаемся в строку –