Как работает обработка событий внутри JavaScript? - PullRequest
12 голосов
/ 22 апреля 2011

В частности Spidermonkey .

Я знаю, что вы пишете функции и прикрепляете их к событиям для их обработки.

Где определен обработчик onClick и как движок JS узнает, что он запускает onClick события, когда пользователь нажимает кнопку?

Любые ключевые слова, шаблоны дизайна, ссылки и т. Д. Приветствуются.

UPDATE

Сводные ссылки, которые я считаю полезными здесь:

http://www.w3.org/TR/DOM-Level-2-Events/events.html

https://github.com/joyent/node/blob/master/src/node_events.cc

http://mxr.mozilla.org/mozilla/source/dom/src/events/nsJSEventListener.cpp

Ответы [ 2 ]

9 голосов
/ 22 апреля 2011

Сам SpiderMonkey не имеет ничего, связанного с обработкой событий.События - это просто вещь DOM.

Событие click запускается кодом браузера (который встраивает SpiderMonkey), а не самим SpiderMonkey.См. http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/content/events/src/nsEventStateManager.cpp для кода, который отвечает за отправку таких вещей, как щелчок.

Браузер также определяет методы установки, которые принимают назначение свойству onclick и превращают его в регистрацию прослушивателя событий.,См. http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/dom/base/nsDOMClassInfo.cpp#l7624, который вызывается из nsEventReceiverSH::SetProperty и обрабатывает свойства, имя которых (id в этом коде) проходит тест IsEventName.

Когда регистрируются прослушиватели событий и происходит событиедиспетчер событий управляет вызовами слушателей;ссылка nsJSEventListener, которую вы нашли, является связующим звеном, который преобразует вызов C ++ HandleEvent в вызов функции JS.

Итак, в вашем случае вам нужен какой-то механизм регистрации / отмены регистрации для слушателей, а затемваша реализация будет запускать события и отправлять их слушателям.То, как вы делаете эту последнюю часть, довольно открыто;Реализация Gecko имеет множество ограничений из-за необходимости реализации спецификации DOM Events, но вы должны быть в состоянии сделать что-то гораздо более простое.

4 голосов
/ 22 апреля 2011
  1. HTML использует схему распространения событий приемника / пузыря: http://catcode.com/domcontent/events/capture.html
  2. Существуют "физические" события (мышь, клавиатура) и логические / синтезированные (фокус, щелчок, значение, измененное и т. Д.)
  3. onClick - это логическое событие, генерируемое в результате событий мыши, касания и / или клавиатуры.
  4. Событие щелчка мыши (или касания пальцем) является результатом событий нажатия, перемещения и подъема мыши. Обратите внимание, что нажатие мыши, перемещение и вверх - это события, связанные с погружением / пузырением. Целевой элемент (элементы) в этих «первичных» событиях будет целью (или источником) события click. Если события mouse-down / up имеют разные цели (элемент DOM), то используется их общий родительский элемент.
  5. Последовательность событий мыши, перемещения и перемещения может вызывать различные логические события: щелчок, пролистывание / прокрутка и т. Д.

Я считаю, что это полный список основных понятий.

...