2011-04-22 22 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是開源的,當然,你總是可以... [瀏覽](http://mxr.mozilla.org/mozilla/source/js/src/)... – 2011-04-22 18:04:07

+0

@TJ,Spidermonkey是隻是一個JS引擎,DOM的事件驅動性質就是在它之上實現的。 – 2011-04-22 18:07:24

+0

出於好奇,您如何期望能夠使用這些知識?換句話說,你有沒有想做的事情,這個謎題的答案會引導你的解決方案? – Pointy 2011-04-22 18:08:07

回答

6

SpiderMonkey的本身並沒有任何涉及事件處理。事件純粹是一個DOM事物。

點擊事件由瀏覽器代碼(嵌入SpiderMonkey的東西)觸發,而不是由SpiderMonkey本身觸發。請參閱http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/content/events/src/nsEventStateManager.cpp瞭解負責分派點擊等內容的代碼。

瀏覽器還定義了setter方法,它將onclick屬性賦值並將其轉換爲事件偵聽器註冊。請參閱從nsEventReceiverSH::SetProperty調用的http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/dom/base/nsDOMClassInfo.cpp#l7624,並處理其名稱(此代碼中的id)通過IsEventName測試的屬性。

當事件監聽器被註冊並且事件被觸發時,事件調度器管理對監聽器的調用;您發現的nsJSEventListener鏈接是將C++ HandleEvent調用轉換爲對JS函數的調用的粘合劑。

所以在你的情況下,你需要某種註冊/註銷機制的監聽,然後你的實現將觸發事件並將它們發送給監聽器。你如何做這最後一部分是非常開放的;由於需要實現DOM Events規範,Gecko實現有很多限制,但是您應該可以做更簡單的事情。

+1

你是一個天才 – 2011-04-22 18:57:35

+3

不,我只是在Gecko內部工作。 – 2011-04-22 20:25:25

2
  1. HTML使用散熱器/氣泡事件傳播模式:http://catcode.com/domcontent/events/capture.html
  2. 有 「物理」 事件(鼠標,鍵盤)和邏輯/合成酮(聚焦,點擊,value_changed等)
  3. 的onClick是一個邏輯事件 - 由於鼠標,觸摸和/或鍵盤事件而產生。
  4. 鼠標(或手指觸摸)發起的點擊事件是鼠標向下,移動和向上事件的結果。請注意,鼠標向下,移動和向上是下沉/冒泡事件。這些「原始」事件中的目標元素將成爲點擊事件的目標(或來源)。如果鼠標向下/向上事件具有不同的目標(DOM元素),則使用它們的公共父項。
  5. 鼠標向下,移動和向上事件的順序可能產生不同的邏輯事件:點擊,滑動/滾動等。

我相信這是一個基本概念的完整列表。