2011-04-22 6 views
10

특히 Spidermonkey입니다.JavaScript 내에서 이벤트 처리는 내부적으로 어떻게 작동합니까?

당신이 함수를 작성하고 그것을 처리하기 위해 이벤트에 첨부하는 것을 알고 있습니다.

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는 오픈 소스입니다. 물론 ... [browse] (http://mxr.mozilla.org/mozilla/source/js/src/) ... –

+0

@TJ, Spidermonkey is JS 엔진 만 있으면 DOM의 이벤트 중심 특성이 구현됩니다. –

+0

호기심에서이 지식을 어떻게 사용할 수있을 것으로 기대하십니까? 즉,이 신비에 대한 해답이 해결책에 대한 귀하의 접근 방법을 안내해 줄 수 있도록 당신이하고 싶은 것이 있습니까? – Pointy

답변

6

의 SpiderMonkey 자체가 이벤트 처리와 관련된 아무것도하지 않습니다. 이벤트는 순전히 DOM입니다.

클릭 이벤트는 SpiderMonkey 자체가 아니라 브라우저 코드 (SpiderMonkey가 포함 된 것)에 의해 실행됩니다. 클릭과 같은 항목을 파견하는 코드는 http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/content/events/src/nsEventStateManager.cpp을 참조하십시오.

브라우저는 onclick 속성에 대한 할당을 가져 와서 이벤트 리스너 등록으로 바꾸는 설정 메소드를 정의합니다. nsEventReceiverSH::SetProperty에서 호출되는 http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/dom/base/nsDOMClassInfo.cpp#l7624을보고 IsEventName 테스트를 통과 한 이름 (이 코드의 id)을 처리합니다.

이벤트 리스너가 등록되고 이벤트가 발생하면 이벤트 디스패처는 리스너에 대한 호출을 관리합니다. 당신이 발견 한 nsJSEventListener 링크는 C++ HandleEvent 호출을 JS 함수 호출로 변환하는 접착제입니다.

그래서 여러분은 청취자를위한 일종의 등록/등록 취소 메커니즘을 원합니다. 그러면 구현은 이벤트를 발생시키고 청취자에게 전달합니다. 이 마지막 부분은 어떻게하면 자유롭게 끝낼 수 있습니다. Gecko 구현은 DOM 이벤트 사양을 구현해야하기 때문에 많은 제약이 있지만 훨씬 간단하게 처리 할 수 ​​있어야합니다.

+1

당신은 천재입니다 –

+3

Nah, 그냥 Gecko 내부 작업을합니다. –

2
  1. HTML은 싱크/거품 이벤트 전파 스키마를 사용 http://catcode.com/domcontent/events/capture.html
  2. 있다 "물리적"이벤트 (마우스, 키보드)와 논리/합성 사람 (초점, value_changed 등을 클릭)
  3. 온 클릭은 논리적 이벤트 - 마우스, 터치 및/또는 키보드 이벤트의 결과로 생성됩니다.
  4. 마우스 (또는 손가락 터치) 발신 클릭 이벤트는 마우스 작동 중지, 이동 및 작동 이벤트의 결과입니다. 마우스를 아래로 움직이고 위로 움직이는 것은 침몰/버블 링 이벤트입니다. 이러한 "기본 이벤트"의 대상 요소는 클릭 이벤트의 대상 (또는 소스)이됩니다. 마우스 다운/업 이벤트의 타겟이 다르면 (DOM 요소) 공통적 인 상위 요소가 사용됩니다.
  5. 마우스를 아래로 움직이고 위로 움직이는 순서로 클릭, 스 와이프/스크롤 등 다양한 논리적 이벤트가 생성 될 수 있습니다.

저는 이것이 기본 개념의 전체 목록이라고 생각합니다.