SlideShare a Scribd company logo
1 of 50
Download to read offline
Text

DOMイベントの基礎から深淵まで
中野雅之

• 肩書き

• 正式:   Mozilla Japan 国際化担当マネージャ

• 半公式:   Mozilla Japan ジョギング部大阪支部長

• 非公式:   Mozilla Japan 大阪支部長

 • 大阪の自宅で、自宅警備しながら仕事してます
中野雅之
• 色んなアカウント

• メールアドレス:         masayuki@d-toybox.com

• Skype:     masayuki-nakano

• Twitter:   @d_toybox

• Facebook:     masayuki.nakano.560

• Blog:   「もずはっく日記」で検索
アジェンダ


• DOM   イベントの仕様って?

• DOM   イベント処理の基礎

• DOM   Level 4でのイベント生成

• 各入力イベントのふかーーーーーーいお話
DOM イベントの仕様



• HTMLの特定の要素・状況で起きるようなイベント

• HTML5仕様書の各要素のページにあります

 • これは今日は扱いません
DOM イベントの仕様
•   ユーザの入力や、他の仕様に左右されないイベント

    •   Document Object Model (DOM) Level 2 Events Specification

        •   W3C Recommendation 13 November, 2000

    •   Document Object Model (DOM) Level 3 Events Specification

        •   W3C Editor's Draft 04 September 2012

    •   DOM4 Events

        •   Unofficial Draft
DOM イベント処理の基礎
• フェイズと、プロパゲーション

• addEventListener()と、removeEventListener()

• 複数のイベントリスナ

• stopPropagation()と、preventDefault()

• trustedイベントと、untrustedイベント

• init*Event()

• event   constructor
フェイズとプロパゲーション
• DOM   イベントには4つの状態がある

     フェイズ: イベントが、イベントターゲットに向け
• Capture
 てルートから順に発生していく状態

     フェイズ: イベントが、イベントターゲット上で発
• Target
 生している瞬間

     フェイズ: イベントが、イベントターゲットで発生
• Bubble
 した後、ルート要素まで順に遡ってイベントが再度発生
 していく状態

• 状態無し:
      イベントをDispatchする前の状態や、ハンド
 ラで捕まえたイベントを変数に保存している状態
Capture フェイズ
Target フェイズ
Bubble フェイズ
addEventLister()と
removeEventListener()

    属性でもイベントはハンドリングできるけど、
• on*
 addEventListener()とremoveEventListener()の利用推
 奨

 • 一つのイベントターゲットに対して、複数のハンドラを登
  録できる

 • Capture   フェイズのイベントも捕まえられる

 • コードが、なんとなくカッコイイ。
addEventLister()と
removeEventListener()
•   書式:

    •   EventTarget.addEventListener(
         イベント名, ハンドラ, Capture?);

    •   EventTarget.removeEventListener(
         イベント名, ハンドラ, Capture?);

        •   イベント名: イベントの名前 "click" とか、 "keydown"

        •   ハンドラ: function foo(aEvent) { /* something */ } がお手軽で十分

        •   Capture?: true なら、Capture フェイズと、Target フェイズ、false
            なら、Target フェイズと、Bubble フェイズ
addEventLister()と
removeEventListener()

•   単純な例1:

    •   全ての要素で発生するkeydownイベントを知りたい

    •   イベントターゲットより先に知りたい

    •   removeする必要はない

        document.addEventListener("keydown",
          function (aEvent) { /* something */ }, true);
addEventLister()と
removeEventListener()
•   単純な例2:

    •   全ての要素で発生するkeydownイベントを知りたい

    •   イベントターゲットより後に知りたい

    •   removeする必要がある

        function keydownHandler(aEvent) { /* something */ }

        document.addEventListener("keydown",
          keydownHandler, false);

        …

        document.removeEventListener("keydown", keydownHandler, false);
複数のイベントリスナ




• 一つのイベントターゲットに、複数のリスナを登録しちゃう
とどうなる?
複数のイベントリスナ
• 先にaddEventListener()を利用して登録されたものが優
先される。

• もずはっく日記の実例でテストすると以下の結果に
•   親要素のcaptureフェイズに最初に登録されたハンドラ
•   親要素のcaptureフェイズに二番目に登録されたハンドラ
•   イベントターゲットのbubbleフェイズに最初に登録されたハンドラ (captureへの登録よ
    りも前)
•   イベントターゲットのbubbleフェイズに二番目に登録されたハンドラ (captureへの登録
    よりも前)
•   イベントターゲットのcaptureフェイズに最初に登録されたハンドラ
•   イベントターゲットのcaptureフェイズに二番目に登録されたハンドラ
•   イベントターゲットのbubbleフェイズに三番目に登録されたハンドラ (captureへの登録
    より後)
•   イベントターゲットのbubbleフェイズに四番目に登録されたハンドラ (captureへの登録
    より後)
•   親要素のbubbleフェイズに最初に登録されたハンドラ
•   親要素のbubbleフェイズに二番目に登録されたハンドラ
stopPropagation()と、preventDefault()
• 複数のイベントリスナを、複数のイベントターゲットに登
録して処理していると、特定のハンドリングを行った後、
そのイベントを他のハンドラに処理されたくない場合が考
えられる

• stopPropagation()と、stopImmediatePropagation()を
 呼ぶと、それ以降のイベント発生を中止できる

• stopPropagation()では、次のEventTargetから、発生
 を抑制できる

• stopImmediatePropagation()では、同じEventTarget
 に登録されている他の未処理のイベントハンドラの呼び
 出しも抑制できる
stopPropagation()と、preventDefault()

• 特定のイベントを処理した後、ブラウザにデフォルトの
 動作(default action)を実行してもらいたいくない場合が
 考えられる

 • preventDefault()を呼ぶことで、そのデフォルトの動作
  を抑制できる(ただし、a11y上、ブラウザが無視するこ
  とはある)

 • preventDefault()を呼び出すと、defaultPrevented属
  性値がtrueになる
stopPropagation()と、preventDefault()

 • A要素と、B要素があり、BはAの子孫で、共にbubble
  フェイズでイベントリスナが登録されている場合に、B
  のリスナが、Aのリスナに処理をして欲しくないと考え
  た場合、どうするのが適切か?

  • stopPropagation()を呼ぶのがお手軽。A以外にイベ
   ントリスナが登録されても、その動作もメンテナ無し
   に抑制できる

  • preventDefault()を呼び、Aのハンドラで
   defaultPreventedをチェックするのが理想的。ただし、
   全ハンドラでdefaultPreventedを丁寧にチェックする
   必要があるのでバグは産みやすいかも
trustedイベントと、untrustedイベント


      イベントとは、ユーザの入力や、要素の状態の
• trusted
 変化等で、自然に発生したイベントのこと。isTrusted属
 性がtrue。preventDefault()を呼ばない限り、ブラウザの
 デフォルトアクションが必ず発生する

          イベントとは、Webアプリケーションが、
• untrusted
 document.createEvent()で作り出した、人工的なイベン
 ト。isTrusted属性はfalse。セキュリティ等の問題から、
 trusted イベントでは発生する、ブラウザのデフォルトアク
 ションの発生は期待できない。発生するかは実装依存
init*Event()
• イベントを作って、それを特定の要素をターゲットに発生
させるには?

var myEvent =
  document.createEvent("MouseEvents");

/* ここで myEvent を初期化 */

document.getElementById("foo")
  .dispatchEvent(myEvent);

•初期化にcreateEventで指定したイベントに適した、
init*Event()を利用するのが従来の方法。
init*Event()
interface Event
{
   void initEvent(DOMString typeArg,
                  boolean canBubbleArg,
                  boolean cancelableArg);
};

interface UIEvent
{
   void initUIEvent(DOMString typeArg,
                    boolean canBubbleArg,
                    boolean cancelableArg,
                    AbstractView viewArg,
                    long detailArg);
};
init*Event()
interface MouseEvent
{
   void initMouseEvent(DOMString typeArg,
                       boolean canBubbleArg,
                       boolean cancelableArg,
                       AbstractView viewArg,
                       long detailArg,
                       long screenXArg,
                       long screenYArg,
                       long clientXArg,
                       long clientYArg,
                       boolean ctrlKeyArg,
                       boolean altKeyArg,
                       boolean shiftKeyArg,
                       boolean metaKeyArg,
                       unsigned short buttonArg,
                       EventTarget relatedTargetArg);
};
init*Event()

• はい、もう無茶苦茶感が出てきましたね。他のインタ
ーフェース紹介をやめて、
MouseEvent.initMouseEvent()の実例を見てみましょう。


myEvent.initMouseEvent("click", true, true, null, 1, 300, 450,
                       200, 250, true, false, false false, 1,
                       null);




• 分かるかボケー、と思った方の感覚が普通です!
event constructor
   4 Events では、event constructorという初期化方
• DOM
法が提案されていて、実際、Geckoでは一部イベントで
すでに利用可能

• JSON形式の初期化方法で、イベントが定義する、デフ
ォルト値と違う属性だけを初期化すれば済む

var myEvent = new MouseEvent("click",
  { bubbles: true, cancelable: true,
    detail: 1, button: 1,
    screenX: 300, screenY: 450,
    clientX: 200, clientY: 250,
    ctrlKey: true });
DOM イベントマニアックス!




• ここまで、言うても、基礎でしたので、暇してた方にはここ
から本番です。ユーザ入力系のDOM イベントを実際に
実装してる人間だからこそな内容をいってみましょう。
Synthesized mousemove イベント

•   Synthesized mousemove イベントとは?
    •   正式に仕様書等に出てくる用語ではなく、Geckoのソースコー
        ドから名付けました
    •   名前の通り、カーソルの動きに関係無く、生成された
        mousemove イベント
        •   マウスカーソルがドキュメントの上に有る状態で、スクロール
            した後に、新しい要素の上で発生するmousemoveイベント
    •   WebKitと、Operaで発生。Geckoは内部イベントとしては存在
        するものの、Webアプリからは検知できず
    •   WebKit、Opera共にモディファイアキーの状態は不適切なので
        要注意
"mouseenter", "mouseleave"
• "mouseover"や、"mouseout"とは違い、あくまでも、そのイ
ベントターゲットからカーソルが外へ出た場合に
"mouseleave"イベントが、中へ入った場合に"mousenter"
イベントが発生する

• つまり、マウスを動かす度に、要素の境界を移動したかど
うか、大量の確認が必要になる

• Webアプリの負荷増大に繋がるので、Geckoではこれら
 のイベントリスナが登録された場合にのみ、確認処理が
 行われる

• 同時に複数の要素から出た場合、"mouseleave"は子孫か
ら、"mouseenter"は祖先から順に発生する
"mouseenter", "mouseleave"




Geckoでは、私がレビューしました
マウスホイールのイベント

• マウスホイールのイベント、実にカオスなのはご存知で
すか?

• どのぐらいカオスかというと、天下のGoogle様も、きちん
とGeckoの独自イベントは理解できてなくて、処理に失
敗しています。

• 各ブラウザが独自案で実装した結果、メチャクチャでした
が、D3Eでめでたく、WheelEventインターフェースが定
義され、"wheel"イベントとしてイベントが発生するように
なりました。
レガシーマウスホイールイベント
•   "mousewheel" イベント
    •   Gecko以外のエンジンでは採用されているレガシーイベント。
    •   wheelDelta 属性にスクロールの値が入っているものの、その
        値については厳密な定義は見当たらず
    •   Windows版、IEとChromeは、ネイティブイベントのデルタ値を
        単純に設定してる模様
    •   Windows版、Operaは、1行スクロールするにあたり、40を設
        定する模様
    •   Mac等では未調査
    •   WebKit以外では縦方向のホイールイベントしか発生しない
    •   とにかく、定義不明で使いにくいのが問題
レガシーマウイホイールイベント


• "DOMMouseScroll"   イベント

 • Geckoのみが実装

 • detail属性値が、スクロールする行数

 • 高解像度スクロールが後にWindowsとMacで採用され
 てしまったため、これをpreventDefault()するだけでは、
 スクロールを完全に抑制することができなくなっている
レガシーマウイホイールイベント


• "MozMousePixelScroll"   イベント

 • Geckoのみが実装

 • detail属性値が、スクロールするピクセル数

 • Geckoで、スクロールを完全に抑制するにはこちらのイ
  ベントでpreventDefault()を呼ばないと、1行未満のスク
  ロールがすり抜けてしまう。
D3E "wheel" イベント
    では、WheelEvent インターフェースの、"wheel" イベ
• D3E
 ントが定義された

• 現在、IEとGeckoが実装済み

• 斜め方向へのスクロールも一つのイベントで表現できるよ
 うになった(ただし、ネイティブイベントの制約上、Macのみ)

• deltaX、deltaY、deltaZがそれぞれの軸にそったスクロー
 ル量で、longではなく、double

• deltaModeで、deltaX、deltaY、deltaZのスクロール量が、
 ページ単位、行単位、ピクセル単位のどれであるかを表現
D3E "wheel" イベント

• 残念ながらWebKitでは実装が行われていない

• Operaでも実装されていない

• Geckoの場合、delta値が実際にデフォルトアクションでス
クロールする量と必ずしも一致しない(あくまで、Webアプリ
ケーションに対する、スクロールして欲しい量の目安と考え
て)

• Geckoの場合、ユーザ設定でスクロール量を増やすと、
delta値も増えるので、ゲームの主要な入力要素としては
使えない
D3E "wheel" イベント




 Geckoでは、私が実装しました
MouseEvent.buttons
• D3Eで追加された新しい属性

• GeckoとIEが対応。残念ながらWebKitはまだ。

• ビットフラグで、そのマウスイベント発生時に押されてい
たボタン全てのフラグが入っている

• 1=左ボタン、2=右ボタン、4=中ボタン(ホイール)、8=4
 番目のボタン、一般的には戻るボタン、16=5番目のボ
 タン、一般的には進むボタン

• 実際にボタンを押していても、Windowsでは、マウスユ
 ーティリティの設定によっては、検知できない
MouseEvent.buttons




 Geckoでは、私が実装しました!
getModifierState()
•   D3Eで、MouseEventと、KeyboardEvent、WheelEventに定義されて
    いるメソッド
•   IEとGeckoが対応。WebKitはまだ?
•   パラメータにモディファイアキー名を入力する
•   そのイベント生成時に押されていれば、true、押されていなければfalse
•   モディファイアキー名は、"Shift"、"Control"、"Alt"、"Meta"、"AltGraph"、
    "CapsLock"、"NumLock"、"ScrollLock"、"SymbolLock"、"Fn"、"OS"
•   IEでは、"ScrollLock"の代わりに、"Scroll"、"OS"の代わりに、"Win"が
    使われている
•   IEでは、MouseEventと、KeyboardEventで検出できるモディファイア
    キーの状態に差がある
getModifierState()




         Geckoでは、
     私が実装しました!!
CompositionEvent
•   IMEの未確定文字列入力時、確定時に発生するイベント
    •   "compositionstart" 入力開始。data属性値は未確定文字列で
        置換される文字列
    •   "compositionupdate" 未確定文字列が変更された場合に発生。
        data値は最新の未確定文字列
    •   "compositionend" 確定。data値は確定された文字列
•   仕様上は"compositionupdate"のdata値のみを監視すると、未
    確定文字列が分かるはずだが、WebKitは"compositionstart"の
    data値が最初の未確定文字列の値なので、面倒なことになって
    いる
•   "compositionupdate"の発生タイミングは、IEはエディタの内容
    が更新された後、GeckoとWebKitは更新される前。input要素や、
    textarea要素のvalue値に注意
CompositionEvent



     Geckoでは、
 私が実装しました!!!
KeyboardEvent.key and .char
•   KeyboardEvent、実は標準化されるのは、D3Eが初めて(予定)

•   .keyCodeはブラウザ依存の値を持っていて、今更統一、国際化
    対応が困難

•   .charCodeは入力された文字のUnicodeのcode pointが入って
    いるものの、使いづらい

•   これらを解決するために、 .keyと .charが新たに提案された

•   どちらの値もDOMStringになっていて、扱い易くなっている

•   IEが既に実装していて、その内容がほぼそのままドラフトに掲載
    されている
KeyboardEvent.key and .char

• 文字入力用ではないキーでは、.charはおおむね、空文
字列(例外あり)、 .keyは、仕様で定義済みのキーの名
前か、UAが命名できる場合はそれでも良い

• 後者の仕様はWebデザイナが地獄を見ることになるの
 で大問題

• 必要なのに定義済みキー名に無いものは、多々、W3C
 のbugzillaへ登録しまくっている最中
KeyboardEvent.key and .char


• 文字入力用のキーでは、.charは、文字が入力される場
合の文字列、 .keyは、.charと同じ値

• .keyと   .charが同じ値なら意味がない

• .charが、実際に文字が入力されない場合にも入ってい
 るのでは、Webアプリが独自のテキストエディタを作り
 にくい
KeyboardEvent.key and .char

• 現在、Mozillaから提案している(予定含む)改善案

• .keyの定義済みキー名を増やす

• 未定義の   .key名を利用する場合はprefixをつけるべき

• .keyの動作はそのままに、.charは実際にそのイベント
 でテキストエディタで入力される値にする

 • 例えば、Ctrl+Cだと、.key   = "c"、.char=""
KeyboardEvent.key and .char

      Geckoでは、
        私が実装
   がんばってます、
          なう!!!!
Text

Q&A?

More Related Content

What's hot

Objective-C が好きになる Tips & Hack
Objective-C が好きになる Tips & HackObjective-C が好きになる Tips & Hack
Objective-C が好きになる Tips & HackTaketo Sano
 
WebGL and Three.js
WebGL and Three.jsWebGL and Three.js
WebGL and Three.jsyomotsu
 
Weeyble async 181009_tukky
Weeyble async 181009_tukkyWeeyble async 181009_tukky
Weeyble async 181009_tukkyshotaueda3
 
ARコンテンツ作成勉強会:Myoを用いたVRコンテンツ開発
ARコンテンツ作成勉強会:Myoを用いたVRコンテンツ開発ARコンテンツ作成勉強会:Myoを用いたVRコンテンツ開発
ARコンテンツ作成勉強会:Myoを用いたVRコンテンツ開発Takashi Yoshinaga
 
㉕cocos2dを覚えよう!初級編③
㉕cocos2dを覚えよう!初級編③㉕cocos2dを覚えよう!初級編③
㉕cocos2dを覚えよう!初級編③Nishida Kansuke
 
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Masataka Motokurumada
 
大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発についてYuki Tanaka
 
Html canvas shooting_and_performanceup
Html canvas shooting_and_performanceupHtml canvas shooting_and_performanceup
Html canvas shooting_and_performanceupYohei Munesada
 
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)Cryolite
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)Takashi Yoshinaga
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について豊明 尾古
 
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!Nishida Kansuke
 
㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2Nishida Kansuke
 
Javascripでオブジェクト指向
Javascripでオブジェクト指向Javascripでオブジェクト指向
Javascripでオブジェクト指向1000 VICKY
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Masahiko Mizuta
 
函館IKA ICS開発情報
函館IKA ICS開発情報函館IKA ICS開発情報
函館IKA ICS開発情報Masahiro Wakame
 
Canvas de shooting 制作のポイント
Canvas de shooting 制作のポイントCanvas de shooting 制作のポイント
Canvas de shooting 制作のポイントYohei Munesada
 

What's hot (19)

Objective-C が好きになる Tips & Hack
Objective-C が好きになる Tips & HackObjective-C が好きになる Tips & Hack
Objective-C が好きになる Tips & Hack
 
WebGL and Three.js
WebGL and Three.jsWebGL and Three.js
WebGL and Three.js
 
Client Side Cache
Client Side CacheClient Side Cache
Client Side Cache
 
Weeyble async 181009_tukky
Weeyble async 181009_tukkyWeeyble async 181009_tukky
Weeyble async 181009_tukky
 
ARコンテンツ作成勉強会:Myoを用いたVRコンテンツ開発
ARコンテンツ作成勉強会:Myoを用いたVRコンテンツ開発ARコンテンツ作成勉強会:Myoを用いたVRコンテンツ開発
ARコンテンツ作成勉強会:Myoを用いたVRコンテンツ開発
 
㉕cocos2dを覚えよう!初級編③
㉕cocos2dを覚えよう!初級編③㉕cocos2dを覚えよう!初級編③
㉕cocos2dを覚えよう!初級編③
 
Arctic.js
Arctic.jsArctic.js
Arctic.js
 
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
 
大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発について
 
Html canvas shooting_and_performanceup
Html canvas shooting_and_performanceupHtml canvas shooting_and_performanceup
Html canvas shooting_and_performanceup
 
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について
 
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!
 
㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2
 
Javascripでオブジェクト指向
Javascripでオブジェクト指向Javascripでオブジェクト指向
Javascripでオブジェクト指向
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門
 
函館IKA ICS開発情報
函館IKA ICS開発情報函館IKA ICS開発情報
函館IKA ICS開発情報
 
Canvas de shooting 制作のポイント
Canvas de shooting 制作のポイントCanvas de shooting 制作のポイント
Canvas de shooting 制作のポイント
 

Similar to DOMイベントの基礎から深淵まで

GeckoのDOMイベント処理の実装
GeckoのDOMイベント処理の実装GeckoのDOMイベント処理の実装
GeckoのDOMイベント処理の実装Masayuki Nakano
 
GeckoのDOMイベント処理の実装 (Gecko Inside ver.)
GeckoのDOMイベント処理の実装 (Gecko Inside ver.)GeckoのDOMイベント処理の実装 (Gecko Inside ver.)
GeckoのDOMイベント処理の実装 (Gecko Inside ver.)Masayuki Nakano
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
JavaFXでマルチタッチプログラミング
JavaFXでマルチタッチプログラミングJavaFXでマルチタッチプログラミング
JavaFXでマルチタッチプログラミングTakashi Aoe
 
EventSystemまわりの話@UnityFukuoka07
EventSystemまわりの話@UnityFukuoka07 EventSystemまわりの話@UnityFukuoka07
EventSystemまわりの話@UnityFukuoka07 Keizo Nagamine
 
wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)泰 増田
 
Windows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIWindows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIjunichi anno
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会Yukihiro Kitazawa
 
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会Jumpei Ogawa
 
スマートフォン対応、気をつけたいトラブル JavaScript編
スマートフォン対応、気をつけたいトラブル JavaScript編スマートフォン対応、気をつけたいトラブル JavaScript編
スマートフォン対応、気をつけたいトラブル JavaScript編Hiroaki Wakamatsu
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm伸男 伊藤
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Takashi EGAWA
 
Acme minechan
Acme minechanAcme minechan
Acme minechantakesako
 

Similar to DOMイベントの基礎から深淵まで (20)

GeckoのDOMイベント処理の実装
GeckoのDOMイベント処理の実装GeckoのDOMイベント処理の実装
GeckoのDOMイベント処理の実装
 
GeckoのDOMイベント処理の実装 (Gecko Inside ver.)
GeckoのDOMイベント処理の実装 (Gecko Inside ver.)GeckoのDOMイベント処理の実装 (Gecko Inside ver.)
GeckoのDOMイベント処理の実装 (Gecko Inside ver.)
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
JavaFXでマルチタッチプログラミング
JavaFXでマルチタッチプログラミングJavaFXでマルチタッチプログラミング
JavaFXでマルチタッチプログラミング
 
EventSystemまわりの話@UnityFukuoka07
EventSystemまわりの話@UnityFukuoka07 EventSystemまわりの話@UnityFukuoka07
EventSystemまわりの話@UnityFukuoka07
 
wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)
 
Windows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIWindows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMI
 
Titanium勉強会
Titanium勉強会Titanium勉強会
Titanium勉強会
 
2時間で学ぶjQuery
2時間で学ぶjQuery2時間で学ぶjQuery
2時間で学ぶjQuery
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
 
enchant.js勉強会
enchant.js勉強会enchant.js勉強会
enchant.js勉強会
 
Miyazaki.js vol.2
Miyazaki.js vol.2Miyazaki.js vol.2
Miyazaki.js vol.2
 
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
 
Sencha study
Sencha studySencha study
Sencha study
 
Flight入門
Flight入門Flight入門
Flight入門
 
スマートフォン対応、気をつけたいトラブル JavaScript編
スマートフォン対応、気をつけたいトラブル JavaScript編スマートフォン対応、気をつけたいトラブル JavaScript編
スマートフォン対応、気をつけたいトラブル JavaScript編
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010
 
Acme minechan
Acme minechanAcme minechan
Acme minechan
 

Recently uploaded

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Recently uploaded (8)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

DOMイベントの基礎から深淵まで

  • 1.
  • 3. 中野雅之 • 肩書き • 正式: Mozilla Japan 国際化担当マネージャ • 半公式: Mozilla Japan ジョギング部大阪支部長 • 非公式: Mozilla Japan 大阪支部長 • 大阪の自宅で、自宅警備しながら仕事してます
  • 4. 中野雅之 • 色んなアカウント • メールアドレス: masayuki@d-toybox.com • Skype: masayuki-nakano • Twitter: @d_toybox • Facebook: masayuki.nakano.560 • Blog: 「もずはっく日記」で検索
  • 5. アジェンダ • DOM イベントの仕様って? • DOM イベント処理の基礎 • DOM Level 4でのイベント生成 • 各入力イベントのふかーーーーーーいお話
  • 6. DOM イベントの仕様 • HTMLの特定の要素・状況で起きるようなイベント • HTML5仕様書の各要素のページにあります • これは今日は扱いません
  • 7. DOM イベントの仕様 • ユーザの入力や、他の仕様に左右されないイベント • Document Object Model (DOM) Level 2 Events Specification • W3C Recommendation 13 November, 2000 • Document Object Model (DOM) Level 3 Events Specification • W3C Editor's Draft 04 September 2012 • DOM4 Events • Unofficial Draft
  • 8. DOM イベント処理の基礎 • フェイズと、プロパゲーション • addEventListener()と、removeEventListener() • 複数のイベントリスナ • stopPropagation()と、preventDefault() • trustedイベントと、untrustedイベント • init*Event() • event constructor
  • 9. フェイズとプロパゲーション • DOM イベントには4つの状態がある フェイズ: イベントが、イベントターゲットに向け • Capture てルートから順に発生していく状態 フェイズ: イベントが、イベントターゲット上で発 • Target 生している瞬間 フェイズ: イベントが、イベントターゲットで発生 • Bubble した後、ルート要素まで順に遡ってイベントが再度発生 していく状態 • 状態無し: イベントをDispatchする前の状態や、ハンド ラで捕まえたイベントを変数に保存している状態
  • 13. addEventLister()と removeEventListener() 属性でもイベントはハンドリングできるけど、 • on* addEventListener()とremoveEventListener()の利用推 奨 • 一つのイベントターゲットに対して、複数のハンドラを登 録できる • Capture フェイズのイベントも捕まえられる • コードが、なんとなくカッコイイ。
  • 14. addEventLister()と removeEventListener() • 書式: • EventTarget.addEventListener( イベント名, ハンドラ, Capture?); • EventTarget.removeEventListener( イベント名, ハンドラ, Capture?); • イベント名: イベントの名前 "click" とか、 "keydown" • ハンドラ: function foo(aEvent) { /* something */ } がお手軽で十分 • Capture?: true なら、Capture フェイズと、Target フェイズ、false なら、Target フェイズと、Bubble フェイズ
  • 15. addEventLister()と removeEventListener() • 単純な例1: • 全ての要素で発生するkeydownイベントを知りたい • イベントターゲットより先に知りたい • removeする必要はない document.addEventListener("keydown", function (aEvent) { /* something */ }, true);
  • 16. addEventLister()と removeEventListener() • 単純な例2: • 全ての要素で発生するkeydownイベントを知りたい • イベントターゲットより後に知りたい • removeする必要がある function keydownHandler(aEvent) { /* something */ } document.addEventListener("keydown", keydownHandler, false); … document.removeEventListener("keydown", keydownHandler, false);
  • 18. 複数のイベントリスナ • 先にaddEventListener()を利用して登録されたものが優 先される。 • もずはっく日記の実例でテストすると以下の結果に • 親要素のcaptureフェイズに最初に登録されたハンドラ • 親要素のcaptureフェイズに二番目に登録されたハンドラ • イベントターゲットのbubbleフェイズに最初に登録されたハンドラ (captureへの登録よ りも前) • イベントターゲットのbubbleフェイズに二番目に登録されたハンドラ (captureへの登録 よりも前) • イベントターゲットのcaptureフェイズに最初に登録されたハンドラ • イベントターゲットのcaptureフェイズに二番目に登録されたハンドラ • イベントターゲットのbubbleフェイズに三番目に登録されたハンドラ (captureへの登録 より後) • イベントターゲットのbubbleフェイズに四番目に登録されたハンドラ (captureへの登録 より後) • 親要素のbubbleフェイズに最初に登録されたハンドラ • 親要素のbubbleフェイズに二番目に登録されたハンドラ
  • 19. stopPropagation()と、preventDefault() • 複数のイベントリスナを、複数のイベントターゲットに登 録して処理していると、特定のハンドリングを行った後、 そのイベントを他のハンドラに処理されたくない場合が考 えられる • stopPropagation()と、stopImmediatePropagation()を 呼ぶと、それ以降のイベント発生を中止できる • stopPropagation()では、次のEventTargetから、発生 を抑制できる • stopImmediatePropagation()では、同じEventTarget に登録されている他の未処理のイベントハンドラの呼び 出しも抑制できる
  • 20. stopPropagation()と、preventDefault() • 特定のイベントを処理した後、ブラウザにデフォルトの 動作(default action)を実行してもらいたいくない場合が 考えられる • preventDefault()を呼ぶことで、そのデフォルトの動作 を抑制できる(ただし、a11y上、ブラウザが無視するこ とはある) • preventDefault()を呼び出すと、defaultPrevented属 性値がtrueになる
  • 21. stopPropagation()と、preventDefault() • A要素と、B要素があり、BはAの子孫で、共にbubble フェイズでイベントリスナが登録されている場合に、B のリスナが、Aのリスナに処理をして欲しくないと考え た場合、どうするのが適切か? • stopPropagation()を呼ぶのがお手軽。A以外にイベ ントリスナが登録されても、その動作もメンテナ無し に抑制できる • preventDefault()を呼び、Aのハンドラで defaultPreventedをチェックするのが理想的。ただし、 全ハンドラでdefaultPreventedを丁寧にチェックする 必要があるのでバグは産みやすいかも
  • 22. trustedイベントと、untrustedイベント イベントとは、ユーザの入力や、要素の状態の • trusted 変化等で、自然に発生したイベントのこと。isTrusted属 性がtrue。preventDefault()を呼ばない限り、ブラウザの デフォルトアクションが必ず発生する イベントとは、Webアプリケーションが、 • untrusted document.createEvent()で作り出した、人工的なイベン ト。isTrusted属性はfalse。セキュリティ等の問題から、 trusted イベントでは発生する、ブラウザのデフォルトアク ションの発生は期待できない。発生するかは実装依存
  • 23. init*Event() • イベントを作って、それを特定の要素をターゲットに発生 させるには? var myEvent = document.createEvent("MouseEvents"); /* ここで myEvent を初期化 */ document.getElementById("foo") .dispatchEvent(myEvent); •初期化にcreateEventで指定したイベントに適した、 init*Event()を利用するのが従来の方法。
  • 24. init*Event() interface Event { void initEvent(DOMString typeArg, boolean canBubbleArg, boolean cancelableArg); }; interface UIEvent { void initUIEvent(DOMString typeArg, boolean canBubbleArg, boolean cancelableArg, AbstractView viewArg, long detailArg); };
  • 25. init*Event() interface MouseEvent { void initMouseEvent(DOMString typeArg, boolean canBubbleArg, boolean cancelableArg, AbstractView viewArg, long detailArg, long screenXArg, long screenYArg, long clientXArg, long clientYArg, boolean ctrlKeyArg, boolean altKeyArg, boolean shiftKeyArg, boolean metaKeyArg, unsigned short buttonArg, EventTarget relatedTargetArg); };
  • 27. event constructor 4 Events では、event constructorという初期化方 • DOM 法が提案されていて、実際、Geckoでは一部イベントで すでに利用可能 • JSON形式の初期化方法で、イベントが定義する、デフ ォルト値と違う属性だけを初期化すれば済む var myEvent = new MouseEvent("click", { bubbles: true, cancelable: true, detail: 1, button: 1, screenX: 300, screenY: 450, clientX: 200, clientY: 250, ctrlKey: true });
  • 29. Synthesized mousemove イベント • Synthesized mousemove イベントとは? • 正式に仕様書等に出てくる用語ではなく、Geckoのソースコー ドから名付けました • 名前の通り、カーソルの動きに関係無く、生成された mousemove イベント • マウスカーソルがドキュメントの上に有る状態で、スクロール した後に、新しい要素の上で発生するmousemoveイベント • WebKitと、Operaで発生。Geckoは内部イベントとしては存在 するものの、Webアプリからは検知できず • WebKit、Opera共にモディファイアキーの状態は不適切なので 要注意
  • 30. "mouseenter", "mouseleave" • "mouseover"や、"mouseout"とは違い、あくまでも、そのイ ベントターゲットからカーソルが外へ出た場合に "mouseleave"イベントが、中へ入った場合に"mousenter" イベントが発生する • つまり、マウスを動かす度に、要素の境界を移動したかど うか、大量の確認が必要になる • Webアプリの負荷増大に繋がるので、Geckoではこれら のイベントリスナが登録された場合にのみ、確認処理が 行われる • 同時に複数の要素から出た場合、"mouseleave"は子孫か ら、"mouseenter"は祖先から順に発生する
  • 32. マウスホイールのイベント • マウスホイールのイベント、実にカオスなのはご存知で すか? • どのぐらいカオスかというと、天下のGoogle様も、きちん とGeckoの独自イベントは理解できてなくて、処理に失 敗しています。 • 各ブラウザが独自案で実装した結果、メチャクチャでした が、D3Eでめでたく、WheelEventインターフェースが定 義され、"wheel"イベントとしてイベントが発生するように なりました。
  • 33. レガシーマウスホイールイベント • "mousewheel" イベント • Gecko以外のエンジンでは採用されているレガシーイベント。 • wheelDelta 属性にスクロールの値が入っているものの、その 値については厳密な定義は見当たらず • Windows版、IEとChromeは、ネイティブイベントのデルタ値を 単純に設定してる模様 • Windows版、Operaは、1行スクロールするにあたり、40を設 定する模様 • Mac等では未調査 • WebKit以外では縦方向のホイールイベントしか発生しない • とにかく、定義不明で使いにくいのが問題
  • 34. レガシーマウイホイールイベント • "DOMMouseScroll" イベント • Geckoのみが実装 • detail属性値が、スクロールする行数 • 高解像度スクロールが後にWindowsとMacで採用され てしまったため、これをpreventDefault()するだけでは、 スクロールを完全に抑制することができなくなっている
  • 35. レガシーマウイホイールイベント • "MozMousePixelScroll" イベント • Geckoのみが実装 • detail属性値が、スクロールするピクセル数 • Geckoで、スクロールを完全に抑制するにはこちらのイ ベントでpreventDefault()を呼ばないと、1行未満のスク ロールがすり抜けてしまう。
  • 36. D3E "wheel" イベント では、WheelEvent インターフェースの、"wheel" イベ • D3E ントが定義された • 現在、IEとGeckoが実装済み • 斜め方向へのスクロールも一つのイベントで表現できるよ うになった(ただし、ネイティブイベントの制約上、Macのみ) • deltaX、deltaY、deltaZがそれぞれの軸にそったスクロー ル量で、longではなく、double • deltaModeで、deltaX、deltaY、deltaZのスクロール量が、 ページ単位、行単位、ピクセル単位のどれであるかを表現
  • 37. D3E "wheel" イベント • 残念ながらWebKitでは実装が行われていない • Operaでも実装されていない • Geckoの場合、delta値が実際にデフォルトアクションでス クロールする量と必ずしも一致しない(あくまで、Webアプリ ケーションに対する、スクロールして欲しい量の目安と考え て) • Geckoの場合、ユーザ設定でスクロール量を増やすと、 delta値も増えるので、ゲームの主要な入力要素としては 使えない
  • 38. D3E "wheel" イベント Geckoでは、私が実装しました
  • 39. MouseEvent.buttons • D3Eで追加された新しい属性 • GeckoとIEが対応。残念ながらWebKitはまだ。 • ビットフラグで、そのマウスイベント発生時に押されてい たボタン全てのフラグが入っている • 1=左ボタン、2=右ボタン、4=中ボタン(ホイール)、8=4 番目のボタン、一般的には戻るボタン、16=5番目のボ タン、一般的には進むボタン • 実際にボタンを押していても、Windowsでは、マウスユ ーティリティの設定によっては、検知できない
  • 41. getModifierState() • D3Eで、MouseEventと、KeyboardEvent、WheelEventに定義されて いるメソッド • IEとGeckoが対応。WebKitはまだ? • パラメータにモディファイアキー名を入力する • そのイベント生成時に押されていれば、true、押されていなければfalse • モディファイアキー名は、"Shift"、"Control"、"Alt"、"Meta"、"AltGraph"、 "CapsLock"、"NumLock"、"ScrollLock"、"SymbolLock"、"Fn"、"OS" • IEでは、"ScrollLock"の代わりに、"Scroll"、"OS"の代わりに、"Win"が 使われている • IEでは、MouseEventと、KeyboardEventで検出できるモディファイア キーの状態に差がある
  • 42. getModifierState() Geckoでは、 私が実装しました!!
  • 43. CompositionEvent • IMEの未確定文字列入力時、確定時に発生するイベント • "compositionstart" 入力開始。data属性値は未確定文字列で 置換される文字列 • "compositionupdate" 未確定文字列が変更された場合に発生。 data値は最新の未確定文字列 • "compositionend" 確定。data値は確定された文字列 • 仕様上は"compositionupdate"のdata値のみを監視すると、未 確定文字列が分かるはずだが、WebKitは"compositionstart"の data値が最初の未確定文字列の値なので、面倒なことになって いる • "compositionupdate"の発生タイミングは、IEはエディタの内容 が更新された後、GeckoとWebKitは更新される前。input要素や、 textarea要素のvalue値に注意
  • 44. CompositionEvent Geckoでは、 私が実装しました!!!
  • 45. KeyboardEvent.key and .char • KeyboardEvent、実は標準化されるのは、D3Eが初めて(予定) • .keyCodeはブラウザ依存の値を持っていて、今更統一、国際化 対応が困難 • .charCodeは入力された文字のUnicodeのcode pointが入って いるものの、使いづらい • これらを解決するために、 .keyと .charが新たに提案された • どちらの値もDOMStringになっていて、扱い易くなっている • IEが既に実装していて、その内容がほぼそのままドラフトに掲載 されている
  • 46. KeyboardEvent.key and .char • 文字入力用ではないキーでは、.charはおおむね、空文 字列(例外あり)、 .keyは、仕様で定義済みのキーの名 前か、UAが命名できる場合はそれでも良い • 後者の仕様はWebデザイナが地獄を見ることになるの で大問題 • 必要なのに定義済みキー名に無いものは、多々、W3C のbugzillaへ登録しまくっている最中
  • 47. KeyboardEvent.key and .char • 文字入力用のキーでは、.charは、文字が入力される場 合の文字列、 .keyは、.charと同じ値 • .keyと .charが同じ値なら意味がない • .charが、実際に文字が入力されない場合にも入ってい るのでは、Webアプリが独自のテキストエディタを作り にくい
  • 48. KeyboardEvent.key and .char • 現在、Mozillaから提案している(予定含む)改善案 • .keyの定義済みキー名を増やす • 未定義の .key名を利用する場合はprefixをつけるべき • .keyの動作はそのままに、.charは実際にそのイベント でテキストエディタで入力される値にする • 例えば、Ctrl+Cだと、.key = "c"、.char=""
  • 49. KeyboardEvent.key and .char Geckoでは、 私が実装 がんばってます、 なう!!!!