Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
Masayuki Nakano
PDF, PPTX
6,920 views
GeckoのDOMイベント処理の実装
DOMイベントと、その発火のGeckoにおける実装の解説。
Technology
◦
Read more
15
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 65
2
/ 65
3
/ 65
4
/ 65
5
/ 65
6
/ 65
7
/ 65
8
/ 65
9
/ 65
10
/ 65
11
/ 65
12
/ 65
13
/ 65
14
/ 65
15
/ 65
16
/ 65
17
/ 65
18
/ 65
19
/ 65
20
/ 65
21
/ 65
22
/ 65
23
/ 65
24
/ 65
25
/ 65
26
/ 65
27
/ 65
28
/ 65
29
/ 65
30
/ 65
31
/ 65
32
/ 65
33
/ 65
34
/ 65
35
/ 65
36
/ 65
37
/ 65
38
/ 65
39
/ 65
40
/ 65
41
/ 65
42
/ 65
43
/ 65
44
/ 65
45
/ 65
46
/ 65
47
/ 65
48
/ 65
49
/ 65
50
/ 65
51
/ 65
52
/ 65
53
/ 65
54
/ 65
55
/ 65
56
/ 65
57
/ 65
58
/ 65
59
/ 65
60
/ 65
61
/ 65
62
/ 65
63
/ 65
64
/ 65
65
/ 65
More Related Content
PDF
Storytelling For The Web: Integrate Storytelling in your Design Process
by
Chiara Aliotta
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
by
Search Engine Journal
PPTX
GeckoのDOMイベント処理の実装 (Gecko Inside ver.)
by
Masayuki Nakano
PDF
DOMイベントの基礎から深淵まで
by
Masayuki Nakano
PDF
0621 ndk game
by
cat kaotaro
PDF
【ツクールMV】ゲーム開始~Scene_Title呼び出しまでの流れ(一人輪読会)
by
りんね ぐりっど
PDF
Firefox/Geckoの開発環境 —20年続いているOSSプロジェクトの現在—
by
Masayuki Nakano
PDF
マウスホイールイベント処理マニアックス
by
Masayuki Nakano
Storytelling For The Web: Integrate Storytelling in your Design Process
by
Chiara Aliotta
2024 Trend Updates: What Really Works In SEO & Content Marketing
by
Search Engine Journal
GeckoのDOMイベント処理の実装 (Gecko Inside ver.)
by
Masayuki Nakano
DOMイベントの基礎から深淵まで
by
Masayuki Nakano
0621 ndk game
by
cat kaotaro
【ツクールMV】ゲーム開始~Scene_Title呼び出しまでの流れ(一人輪読会)
by
りんね ぐりっど
Firefox/Geckoの開発環境 —20年続いているOSSプロジェクトの現在—
by
Masayuki Nakano
マウスホイールイベント処理マニアックス
by
Masayuki Nakano
Featured
PDF
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
by
OECD Directorate for Financial and Enterprise Affairs
PDF
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
by
SocialHRCamp
PDF
2024 State of Marketing Report – by Hubspot
by
Marius Sescu
PDF
Everything You Need To Know About ChatGPT
by
Expeed Software
PDF
Product Design Trends in 2024 | Teenage Engineerings
by
Pixeldarts
PDF
How Race, Age and Gender Shape Attitudes Towards Mental Health
by
ThinkNow
PDF
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
by
marketingartwork
PDF
Skeleton Culture Code
by
Skeleton Technologies
PDF
PEPSICO Presentation to CAGNY Conference Feb 2024
by
Neil Kimberley
PDF
Content Methodology: A Best Practices Report (Webinar)
by
contently
PPTX
How to Prepare For a Successful Job Search for 2024
by
Albert Qian
PDF
Social Media Marketing Trends 2024 // The Global Indie Insights
by
Kurio // The Social Media Age(ncy)
PDF
Trends In Paid Search: Navigating The Digital Landscape In 2024
by
Search Engine Journal
PDF
5 Public speaking tips from TED - Visualized summary
by
SpeakerHub
PDF
ChatGPT and the Future of Work - Clark Boyd
by
Clark Boyd
PDF
Getting into the tech field. what next
by
Tessa Mero
PDF
Google's Just Not That Into You: Understanding Core Updates & Search Intent
by
Lily Ray
PDF
How to have difficult conversations
by
Rajiv Jayarajah, MAppComm, ACC
PDF
Introduction to Data Science
by
Christy Abraham Joy
PDF
Time Management & Productivity - Best Practices
by
Vit Horky
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
by
OECD Directorate for Financial and Enterprise Affairs
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
by
SocialHRCamp
2024 State of Marketing Report – by Hubspot
by
Marius Sescu
Everything You Need To Know About ChatGPT
by
Expeed Software
Product Design Trends in 2024 | Teenage Engineerings
by
Pixeldarts
How Race, Age and Gender Shape Attitudes Towards Mental Health
by
ThinkNow
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
by
marketingartwork
Skeleton Culture Code
by
Skeleton Technologies
PEPSICO Presentation to CAGNY Conference Feb 2024
by
Neil Kimberley
Content Methodology: A Best Practices Report (Webinar)
by
contently
How to Prepare For a Successful Job Search for 2024
by
Albert Qian
Social Media Marketing Trends 2024 // The Global Indie Insights
by
Kurio // The Social Media Age(ncy)
Trends In Paid Search: Navigating The Digital Landscape In 2024
by
Search Engine Journal
5 Public speaking tips from TED - Visualized summary
by
SpeakerHub
ChatGPT and the Future of Work - Clark Boyd
by
Clark Boyd
Getting into the tech field. what next
by
Tessa Mero
Google's Just Not That Into You: Understanding Core Updates & Search Intent
by
Lily Ray
How to have difficult conversations
by
Rajiv Jayarajah, MAppComm, ACC
Introduction to Data Science
by
Christy Abraham Joy
Time Management & Productivity - Best Practices
by
Vit Horky
GeckoのDOMイベント処理の実装
2.
Text GeckoのDOMイベント処理の実装
3.
中野雅之 •肩書き •正式:
Mozilla Japan 国際化担当マネージャ •非公式: Mozilla Japan 大阪支部長 •大阪の自宅で、自宅警備しながら仕事してます
4.
中野雅之 •色んなアカウント •メールアドレス:
masayuki@d-toybox.com •Skype: masayuki-nakano •Twitter: @d_toybox •Blog: 「もずはっく日記」で検索
5.
アジェンダ •DOMイベントの基礎知識 •Geckoのイベント処理の実装
•パフォーマンスを悪くしないためのヒント
6.
DOM イベントの基礎 •フェイズと、プロパゲーション
•イベントを捕まえる •イベントの伝播を抑制する •ブラウザのイベント処理を妨害する
7.
capturing フェイズ •最初は
window •次に document •root から target の親 •target の決定は、イ ベント依存 •フォーカス •発生位置 •……等々
8.
target フェイズ •target
フェイズは、 capturing フェイズの 一部でもあり、 bubbling フェイズの 一部でもある。 •window や document が target の場合も
9.
bubbling フェイズ •target
の親から root •次に document •最後に window •Event.bubbles が false の場合、 bubbling は発生しな い
10.
イベントを捕まえる •書式: •EventTarget.addEventListener(
イベント名, ハンドラ, Capture?); •EventTarget.removeEventListener( イベント名, ハンドラ, Capture?); •イベント名: イベントの名前 "click" とか、 "keydown" •ハンドラ: function foo(aEvent) { /* something */ } がお手軽で十分 •Capture?: true なら、capturing フェイズと、target フェイズ、false なら、target フェイズと、bubbling フェイズ
11.
イベントを捕まえる •単純な例1: •全ての要素で発生するkeydownイベントを知りたい
•イベントターゲットより先に知りたい •removeする必要はない document.addEventListener("keydown", function (aEvent) { /* something */ }, true);
12.
イベントを捕まえる •単純な例2: •全ての要素で発生するkeydownイベントを知りたい
•イベントターゲットより後に知りたい •removeする必要がある function keydownHandler(aEvent) { /* something */ } document.addEventListener("keydown", keydownHandler, false); … document.removeEventListener("keydown", keydownHandler, false);
13.
イベントの伝播を抑制する •複数のイベントリスナを登録している場合、あるイベント ハンドラで処理済みのイベントを他のイベントハンドラで
は無視したい場合が考えられる •Event.stopPropagation() か、 Event.stopImmediatePropagation() を呼ぶと、それ以 降のイベント発生を中止できる •Event.stopPropagation() では、次の EventTarget 以 降でのイベントハンドラの実行を中止できる •Event.stopImmediatePropagation() では、同じ EventTarget に登録されている未処理のイベントハンド ラも含めて、イベントハンドラの実行を中止できる
14.
ブラウザのイベント処理を妨害する •ブラウザにデフォルトの動作(default action)を実行して
もらいたくない場合が考えられる •Event.preventDefault()を呼び出すと、 Event.defaultPrevented属性値がtrueになる •defaultPrevented属性がtrueなら、ブラウザは default action を実行しない(ただし、タブの切替等、 セキュリティ上、無視することはある) •Web アプリは Event.defaultPrevented の値を、処理 前に確認することで、Event.stopPropagation()の代 用としても使える
15.
Geckoのイベント処理の実装 •OS ネイティブなイベントを
DOM イベントとして Web アプリに通知するケースを解説 •図にすると、次のように……
16.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
17.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
18.
EventListenerManager •イベントターゲットで、最初にイベントリスナが登録さ れた時に、インスタンスが生成され、そのノードに保存
される •そのノードに登録された全てのイベントリスナを管理 する •HandleEvent() が呼び出されると、イベントの名前と フェーズ、イベントリスナのグループがマッチするもの を探し、マッチした場合に登録されているハンドラを実 行する •stopImmediatePropagation() が呼び出されたら、中 断する
19.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
20.
モジュール間の処理の流れの例 1.widget/ は、各
OS のネイティブイベントをハンドリ ングするモジュール。ネイティブイベントが発生した ら、内部イベントである、Widget*Event クラスのイ ンスタンスをスタックに作成し、その値を設定する 2.PresShell にイベントを送信、PresShell が target を決定する
21.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
22.
モジュール間の処理の流れの例 3.EventStateManager::PreHandleEvent() が前処
理を行う •詳しくは後ほど
23.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
24.
モジュール間の処理の流れの例 4.PresShell が
EventDispatcher::Dispatch() を呼び 出す 5.EventDispatcher::CreateEvent() で Widget*Event のクラスに対応した、dom::*Event クラスを選択し、そのインスタンスをヒープに作成す る 6.EventListenerManager を列挙した配列を用意し、 EventTargetChainItem::HandleEventTargetChain()を 呼び出す
25.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
26.
モジュール間の処理の流れ 7.EventTargetChainItem::HandleEventTargetChain() で、
受け取った、各 EventListenerManager の HandleEvent() を実行していく 8.EventListenerManager::HandleEvent() は、その ノードに登録されたイベントリスナを順に実行してい く 9.EventTargetChainItem::HandleEventTargetChain() が自身をもう一度呼び出し、デフォルトア クションの実行のため、System Event Group に登 録されたリスナを実行する。
27.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
28.
モジュール間の処理の流れ 10.EventStateManager::PostHandleEvent() で、デフォルト
アクションを実行したり、関連するイベントを生成したりする
29.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
30.
Widget*Event、Internal*Event •WidgetEvent クラスが全てのイベントクラスの基底ク
ラス •WidgetMouseEvent や、InternalFocusEvent といっ た派生クラスが、イベントごとに定義・実装されている •各クラスは、ほぼ構造体であり、メンバのカプセル化 はほとんど行われず、メンバにダイレクトにアクセスす る (読み書き問わず) •widget から生成されるイベントは、Widget*Event、そ れ以外の場合は、DOM イベントのデータを保存する ためだけのものは、Internal*Event と命名されている
31.
Widget*Event、Internal*Event •widget/ •widget/BasicEvents.h
•widget/ContentEvents.h •widget/MiscEvents.h •widget/MouseEvents.h •widget/TextEvents.h •widget/TouchEvents.h •dom/events/ •dom/events/InternalMutationEvent.h
32.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
33.
PresShell •PresShell は、
Presentation Shell の略で、 nsPresShell.cpp で実装され、 nsIPresShell.h で定 義されている nsIPresShell インターフェースを持つ •ドキュメントに対し、一つ生成される (正確なところは 不明) •イベントの複雑な処理は EventStateManager、表示 に関わる部分は nsPresContext に分離されている •イベント処理では widget で生成されたイベントを受け 取り、target の決定と、発火処理を行う •PresShell::HandleEvent() や、関連メソッドを参照
34.
EventStateManager::PreHandleEvent() •PresShell がイベントを発火する直前に呼び出す
•マウスの操作によって変化する hover や、active とい った要素の状態設定を行う •マウスのクリックカウント等、状態の保存や、その値の Widget*Event のメンバへの書き出しを行う •ホイールの速度等、設定でカスタマイズできる項目を、 Widget*Event のメンバの値を書き換えることで実現 してる
35.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
36.
EventDispatcher::CreateEvent() •Widget*Event クラスのインスタンスや、
Internal*Event クラスのインスタンスから、DOM イベ ントの実装クラスを選択し、インスタンスを生成する •Javascript の document.createEvent() の実装でも ある •EventListenerManager::HandleEventInternal() が 最初のイベントリスナを見つけた時点で呼び出される
37.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
38.
dom::Event •DOM イベントの実装クラスは、名前空間
“mozilla::dom“ に、標準仕様と同じ名前で定義 •dom::KeyboardEvent、dom::WheelEvent 等 •nsIDOMEvent インターフェースを必ず継承している •dom::Event は、WidgetEvent へのポインタを持ち、 イベントの属性値はここに保存している •DOM イベントクラスは、Widget*Event や Internal*Event へ、DOM からアクセスするためのラ ッパクラス
39.
dom::Event •古くから実装されている DOM
イベントクラスは、固有 の、nsIDOM*Event インターフェースも継承している •新規作成時にはほとんど定義されない •データにアクセスするだけなら、内部イベントクラス にアクセスする方が高速で、実装も単純化される •nsIDOM*Event のメソッドは全て、virtual call にな るためパフォーマンスが悪い
40.
dom::Event •内部イベントクラスを定義・実装する必要が無い、シン プルなイベントを実装する際は、webidlで定義したイ
ベントから、実装コードを自動生成することも可能 •自動生成の定義は dom/webidl/moz.build で定義 •dom/bindings/Codegen.py によって、ビルド時に cpp ファイルが自動的に生成される
41.
dom::Event •実装例 •dom/events/
•dom/events/Event.cpp •dom/events/UIEvent.cpp •dom/events/WheelEvent.cpp •content/svg/content/src/ •content/svg/content/src/SVGZoomEvent.cpp
42.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
43.
EventDispatcher::Dispatch() •PresShell から呼び出される
•最初に、 target の PreHandleEvent() を実行する •window から target ノードまで辿り、作成されている全 ての EventListenerManager を列挙し、配列に格納 •EventTargetChainItem::HandleEventTargetChain() にその配列を渡す •その後、 target の PostHandleEvent() を実行する •発火が終了しても、DOM イベントが JS の変数等か ら参照されている場合、内部イベントをヒープにコピ ーする •発火処理後、スタックにある内部イベントは破棄さ れるため
44.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
45.
EventTargetChainItem::HandleEventTargetChain() •EventDispatcher::Dispatch() に呼び出される
•列挙されている、window から target の親ノードまで の EventListenerManager の、HandleEvent() を実 行していく (capturing フェーズ) •Event.stopPropagation() が HandleEvent() 実行 中に呼び出されていたら、ループを中断する
46.
EventTargetChainItem::HandleEventTargetChain() •次に、target の
EventListenerManager の HandleEvent() を呼び出す (target フェーズ) •Event.stopPropagation() か、 Event.stopImmediatePropagation() が既に呼び出 されていた場合、実行しない •Event.stopPropagation()が HandleEvent() 実行中 に呼び出されていたら、ループを中断する
47.
EventTargetChainItem::HandleEventTargetChain() •次に、列挙された、target の親から、
window までの EventListenerManager の、HandleEvent() を実行し ていく (bubbling フェーズ) •Event.bubbles が false なら実行しない •Event.stopPropagation() か、 Event.stopImmediatePropagation() が既に呼び出 されていた場合、実行しない •Event.stopPropagation() が HandleEvent() 実行 中に呼び出されていたら、ループを中断する
48.
EventTargetChainItem::HandleEventTargetChain() •次に、イベントターゲットが生成した、CSS box
を実装 している、nsIFrame::HandleEvent() を呼び出す • PresShell が EventDispatcher::Dispatch() に渡し た callback クラス経由で呼び出し •default action の実装に利用可能
49.
EventTargetChainItem::HandleEventTargetChain() •最後に、System Event
Group のイベントリスナが登録 されている場合、capturing、target、bubbling フェーズ を再度、処理する •通常の Web コンテンツからは登録不可 •Web コンテンツに Event.stopPropagation() 等を呼 び出されていても実行される •default action の実装に利用可能 •System Event Group 内のリスナで、 stopPropagation() 等を呼ぶと中断される
50.
Geckoのイベント処理の実装 nsDocument PresShell
widget EventDispatcher EventStateManager Widget*Event dom::*Event PreHandleEvent() PostHandleEvent() Dispatch() CreateEvent() 2 3 4 5 6 EventTargetChainItem nsINode EventListenerManager HandleEvent() handler2 handler1 nsINode EventListenerManager HandleEvent() handler2 handler1 7 8 10 1 9
51.
EventStateManager::PostHandleEvent() •PresShell が最後に呼び出す
•イベントの後処理や、default action を実行 •マウスホイールによるスクロール処理やズーム処理 •mouseup から click イベントや、dblclick イベントの 生成 •mousemove から、 mouseover、mouseout、 mouseenter、mouseleave イベントの生成
52.
パフォーマンスを悪くしないためのヒント •イベントリスナを必要以上に登録しない •登録するノードが増える程、EventListenerManager
のインスタンスの数が増える •登録するハンドラが増える程、全てのイベントの発生時 に、マッチするイベントを探すループの処理回数が増え る •stopPropagation()や、stopImmediatePropagation() を効果的に利用するとループを中断させることができる
53.
パフォーマンスを悪くしないためのヒント •発火回数が多いイベントや、発火のコストが高いイベント はリスナを登録しないようにする
•EventListenerManager と、nsDocument は、一部の イベントリスナが登録されたかどうかをフラグで保存し ており、これらが false の場合、イベントそのものを発 火しないようにしている •各フラグは、RemoveEventListener() でリセットされな い。これは、RemoveEventListener() のパフォーマン スを悪くしないため •発生コストが高いイベントは、一度登録したが最後、 document が unload されるまで、その document では発生し続ける
54.
パフォーマンスを悪くしないためのヒント •mMayHaveCapturingListeners •全てのイベントリスナが、bubbling
フェーズのイベント のリスナであれば、false •これが false なら、capturing フェーズのループは丸ご とスキップされる •target フェーズのイベントは、bubbling フェーズのイベ ントリスナで取得できるので、target フェーズでイベント を処理したい場合は、bubbling フェーズとして登録す る方が良い
55.
パフォーマンスを悪くしないためのヒント •mMayHavePaintEventListener •“MozAfterPaint”
•描画する度に発生するので、発生回数が莫大
56.
パフォーマンスを悪くしないためのヒント •mMayHaveMutationListeners •“DOMAttrModified”
•“DOMCharacterDataModified” •“DOMNodeInserted” •“DOMNodeInserted” •“DOMNodeInsertedIntoDocument” •“DOMNodeRemovedFromDocument” •“DOMSubtreeModified” •MutationObserver を利用するべき
57.
パフォーマンスを悪くしないためのヒント •mMayHavePointerEnterLeaveEventListener •“pointerdown”
•“pointermove” •“pointerup” •“pointercancel” •“pointerover” •“pointerout” •“pointerenter” •“pointerleave” •“gotpointercapture” •“lostpointercapture”
58.
パフォーマンスを悪くしないためのヒント •mMayHaveTouchEventListener •“touchstart”
•“touchend” •“touchmove” •“touchcancel” •タッチデバイスを直接サポートする場合はやむを 得ない •利用しても他ほどパフォーマンスは落ちない(は ず)
59.
パフォーマンスを悪くしないためのヒント •mMayHaveMouseEnterLeaveEventListener •“mouseenter”
•“mouseleave” •“mouseover” や “mouseout” 発生時に、祖先要 素全てで発生すべきか確認する必要があり、多 数の要素上で、同時にイベントが発生する可能性 もある •“mouseover” や ”mouseout” で代用可能か、 熟慮した上で判断を
60.
パフォーマンスを悪くしないためのヒント •他にも細かい、イベント単位での最適化があるので、 EventListenerManager::AddEventListenerInternal()のコー
ドを参照
61.
パフォーマンスを悪くしないためのヒント •極端な話をすると、 •全てのイベントリスナを
window に登録 •bubbling フェーズで登録 •Event.target を自前で確認 •Event.stopImmediatePropagation()で伝播を中断 •こうすると、イベントリスナを呼び出すコストは最小限に 抑えられる •もちろん、綺麗なコードになるわけではないので、やら ない方が良い
62.
パフォーマンスを悪くしないためのヒント 最適化はほどほどに!
63.
パフォーマンスを悪くしないためのヒント 読みやすいコードで、 バグの少ないアプリを!
64.
知っておいた方が良い用語・略語 •D3E •DOM
Level 3 Events •ESM •EventStateManager •dispatch、fire •(イベントを)発火する •consumed •preventDefault() が呼び出され、default action がキ ャンセルされている状態
65.
その他の資料 •DOM Level
3 Events 仕様書 (Working Draft) •Event developer guide (MDN) •Adding a new event (MDN) •dom/events (mxr)
Download