Как обработка событий работает внутри JavaScript?

В частности 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

Ответ 1

Сам 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 - это клей, который преобразует вызов С++ HandleEvent в вызов функции JS.

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

Ответ 2

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

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