1. はじめに
1.1. 概要
UI Eventsは主に2つの目的で設計されています。最初の目的は、event システムを設計することであり、これにより event listeners の登録を可能にし、イベントがツリー構造を通じて流れる仕組みを記述します。さらに、本仕様ではユーザーインターフェイス制御やドキュメントの変更通知のための標準的なイベントモジュールを提供し、これらの各イベントモジュールに関するコンテキスト情報も定義します。
UI Eventsの2つ目の目的は、現行のブラウザで使用されているイベントシステムの共通部分集合を提供することです。これは、既存のスクリプトやコンテンツの相互運用性を促進するためです。この目的が完全な後方互換性を持って達成されるとは期待されていませんが、可能な限りその達成を目指しています。
1.2. 適合性
このセクションは規範的です。
本仕様書内では、キーワード MUST
、MUST NOT
、REQUIRED
、SHALL
、SHALL
NOT
、SHOULD
、SHOULD NOT
、RECOMMENDED
、MAY
、および OPTIONAL
は [RFC2119] で説明されている通りに解釈されます。
本仕様はDOM Level 3 Core仕様書 [DOM-Level-3-Core]
の文脈で理解されるべきであり、DOM実装に関する一般的な考慮事項が適用されます。例えば、namespace URIs の扱いについては XML
Namespaces で論じられています。
適合性
についての追加情報は、DOM Level 3 Core仕様書 [DOM-Level-3-Core] を参照してください。user
agent は本仕様に適合するために他の仕様全体に適合する必要はありませんが、本仕様で言及されている他仕様の特定部分には必ず適合しなければなりません(例:適合するUI Events user
agent は DOMString
データ型を [WebIDL] で定義されている通りにサポートしなければなりませんが、UI Eventsに適合するだけで [WebIDL]
で定義されているすべてのメソッドやデータ型をサポートする必要はありません)。
本仕様では、異なる user agent、仕様、コンテンツ著者向けに複数の適合クラスを定義しています:
1.2.1. Webブラウザおよびその他の動的または対話的な user agents
動的または対話的な user agent、ここでは「ブラウザ」と呼びます(Webブラウザ、AT(アクセシビリティ技術)アプリケーション、またはそれに類するプログラムなど)、は次の条件を満たす場合UI Eventsに適合します:
-
[DOM-Level-3-Core] で定義されているCoreモジュール
-
本仕様で定義されているすべてのインターフェイスおよびイベント、その関連メソッド、属性、および意味論(ただし deprecated と記されたものは除く。適合するuser agentは、後方互換性のためにdeprecatedなインターフェイス、イベント、APIを実装してもよいが、適合要件ではない)
-
[UIEvents-Key] および [UIEvents-Code] で定義されている
key
およびcode
の全値(プラットフォームで利用可能な場合)、および -
本仕様で定義されているその他すべての規範的要件。
適合するブラウザは、条件が満たされたとき、適切な EventTarget
に イベントを発火 しなければなりません。
ブラウザは、本ドキュメントで定義されたインターフェイスおよび関連する event types を実装している場合、UI Eventsに特化して適合しているといえます。
適合するブラウザは、スクリプティング、宣言型インタラクティビティ、またはその他の方法で、イベントの検出および発火を本仕様で記述された方法でサポートしなければならず、また event type 用に仕様されたAPIもサポートしなければなりません。
その他の適合基準をすべて満たすことに加えて、適合するブラウザは後方互換性のために deprecated と記された仕様の機能を実装してもかまいませんが、その実装は推奨されません。
適合するブラウザは、本仕様にない機能(ただし本仕様で定義されたインターフェイス、イベント、またはその他の機能を用いるもの)をサポートしたり、実装に応じて追加のインターフェイスや event types を実装してもかまいません。こうした機能は将来の仕様で標準化されることもあります。
本仕様の必須部分すべてに適合しないブラウザは、UI Eventsへの適合を主張してはなりません。部分的に本仕様に適合する実装は、その特定部分への適合のみを主張できます。
適合するブラウザは、Web IDL仕様 [WebIDL] で説明されているように、インターフェイス定義言語(IDL)断片の 適合する実装 でもなければなりません。
1.2.2. オーサリングツール
コンテンツオーサリングツールは、本仕様で定義された event types を一貫して使用するコンテンツを生成する場合、UI Eventsに適合しています。
オーサリングツールは、生成するコンテンツが本仕様で deprecated と記された機能を使用している場合、そのコンテンツについてUI Eventsへの適合を主張してはなりません。
適合するコンテンツオーサリングツールは、コンテンツ著者が、コンテンツ文書で使用されるすべての event types およびインターフェイスを、すべての host languages に対して使用できるよう手段を提供すべきです。
1.2.3. コンテンツ著者およびコンテンツ
コンテンツ 著者 は、そのコンテンツが本仕様で定義された event types を一貫して使用する場合、UI Events適合コンテンツを作成したことになります。
コンテンツ著者は、本仕様で deprecated とされる機能を使用すべきではなく、代替手段(本仕様や他仕様で定義されているもの)を利用すべきです。
適合するコンテンツは、本仕様で記述されるインターフェイスや event types の意味論を守らなければなりません。
コンテンツ著者は、アクセシビリティ や 国際化 のガイドライン仕様で説明されるベストプラクティスに従うことが推奨されます。
1.2.4. 仕様およびホスト言語
仕様または host language は、[DOM] で定義されているイベントフロー機構、インターフェイス、イベント、またはその他の機能を参照し、これらの機能を非互換な方法で拡張しない場合、UI Eventsに適合します。
仕様または host language が、本ドキュメントで定義されたインターフェイスおよび関連する event types を参照し、使用する場合、UI Eventsに特化して適合しています。適合する仕様は、仕様に応じて追加のインターフェイスや event types を定義したり、UI Eventsのインターフェイスや event types を、この仕様で定義されている内容と矛盾または衝突しない方法で拡張してもかまいません。
UI Eventsを参照する仕様や host languages は、本仕様で deprecated とされる機能を使用または推奨すべきではなく、可能ならば推奨される代替手段を利用または推奨すべきです。
2. 記述上の慣例
本仕様は提案されたW3C仕様記述慣例 に従っていますが、以下の追加事項があります:
-
キーに印字されている キーキャップ は
↓
、=
、Q
といった形で表されます。これは、ユーザー視点でキーを参照する際に使用され、生成されるkey
やcode
の値は考慮しません。 -
文字を表すグリフは
"𣧂"
のように示されます。 -
Unicode文字コードは
U+003d
のように表記されます。 -
キー押下によって生成されるキー値名(すなわち
KeyboardEvent
.key
の値)は"ArrowDown"
、"="
、"q"
、"Q"
のように示されます。 -
物理キーに関連付けられているキーコード名(すなわち
KeyboardEvent
.code
の値)は"ArrowDown"
、"Equal"
、"KeyQ"
のように示されます。
さらに、本仕様では特定の用語が特別な意味で用いられます。「実装」という用語は、本仕様を実装するブラウザ、コンテンツオーサリングツール、その他の user agent を指します。一方、コンテンツ著者は、本仕様で説明されているインターフェイス、メソッド、属性、イベント等を利用してWebアプリケーションを作成する人を指し、ユーザーはそのWebアプリケーションを実装上で利用する人です。
最後に:
これは注記です。
これは未解決の課題です。
これは警告です。
interface Example { // This is an IDL definition. };
3. 基本イベントインターフェイス
[DOM] で定義される基本的なイベントインターフェイスは、UI Eventsに不可欠です。これらの基本イベントインターフェイスは実装で常にサポートされなければなりません:
-
Event
インターフェイスおよび以下の定数、メソッド、属性:-
NONE
定数 -
AT_TARGET
定数 -
type
属性 -
target
属性 -
eventPhase
属性 -
bubbles
属性 -
cancelable
属性 -
composed
属性 -
timeStamp
属性 -
isTrusted
属性 -
stopPropagation()
メソッド -
preventDefault()
メソッド -
initEvent()
メソッド
-
-
CustomEvent
インターフェイスおよび以下のメソッドと属性:-
initCustomEvent()
メソッド -
detail
属性
-
-
EventTarget
インターフェイスおよび以下のメソッド:-
addEventListener()
メソッド -
dispatchEvent()
メソッド
-
-
EventListener
インターフェイスおよびhandleEvent()
メソッド -
Document
インターフェイスのcreateEvent()
メソッド
本仕様で定義されるイベント型はこれらの基本インターフェイスから派生し、派生元のインターフェイスが持つすべての属性、メソッド、定数を継承しなければなりません。
以下の図は本仕様で記述されるインターフェイスの継承構造を示します。
3.1. イベント型一覧
各イベントは イベント型 と呼ばれる型に関連づけられ、イベントオブジェクトの type
属性として利用できます。イベント型は DOMString
型でなければなりません。
DOMのサポートレベルや表示(例:画面)・操作(例:マウス、キーボード、タッチスクリーン、音声)用デバイスによって、こうしたイベント型は実装によって生成されます。[XML] や [HTML5] アプリケーションで使用される場合、それぞれの言語仕様によってイベント型に関連する意味論や範囲(特に イベントターゲット の可能性)が制限されることがあります。詳細や、本ドキュメントに定義されていないイベント型を探す場合は、各言語仕様を参照してください。
次の表は、本仕様で記述されるイベント型の情報まとめです。
イベント型 | 同期/非同期 | バブリングフェーズ | 信頼できるイベントターゲット型 | DOMインターフェイス | キャンセル可能 | デフォルト動作 |
---|---|---|---|---|---|---|
abort
| 同期 | いいえ | Window, Element | Event
| いいえ | なし |
auxclick
| 同期 | はい | Element | PointerEvent
| はい | 状況による |
beforeinput
| 同期 | はい | Element | InputEvent
| はい | DOM要素の更新 |
blur
| 同期 | いいえ | Window, Element | FocusEvent
| いいえ | なし |
click
| 同期 | はい | Element | PointerEvent
| はい | 状況による:ターゲットにアクティベーション動作が関連付けられている場合はアクティベーション動作を実行、フォーカス可能なターゲットの場合は要素にフォーカスを与える |
compositionstart
| 同期 | はい | Element | CompositionEvent
| はい | 文字入力システムの候補ウィンドウ表示 |
compositionupdate
| 同期 | はい | Element | CompositionEvent
| いいえ | なし |
compositionend
| 同期 | はい | Element | CompositionEvent
| いいえ | なし |
contextmenu
| 同期 | はい | Element | PointerEvent
| はい | 対応していればコンテキストメニュー表示 |
dblclick
| 同期 | はい | Element | MouseEvent
| いいえ | 状況による:ターゲットにアクティベーション動作が関連付けられている場合はアクティベーション動作を実行、フォーカス可能なターゲットの場合は要素にフォーカスを与える |
error
| 非同期 | いいえ | Window, Element | Event
| いいえ | なし |
focus
| 同期 | いいえ | Window, Element | FocusEvent
| いいえ | なし |
focusin
| 同期 | はい | Window, Element | FocusEvent
| いいえ | なし |
focusout
| 同期 | はい | Window, Element | FocusEvent
| いいえ | なし |
input
| 同期 | はい | Element | InputEvent
| いいえ | なし |
keydown
| 同期 | はい | Element | KeyboardEvent
| はい | 状況による:beforeinput や input イベントの発火、文字入力システムの起動、blur や focus イベントの発火、keypress
イベント(対応している場合)、アクティベーション動作、その他イベント
|
keyup
| 同期 | はい | Element | KeyboardEvent
| はい | なし |
load
| 非同期 | いいえ | Window, Document, Element | Event
| いいえ | なし |
mousedown
| 同期 | はい | Element | MouseEvent
| はい | 状況による:ドラッグ&ドロップ開始、テキスト選択開始、スクロール/パン操作開始(中ボタン併用時、対応していれば) |
mouseenter
| 同期 | いいえ | Element | MouseEvent
| いいえ | なし |
mouseleave
| 同期 | いいえ | Element | MouseEvent
| いいえ | なし |
mousemove
| 同期 | はい | Element | MouseEvent
| はい | なし |
mouseout
| 同期 | はい | Element | MouseEvent
| はい | なし |
mouseover
| 同期 | はい | Element | MouseEvent
| はい | なし |
mouseup
| 同期 | はい | Element | MouseEvent
| はい | なし |
select
| 同期 | はい | Element | Event
| いいえ | なし |
unload
| 同期 | いいえ | Window, Document, Element | Event
| いいえ | なし |
wheel
| 非同期 | はい | Element | WheelEvent
| はい | ドキュメントのスクロール(またはズーム) |
本仕様で非推奨とされるイベント一覧については、ドキュメント末尾の 旧イベント型 付録を参照してください。
上記の表の解釈例:load
イベントは、そのイベント向けに
Element
ノード上でキャプチャおよびターゲットフェーズでイベントリスナーが発火します。このイベントはキャンセルできません。event listener が Window、Document
、Element
ノード以外や、バブリングフェーズのみで登録された場合、この event listener は発火しません。
上記の表は記載されたイベント型について決定的なものとして解釈しないでください。例えば load
イベントは他仕様でも使用されています(例:XMLHttpRequest)。同様に、dispatchEvent()
は 任意の EventTarget
を実装するオブジェクトでリスナーに非信頼イベントを発火できます。
上記イベント型に関連付けられるイベントオブジェクトは追加のコンテキスト情報を持っています。詳細はDOMインターフェイスの説明を参照してください。
3.2. ユーザーインターフェイスイベント
ユーザーインターフェイスイベントモジュールは、ユーザーインターフェイスやドキュメント操作に関連する基本的なイベント型を含みます。
3.2.1. UIEvent インターフェイス
DOM Level 2 で導入
UIEvent
インターフェイスは、ユーザーインターフェイスイベントに関連する特定のコンテキスト情報を提供します。
UIEvent
インターフェイスのインスタンスを生成するには、UIEvent コンストラクタを使用し、必要に応じて UIEventInit
辞書を渡します。
新しく定義されるイベントについては、ユーザーインターフェイスに関連するからといって UIEvent
インターフェイスを必ず継承する必要はありません。UIEventInit
のメンバーがそのイベントに意味を持つ場合のみ継承してください。
3.2.1.1. UIEvent
[Exposed =Window ]interface :
UIEvent Event {(
constructor DOMString ,
type optional UIEventInit = {});
eventInitDict readonly attribute Window ?;
view readonly attribute long ; };
detail
UIEvent . view
-
view
属性は、そのイベントが生成されたWindow
を示します。この属性の 未初期化値 は
null
でなければなりません。 UIEvent . detail
-
Event
の種類に応じて、そのイベントに関する詳細情報を指定します。この属性の 未初期化値 は
0
でなければなりません。
3.2.1.2. UIEventInit
dictionary :
UIEventInit EventInit {Window ?=
view null ;long = 0; };
detail
UIEventInit . view
- この値は、このイベントが発火されるグローバル環境の Window オブジェクトに初期化すべきです。このイベントが要素に対して発火される場合は、view プロパティはその要素の
ownerDocument
を含む Window オブジェクトに設定します。 UIEventInit . detail
- この値はアプリケーション固有の数値で初期化されます。
3.2.2. UIEvent のアルゴリズム
3.2.2.1. UIEvent を初期化する
- 入力
-
event:初期化する
UIEvent
eventType:イベント型を含む DOMString
eventTarget:イベントの
EventTarget
bubbles:このイベントがバブリングする場合は true
cancelable:このイベントがキャンセル可能な場合は true
- 出力
-
なし
-
基本となる
Event
属性を初期化します:-
Event を初期化する を event, eventType, bubbles, cancelable で呼び出す
-
event.
target
に eventTarget を設定
-
-
以下の公開属性を初期化します:
-
以下の歴史的属性を初期化します:
-
event.
which
に 0 を設定(MouseEvent
とKeyboardEvent
の両方で使用)
-
3.2.3. UIEvent 型
ユーザーインターフェイスイベント型を以下に示します。これらのイベントの一部は、ユーザーインターフェイスから生成された場合 UIEvent
インターフェイスを使用しますが、詳細は各イベントごとに記載されています。
3.2.3.1. load
型 | load
|
---|---|
インターフェイス | UIEvent
(ユーザーインターフェイスから生成された場合)、それ以外は Event
|
同期 / 非同期 | 非同期 |
バブリング | いいえ |
信頼できるターゲット | Window 、Document 、Element
|
キャンセル可能 | いいえ |
デフォルト動作 | なし |
コンテキスト (信頼イベント) |
DOM実装がリソース(例:ドキュメント)および依存リソース(画像、スタイルシート、スクリプトなど)の読み込みを完了したとき、user
agent
はこのイベントを発火しなければなりません。依存リソースのロード失敗は、親リソースがDOM経由でアクセス可能であれば、このイベントの発火を妨げてはなりません。このイベント型が発火される場合、少なくとも
Document
ノードでこのイベントを発火する必要があります。
旧来の理由により、ドキュメント内のリソース(例:画像)に対する load
イベントは、HTML 実装では伝播パスに Window を含みません。詳細は [HTML5] を参照してください。
3.2.3.2. unload
型 | unload
|
---|---|
インターフェイス | UIEvent
(ユーザーインターフェイスから生成された場合)、それ以外は Event
|
同期 / 非同期 | 同期 |
バブリング | いいえ |
信頼できるターゲット | Window 、Document 、Element
|
キャンセル可能 | いいえ |
デフォルト動作 | なし |
コンテキスト (信頼イベント) |
DOM実装が環境からリソース(例:ドキュメント)や依存リソース(画像、スタイルシート、スクリプトなど)を除去したとき、user
agent はこのイベントを発火しなければなりません。このイベント型の発火後にドキュメントはアンロードされる必要があります。このイベント型が発火される場合、少なくとも
Document
ノードでこのイベントを発火する必要があります。
3.2.3.3. abort
型 | abort
|
---|---|
インターフェイス | UIEvent
(ユーザーインターフェイスから生成された場合)、それ以外は Event
|
同期 / 非同期 | 同期 |
バブリング | いいえ |
信頼できるターゲット | Window 、Element
|
キャンセル可能 | いいえ |
デフォルト動作 | なし |
コンテキスト (信頼イベント) |
リソースのロードが中断されたとき(例:ユーザーがロード中にキャンセルした場合)、user agent はこのイベントを発火しなければなりません。
3.2.3.4. error
型 | error
|
---|---|
インターフェイス | UIEvent
(ユーザーインターフェイスから生成された場合)、それ以外は Event
|
同期 / 非同期 | 非同期 |
バブリング | いいえ |
信頼できるターゲット | Window 、Element
|
キャンセル可能 | いいえ |
デフォルト動作 | なし |
コンテキスト (信頼イベント) |
リソースのロードに失敗した場合や、ロードされたが意味的に解釈できない場合(例:不正な画像、スクリプト実行エラー、非整形式XMLなど)、user agent はこのイベントを発火しなければなりません。
3.2.3.5. select
型 | select
|
---|---|
インターフェイス | UIEvent
(ユーザーインターフェイスから生成された場合)、それ以外は Event
|
同期 / 非同期 | 同期 |
バブリング | はい |
信頼できるターゲット | Element
|
キャンセル可能 | いいえ |
デフォルト動作 | なし |
コンテキスト (信頼イベント) |
ユーザーがテキストを選択したとき、user agent はこのイベントを選択後に発火しなければなりません。
本仕様では選択されたテキストへのアクセスに関するコンテキスト情報は提供しません。該当する場合、ホスト言語は、ユーザーがどのように内容を選択できるか(国際的な言語慣習も考慮)、select
イベントがどのタイミングで発火されるか、コンテンツ著者がユーザー選択内容にどのようにアクセスできるかを定義するべきです。
ユーザー選択内容へアクセスするには、コンテンツ著者は ホスト言語のネイティブ機能(HTML 編集APIの Document.getSelection()
メソッドなど)を使用します。[Editing]
select
イベントはすべての要素や言語で利用できるとは限りません。例えば [HTML5] では select
イベントはフォームの
input
や
textarea
要素でのみ発火できます。
実装は、フォームコントロール外のテキスト選択やSVGなどの画像やマークアップ選択など、適切と判断されるコンテキストで select
イベントを発火してもかまいません。
3.3. フォーカスイベント
このインターフェイスと関連するイベント型、および § 3.3.2 フォーカスイベント順序は、User Agent Accessibility Guidelines 2.0 [UAAG20] で定義された概念・指針に基づいて設計されています。 特に フォーカスメカニズム や glossary の focus の定義に注意しています。
3.3.1. FocusEvent インターフェイス
本仕様で導入
FocusEvent
インターフェイスは、フォーカスイベントに関連する特定のコンテキスト情報を提供します。
FocusEvent
インターフェイスのインスタンスを生成するには、FocusEvent コンストラクタを使用し、必要に応じて FocusEventInit
辞書を渡します。
3.3.1.1. FocusEvent
[Exposed =Window ]interface :
FocusEvent UIEvent {(
constructor DOMString ,
type optional FocusEventInit = {});
eventInitDict readonly attribute EventTarget ?; };
relatedTarget
FocusEvent . relatedTarget
-
イベントの種類に応じて、フォーカスイベントに関連する二次的な
EventTarget
を識別するために使用します。ネストされたブラウジングコンテキストとのセキュリティ上の理由から、入出時に関連する
EventTarget
はnull
であるべきです。この属性の 未初期化値 は
null
でなければなりません。
3.3.1.2. FocusEventInit
dictionary :
FocusEventInit UIEventInit {EventTarget ?=
relatedTarget null ; };
FocusEventInit . relatedTarget
-
relatedTarget
は、focus
やfocusin
イベントの場合はフォーカスを失う要素、blur
やfocusout
イベントの場合はフォーカスを得る要素に初期化してください。
3.3.2. フォーカスイベント順序
本仕様で定義されるフォーカスイベントは、相互間で一定の順序で発生します。以下は、フォーカスが要素間で移動する典型的なイベントシーケンスです(最初はどの要素にもフォーカスがないと仮定):
イベント型 | 備考 | |
---|---|---|
ユーザーがフォーカスを移動 | ||
1 | focus
| 最初のターゲット要素がフォーカスを受け取った後に送信 |
2 | focusin
| focusイベントの直後 |
ユーザーがフォーカスを移動 | ||
3 | blur
| 最初のターゲット要素がフォーカスを失った後に送信 |
4 | focusout
| blurイベントの直後 |
5 | focus
| 2番目のターゲット要素がフォーカスを受け取った後に送信 |
6 | focusin
| focusイベントの直後 |
本仕様では focus()
や blur()
といったメソッドを使った場合のフォーカスイベントの動作は定義しません。該当メソッドが定義されている仕様を参照してください。
3.3.3. ドキュメントフォーカスとフォーカスコンテキスト
このイベントモジュールには、ドキュメントの フォーカス の変更通知のイベント型が含まれます。フォーカスコンテキストには、次の3つの区分があります:
-
OSフォーカスコンテキスト:コンピュータ上で現在実行中の複数のアプリケーションのいずれかにフォーカスがある可能性があります。そのうちフォーカスを持つアプリケーションとしてブラウザが含まれる場合があります。
-
ブラウザがフォーカスを持つ場合、ユーザーは(例:Tabキーで)アプリケーションフォーカスコンテキストをブラウザのUIフィールド(Webサイトのロケーションバー、検索フィールド等)間で切り替えることができます。そのUIフィールドの一つがタブ内のドキュメントである場合があります。
-
ドキュメント自体がフォーカスを持つ場合、ドキュメントフォーカスコンテキストはドキュメント内の任意のフォーカス可能要素に設定できます。
本仕様で定義されるイベント型はドキュメントフォーカスのみを対象にしており、イベント詳細で識別される event target はウィンドウ内のドキュメント(または複数ドキュメント)の一部でなければならず、ブラウザやOSの一部であってはなりません(フォーカスコンテキスト間の切り替え時も同様)。
通常、ドキュメントには常にフォーカスされた要素(ドキュメント要素自身の場合も含む)と持続的な フォーカスリング があります。フォーカスコンテキスト間を切り替える場合も、ドキュメントの現在のフォーカス要素とフォーカスリングは通常そのまま維持されます。例えば、3つのフォーカス可能要素があるドキュメントで、2番目の要素がフォーカスされている場合に、ユーザーがOSのフォーカスを他アプリに移し、再びブラウザに戻しても、ドキュメント内では2番目の要素がフォーカスされており、Tabキー操作で3番目の要素にフォーカスが移ります。ホスト言語 は、特定の要素がフォーカスを受け取る条件や方法、フォーカスの変更手段や順序などを定義してもかまいません。例えば、ある場合はポインタ移動でフォーカスを得たり、他の場合はクリックが必要だったりします。フォーカスできない要素や、クリックのみでフォーカスできTabキーではできない要素もあり得ます。ドキュメントは複数のフォーカスリングを持つ場合もあり、他仕様でより複雑なフォーカスモデル(複数要素が同時にフォーカスを持つ等)が定義されることもあります。
3.3.4. フォーカスイベント型
フォーカスイベント型を以下に示します。
3.3.4.1. blur
型 | blur
|
---|---|
インターフェイス | FocusEvent
|
同期 / 非同期 | 同期 |
バブリング | いいえ |
信頼できるターゲット | Window 、Element
|
キャンセル可能 | いいえ |
composed | はい |
デフォルト動作 | なし |
コンテキスト (信頼イベント) |
|
user agent は、event target がフォーカスを失ったとき、このイベントを発火しなければなりません。フォーカスはこのイベント型の発火前に要素から取り除かれなければなりません。このイベント型は focusout に似ていますが、バブリングしません。
3.3.4.2. focus
型 | focus
|
---|---|
インターフェイス | FocusEvent
|
同期 / 非同期 | 同期 |
バブリング | いいえ |
信頼できるターゲット | Window 、Element
|
キャンセル可能 | いいえ |
composed | はい |
デフォルト動作 | なし |
コンテキスト (信頼イベント) |
|
user agent は、event target がフォーカスを受け取ったとき、このイベントを発火しなければなりません。フォーカスはこのイベント型の発火前に要素に付与されなければなりません。このイベント型は focusin に似ていますが、バブリングしません。
3.3.4.3. focusin
型 | focusin
|
---|---|
インターフェイス | FocusEvent
|
同期 / 非同期 | 同期 |
バブリング | はい |
信頼できるターゲット | Window 、Element
|
キャンセル可能 | いいえ |
composed | はい |
デフォルト動作 | なし |
コンテキスト (信頼イベント) |
|
user agent は、event target がフォーカスを受け取ったとき、このイベントを発火しなければなりません。event target はフォーカスを受け取った要素でなければなりません。focus イベントはこのイベント型の発火前に発火される必要があります。このイベント型は focus に似ていますが、バブリングします。
3.3.4.4. focusout
型 | focusout
|
---|---|
インターフェイス | FocusEvent
|
同期 / 非同期 | 同期 |
バブリング | はい |
信頼できるターゲット | Window 、Element
|
キャンセル可能 | いいえ |
composed | はい |
デフォルト動作 | なし |
コンテキスト (信頼イベント) |
|
user agent は、event target がフォーカスを失ったとき、このイベントを発火しなければなりません。event target はフォーカスを失った要素でなければなりません。blur イベントはこのイベント型の発火前に発火される必要があります。このイベント型は blur に似ていますが、バブリングします。
3.4. マウスイベント
マウスイベントモジュールは、[HTML401] の onclick
、ondblclick
、
onmousedown
、onmouseup
、onmouseover
、onmousemove
、
onmouseout
属性に由来します。本イベントモジュールは、マウスやトラックボールなどのポインティング入力デバイスで使用するために特化して設計されています。
3.4.1. MouseEvent インターフェイス
DOM Level 2 で導入され、本仕様で修正
MouseEvent
インターフェイスは、マウスイベントに関連する特定のコンテキスト情報を提供します。
ネストされた要素の場合、マウスイベントは常に最も深い入れ子の要素がターゲットとなります。
ターゲット要素の祖先は、イベントバブリングを利用して、その子孫要素内で発生したマウスイベントの通知を受け取ることができます。
MouseEvent
インターフェイスのインスタンスを生成するには、MouseEvent
コンストラクタを使用し、必要に応じて MouseEventInit
辞書を渡します。
MouseEvent
オブジェクトを initMouseEvent
で初期化する場合、実装は clientX
や clientY
などのクライアント座標を用いて他の座標(DOM Level 0 実装や独自属性、例:pageX
など)を計算することができます。
3.4.1.1. MouseEvent
[Exposed =Window ]interface :
MouseEvent UIEvent {(
constructor DOMString ,
type optional MouseEventInit = {});
eventInitDict readonly attribute long screenX ;readonly attribute long screenY ;readonly attribute long clientX ;readonly attribute long clientY ;readonly attribute long layerX ;readonly attribute long layerY ;readonly attribute boolean ctrlKey ;readonly attribute boolean shiftKey ;readonly attribute boolean altKey ;readonly attribute boolean metaKey ;readonly attribute short button ;readonly attribute unsigned short buttons ;readonly attribute EventTarget ?relatedTarget ;boolean getModifierState (DOMString ); };
keyArg
screenX
, 型: long, 読み取り専用-
イベントが発生したスクリーン座標系の原点からの水平座標。
この属性の 未初期化値 は
0
でなければなりません。 screenY
, 型: long, 読み取り専用-
イベントが発生したスクリーン座標系の原点からの垂直座標。
この属性の 未初期化値 は
0
でなければなりません。 clientX
, 型: long, 読み取り専用-
イベントが発生したビューポートに対する水平座標。
この属性の 未初期化値 は
0
でなければなりません。 clientY
, 型: long, 読み取り専用-
イベントが発生したビューポートに対する垂直座標。
この属性の 未初期化値 は
0
でなければなりません。 layerX
, 型: long, 読み取り専用-
祖先要素のうち、
積み重ねコンテキストであり、positionedであるか、
積み重ねコンテキストを描画する際に
positioned phase で描画する要素からの水平オフセット。
この属性の 未初期化値 は
0
でなければなりません。 layerY
, 型: long, 読み取り専用-
祖先要素のうち、
積み重ねコンテキストであり、positionedであるか、
積み重ねコンテキストを描画する際に
positioned phase で描画する要素からの垂直オフセット。
この属性の 未初期化値 は
0
でなければなりません。 ctrlKey
, 型: boolean, 読み取り専用-
KeyboardEvent
のctrlKey
属性を参照。この属性の 未初期化値 は
false
でなければなりません。 shiftKey
, 型: boolean, 読み取り専用-
KeyboardEvent
のshiftKey
属性を参照。この属性の 未初期化値 は
false
でなければなりません。 altKey
, 型: boolean, 読み取り専用-
KeyboardEvent
のaltKey
属性を参照。この属性の 未初期化値 は
false
でなければなりません。 metaKey
, 型: boolean, 読み取り専用-
KeyboardEvent
のmetaKey
属性を参照。この属性の 未初期化値 は
false
でなければなりません。 button
, 型: short, 読み取り専用-
マウスボタンの押下や解放によって発生するマウスイベントでは、
button
属性で、どのポインタデバイスのボタンが状態変化したかを示す必要があります。button
属性の値は以下の通りでなければなりません:-
0
:デバイスの主ボタン(一般的には左ボタン、または単一ボタンデバイスの場合は唯一のボタン。UIコントロールのアクティベートやテキスト選択に使用)または未初期化値。 -
1
:補助ボタン(一般的には中央ボタン、マウスホイールと組み合わせることが多い)。 -
2
:副ボタン(一般的には右ボタン、コンテキストメニュー表示に使用)。 -
3
:X1(戻る)ボタン。 -
4
:X2(進む)ボタン。
一部のポインティングデバイスはより多くのボタン状態を提供/シミュレートしており、
2
より大きい、または0
より小さい値がそのようなボタンを表す場合があります。button
の値は、マウスボタンの押下/解放で発生していないイベントでは更新されません。 このような場合、値0
を左ボタンと解釈せず、未初期化値として扱うよう注意してください。mousedown
やmouseup
などのイベントに関連する デフォルト動作 は使用するマウスボタンに依存します。この属性の 未初期化値 は
0
でなければなりません。 -
buttons
, 型: unsigned short, 読み取り専用-
すべてのマウスイベントで、
buttons
属性は現在押されているマウスボタンの組み合わせをビットマスクで示す必要があります。buttons
属性とbutton
属性は名前が似ていますが値の意味が大きく異なります。button
属性はmousedown
/mouseup
のイベントハンドラ中で妥当な値とされますが、buttons
属性は、どの信頼できるMouseEvent
オブジェクトでもマウスボタンの状態を反映します(「現在どのボタンも押されていない」状態は値0
で表現)。buttons
属性の値は以下の通りでなければなりません:-
0
:現在どのボタンも押されていない場合。 -
1
:デバイスの主ボタン(一般的には左ボタン、または単一ボタンデバイスの場合は唯一のボタン。UIコントロールのアクティベートやテキスト選択に使用)。 -
2
:副ボタン(一般的には右ボタン、コンテキストメニュー表示など)、該当する場合。 -
4
:補助ボタン(一般的には中央ボタン、マウスホイールと組み合わせることが多い)。
一部のポインティングデバイスはより多くのボタンを提供/シミュレートしており、そのようなボタンを表す場合は各ボタンごとに値を2倍(バイナリ系列
8
、16
、32
... )する必要があります。任意のボタン値の合計は一意の値となるため、コンテンツ著者はビット演算を用いて現在押されているボタン数や種類を判定できます。例えば値
3
は左ボタンと右ボタンが両方押されていること、値5
は左ボタンと中央ボタンが両方押されていることを示します。mousedown
やmouseup
などのイベントに関連する デフォルト動作 は使用するマウスボタンに依存します。この属性の 未初期化値 は
0
でなければなりません。 -
relatedTarget
, 型: EventTarget, 読み取り専用, nullable-
UIイベントの種類に応じて、二次的な
EventTarget
を識別するために使用します。この属性の 未初期化値 は
null
でなければなりません。 getModifierState(keyArg)
-
本仕様で導入
キー値を使ってモディファイアの状態を問い合わせます。
モディファイアキーでかつそのモディファイアが有効なら
true
、そうでなければfalse
を返します。- DOMString keyArg
-
KeyboardEvent
のgetModifierState()
メソッドの説明を参照してください。
3.4.1.2. MouseEventInit
dictionary :
MouseEventInit EventModifierInit {long screenX = 0;long screenY = 0;long clientX = 0;long clientY = 0;short button = 0;unsigned short buttons = 0;EventTarget ?relatedTarget =null ; };
screenX
, 型: long, デフォルトは0
-
screenX
属性(MouseEvent
オブジェクト)のユーザー画面上のマウスポインタの水平方向の相対位置を初期化します。イベントオブジェクトを指定したマウス位置に初期化しても、ユーザーのマウスポインタをその位置に移動してはなりません。
screenY
, 型: long, デフォルトは0
-
screenY
属性(MouseEvent
オブジェクト)のユーザー画面上のマウスポインタの垂直方向の相対位置を初期化します。イベントオブジェクトを指定したマウス位置に初期化しても、ユーザーのマウスポインタをその位置に移動してはなりません。
clientX
, 型: long, デフォルトは0
-
clientX
属性(MouseEvent
オブジェクト)のユーザーのブラウザのクライアントウィンドウに対するマウスポインタの水平方向の位置を初期化します。イベントオブジェクトを指定したマウス位置に初期化しても、ユーザーのマウスポインタをその位置に移動してはなりません。
clientY
, 型: long, デフォルトは0
-
clientY
属性(MouseEvent
オブジェクト)のユーザーのブラウザのクライアントウィンドウに対するマウスポインタの垂直方向の位置を初期化します。イベントオブジェクトを指定したマウス位置に初期化しても、ユーザーのマウスポインタをその位置に移動してはなりません。
button
, 型: short, デフォルトは0
-
button
属性(MouseEvent
オブジェクト)をマウスのボタン状態(数値)で初期化します。0は主マウスボタン、1は補助/中央ボタン、2は右ボタン。2より大きい値も可能ですが、本書では規定しません。
buttons
, 型: unsigned short, デフォルトは0
-
buttons
属性(MouseEvent
オブジェクト)を、アクティブとみなすべきマウスボタン(1つ以上)の数値で初期化します。buttons
属性はビットフィールドです。ビットフィールド値に対して1のマスク値がtrueの場合は主ボタン、2なら右ボタン、4なら補助/中央ボタンが押されていることを示します。JavaScriptで右ボタン(2)と中央ボタン(4)が同時に押されている場合、buttons値は
{ buttons: 2 | 4 }
または{ buttons: 6 }
relatedTarget
, 型: EventTarget, nullable, デフォルトはnull
-
relatedTarget
は、マウスポインタが直前に離れた要素(mouseover や mouseenter イベントの場合)や、マウスポインタが入った要素(mouseout、mouseleave、focusout イベントの場合)に初期化する必要があります。他のイベントではこの値は割り当て不要(デフォルトは null)。
マウスイベント生成時、現在のクリック数を管理しなければなりません。これは、特定の時間内にポインティングデバイスのボタンが連続してクリックされた回数を示す非負整数です。カウントがリセットされる遅延は環境設定に依存します。
3.4.2. イベント修飾子初期化辞書
MouseEvent
と KeyboardEvent
インターフェイスは、キーボード修飾子属性のセットを共有し、追加の修飾子状態取得メカニズムをサポートしています。次の辞書は、MouseEvent
および KeyboardEvent
インターフェイスのキーボード修飾子属性や getModifierState()
で問い合わせる追加修飾子状態を初期化するために利用できます。
この辞書を使ったイベント構築手順は MouseEvent constructors セクションで定義されています。
dictionary :
EventModifierInit UIEventInit {boolean ctrlKey =false ;boolean shiftKey =false ;boolean altKey =false ;boolean metaKey =false ;boolean modifierAltGraph =false ;boolean modifierCapsLock =false ;boolean modifierFn =false ;boolean modifierFnLock =false ;boolean modifierHyper =false ;boolean modifierNumLock =false ;boolean modifierScrollLock =false ;boolean modifierSuper =false ;boolean modifierSymbol =false ;boolean modifierSymbolLock =false ; };
ctrlKey
, 型: boolean, デフォルトはfalse
-
ctrlKey
属性(MouseEvent
またはKeyboardEvent
)をControl
修飾キーが有効ならtrue
、そうでなければfalse
に初期化します。true
の場合、イベントオブジェクトのキー修飾状態も初期化し、getModifierState()
やgetModifierState()
にControl
を渡した場合はtrue
を返すようにする必要があります。 shiftKey
, 型: boolean, デフォルトはfalse
-
shiftKey
属性(MouseEvent
またはKeyboardEvent
)をShift
修飾キーが有効ならtrue
、そうでなければfalse
に初期化します。true
の場合、イベントオブジェクトのキー修飾状態も初期化し、getModifierState()
やgetModifierState()
にShift
を渡した場合はtrue
を返すようにする必要があります。 altKey
, 型: boolean, デフォルトはfalse
-
altKey
属性(MouseEvent
またはKeyboardEvent
)をAlt
(オルタナティブ)やOption
修飾キーが有効ならtrue
、そうでなければfalse
に初期化します。true
の場合、イベントオブジェクトのキー修飾状態も初期化し、getModifierState()
やgetModifierState()
にAlt
を渡した場合はtrue
を返すようにする必要があります。 metaKey
, 型: boolean, デフォルトはfalse
-
metaKey
属性(MouseEvent
またはKeyboardEvent
)をMeta
修飾キーが有効ならtrue
、そうでなければfalse
に初期化します。true
の場合、イベントオブジェクトのキー修飾状態も初期化し、getModifierState()
やgetModifierState()
にMeta
を渡した場合はtrue
を返すようにする必要があります。 modifierAltGraph
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にAltGraph
を渡した場合はtrue
を返すようにする必要があります。 modifierCapsLock
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にCapsLock
を渡した場合はtrue
を返すようにする必要があります。 modifierFn
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にFn
を渡した場合はtrue
を返すようにする必要があります。 modifierFnLock
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にFnLock
を渡した場合はtrue
を返すようにする必要があります。 modifierHyper
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にHyper
を渡した場合はtrue
を返すようにする必要があります。 modifierNumLock
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にNumLock
を渡した場合はtrue
を返すようにする必要があります。 modifierScrollLock
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にScrollLock
を渡した場合はtrue
を返すようにする必要があります。 modifierSuper
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にSuper
を渡した場合はtrue
を返すようにする必要があります。 modifierSymbol
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にSymbol
を渡した場合はtrue
を返すようにする必要があります。 modifierSymbolLock
, 型: boolean, デフォルトはfalse
- イベントオブジェクトのキー修飾状態も初期化し、
getModifierState()
やgetModifierState()
にSymbolLock
を渡した場合はtrue
を返すようにする必要があります。
3.4.2.1. マウスイベントの構築
一般的に、Event
インターフェイス、またはEvent
インターフェイスから継承されたインターフェイスのコンストラクタが呼び出された場合、[DOM]で記述されている手順に従う必要があります。ただし、MouseEvent
インターフェイスは、Event
オブジェクトのキー修飾子(特に getModifierState()
メソッドで問い合わせる内部状態)を初期化するための追加辞書メンバーを提供します。このセクションは、DOM4で定義される新しい MouseEvent
オブジェクトの初期化手順に、これらのオプションの修飾子状態を補足します。
MouseEvent
の構築、または下記アルゴリズムでこれらのオブジェクトから派生したオブジェクトを構築する場合、
すべての MouseEvent
およびその派生オブジェクトは 内部キー修飾子状態 を持ち、キー修飾子名(修飾キー一覧表、[UIEvents-Key]参照)を利用して設定・取得できます。
以下の手順は、DOM4で定義されるイベント構築アルゴリズムを補足します:
-
構築される
Event
がMouseEvent
オブジェクト、またはそれを継承したオブジェクトであり、 コンストラクタにEventModifierInit
引数が指定された場合、以下のサブ手順を実行します:-
各
EventModifierInit
引数に対して、辞書メンバー名が"modifier"
で始まる場合、キー修飾子名を、プレフィックス"modifier"
を除いた辞書メンバー名とし、Event
オブジェクトの内部キー修飾子状態のうち、キー修飾子名に一致するものを対応する値で設定する。
-
3.4.3. MouseEventアルゴリズム
3.4.3.1. ネイティブOS要件
このセクションのアルゴリズムは、ネイティブプラットフォームOSが下記を提供することを前提とします:
-
マウスが移動したときのイベント(ネイティブマウス移動の処理で扱う)
-
マウスボタンが押されたときのイベント(ネイティブマウス押下の処理で扱う)
-
マウスボタンが離されたときのイベント(ネイティブマウス解放の処理で扱う)
-
マウスボタンの押下が「クリック」として解釈されるべき時を識別する手段(ネイティブマウスクリックの処理で扱う)
-
例えば、フラグや独立したイベントとして
-
独立した「クリック」イベントが発火される場合、ネイティブOSは対応する「マウスアップ」イベントの直後、他のマウス関連イベントを挟まずに発火する
-
-
マウスクリックが「ダブルクリック」として解釈されるべき時を識別する手段(ネイティブマウスダブルクリックの処理で扱う)
これらのイベントでは、OSは以下の情報を提供できる必要があります:
-
ネイティブOSデスクトップに対するx,yマウス座標
-
UAのウィンドウビューポートに対するx,yマウス座標
-
現在押されているキーボード修飾キー
3.4.3.2. MouseEventのグローバル状態
3.4.3.2.1. ユーザーエージェントレベルの状態
UAは、ユーザーエージェント全体で共有される以下の値を管理しなければなりません。
マウスボタンの現在の状態を追跡する マウスボタン・ビットマスク。
3.4.3.2.2. ウィンドウレベルの状態
UAは、ウィンドウで共有される以下の値を管理しなければなりません。
直近でMouseEventを送信した Element
を追跡する last mouse
element(初期値は未定義)。
直近でMouseEventが送信された際のlast mouse DOM path(初期値は空)。これは last mouse element の祖先 Element
のスナップショットを保持します。
3.4.3.3. MouseEventの内部状態
MouseEvent
は、各種修飾キーの状態を追跡するための以下の内部フラグを持ちます:shiftフラグ、controlフラグ、altフラグ、altgraphフラグ、
metaフラグ。
これらはマウスイベント発生時に対応する修飾キーが押されていた場合に設定されます。
3.4.3.4. MouseEventを初期化する
- 入力
-
event:初期化する
MouseEvent
eventType:イベント型を含むDOMString
eventTarget:イベントの
EventTarget
bubbles:このイベントがバブリングする場合はtrue
cancelable:このイベントがキャンセル可能な場合はtrue
- 出力
-
なし
-
UIEventを初期化するを event, eventType, eventTarget, bubbles, cancelable で呼び出す。
-
以下の公開属性を初期化:
-
event.
screenX
= イベント発生位置のデスクトップ原点からのx座標 -
event.
screenY
= イベント発生位置のデスクトップ原点からのy座標 -
マウスイベント修飾子の設定を event に対して行う
-
event.
button
= 0 -
event.
buttons
= マウスボタン・ビットマスク
-
-
MouseEvent用のPointerLock属性を初期化するを event に対して行う
3.4.3.5. マウスイベント修飾子を設定する
- 入力
-
event、更新対象の
MouseEvent
- 出力
-
なし
-
key modifier state に "Shift" が含まれていれば event の shift flag を設定し、そうでなければ解除する
-
key modifier state に "Control" が含まれていれば event の control flag を設定し、そうでなければ解除する
-
key modifier state に "Alt" が含まれていれば event の alt flag を設定し、そうでなければ解除する
-
key modifier state に "AltGraph" が含まれていれば event の altgraph flag を設定し、そうでなければ解除する
-
key modifier state に "Meta" が含まれていれば event の meta flag を設定し、そうでなければ解除する
-
event の
shiftKey
を、event の shift flag が設定されていれば true、そうでなければ false にする -
event の
ctrlKey
を、event の control flag が設定されていれば true、そうでなければ false にする -
event の
altKey
を、event の alt flag または altgraph flag が設定されていれば true、そうでなければ false にする -
event の
metaKey
を、event の meta flag が設定されていれば true、そうでなければ false にする
3.4.3.6. キャンセル可能な MouseEvent を作成する
- 入力
-
eventType、有効な
MouseEvent
型を含む DOMStringeventTarget、イベントの
EventTarget
- 出力
-
なし
-
bubbles を "true" にする
-
cancelable を "true" にする
-
event =
MouseEvent
を使用して 新しいイベントを作成した結果とする -
MouseEvent を初期化する(event, eventType, eventTarget, bubbles, cancelable を使用)
-
event を返す
3.4.3.7. キャンセル不可な MouseEvent を作成する
- 入力
-
eventType、有効な
MouseEvent
型を含む DOMStringeventTarget、イベントの
EventTarget
- 出力
-
なし
-
bubbles を "false" にする
-
cancelable を "false" にする
-
event =
MouseEvent
を使用して 新しいイベントを作成した結果とする -
MouseEvent を初期化する(event, eventType, eventTarget, bubbles, cancelable を使用)
-
event を返す
3.4.3.8. MouseEvent の button 属性を計算する
- 入力
-
mbutton、マウスボタンを識別する ID
- 出力
-
MouseEvent
のbutton
属性に格納するのに適したボタン ID
-
mbutton が主ボタンなら 0 を返す
-
mbutton が補助(中央)ボタンなら 1 を返す
-
mbutton が副ボタンなら 2 を返す
-
mbutton が X1(戻る)ボタンなら 3 を返す
-
mbutton が X2(進む)ボタンなら 4 を返す
3.4.3.9. MouseEvent の属性をネイティブから設定する
- 入力
-
event、初期化する
MouseEvent
native、ネイティブのマウスイベント
- 出力
-
なし
TODO
-
event の
type
が [mousedown, mouseup] のいずれかであれば、-
native から押されたマウスボタンを識別する ID(mbutton)を取得する
-
event の
button
に MouseEvent の button 属性を計算する (mbutton) の結果を設定する
-
3.4.3.10. ネイティブのマウスダウンを処理する
- 入力
-
native、ネイティブの mousedown
- 出力
-
なし
-
mbutton を native から取得し、押されたマウスボタンを識別する ID とする
-
マウスボタンのビットマスク を次のように更新する:
-
mbutton が主ボタンなら 0x01 ビットをセットする
-
mbutton が副ボタンなら 0x02 ビットをセットする
-
mbutton が補助(中央)ボタンなら 0x04 ビットをセットする
他のボタンは 0x08 から追加可能
-
-
target = ヒットテスト(native からビューポート相対座標で)
-
event = キャンセル可能な MouseEvent を作成する("mousedown", target)
-
MouseEvent の属性をネイティブから設定する(native)
-
pointerdown イベントを送信する可能性(event)
-
result = event を target でディスパッチする
-
result が true かつ target が フォーカス可能領域 かつ クリックでフォーカス可能 なら
-
フォーカス手順 を target で実行する
-
-
mbutton が副ボタンなら
-
コンテキストメニューを表示する可能性(native, target)
-
3.4.3.11. ネイティブのマウスアップを処理する
- 入力
-
native、ネイティブの mouseup
- 出力
-
なし
mousedown と mouseup の間に他のマウスイベントが発生することがある。
-
mbutton を native から取得し、押されたマウスボタンを識別する ID とする
-
マウスボタンのビットマスク を次のように更新する:
-
mbutton が主ボタンなら 0x01 ビットをクリアする
-
mbutton が副ボタンなら 0x02 ビットをクリアする
-
mbutton が補助(中央)ボタンなら 0x04 ビットをクリアする
-
-
target = ヒットテスト(native からビューポート相対座標で)
-
event = キャンセル可能な MouseEvent を作成する("mouseup", target)
-
MouseEvent の属性をネイティブから設定する(native)
-
pointerup イベントを送信する可能性(event)
3.4.3.12. ネイティブのマウスクリックを処理する
- 入力
-
native、ネイティブのマウスクリック
- 出力
-
なし
プラットフォームは ネイティブのマウスアップを処理する の直後に、クリックが発生する mouseup に対してこれを呼び出すべき。
-
target = ヒットテスト(native からビューポート相対座標で)
-
クリックイベントを送信する(native, target)
3.4.3.13. クリックイベントを送信する
- 入力
-
native、ネイティブの mousedown
target、イベントの
EventTarget
- 出力
-
なし
-
mbutton = 1(デフォルトは主マウスボタン)
-
native が有効なら
-
mbutton を native から取得し、押されたマウスボタンを識別する ID とする
-
-
mbutton が主ボタンなら eventType = "click"、それ以外なら "auxclick" に設定する
-
event = PointerEvent を作成する(eventType, target)
-
native が有効なら
-
MouseEvent の属性をネイティブから設定する(event, native)
-
event の
screenX
が整数値でない場合は丸める -
event の
screenY
が整数値でない場合は丸める
-
PointerEvents と丸めた座標については pointerevents/100 を参照。
「デフォルトアクション」はディスパッチ中、target の activation behavior アルゴリズムによって処理されるため、ここでは対応不要。 ただし disabled/css-pointer-events/inert/... について既存仕様で対応できているか要確認。
`HTMLelement.click()` を処理するには native = null, target = `HTMLelement` で本アルゴリズムを呼び出す。
キーボードによるクリックは native = null, target = 現在フォーカス中の要素で本アルゴリズムを呼び出す。
3.4.3.14. ネイティブのマウスダブルクリックを処理する
- 入力
-
native、ネイティブのマウスダブルクリック
- 出力
-
なし
ダブルクリックが発生したクリックの直後にこれを呼び出すべき。
-
mbutton を native から取得し、押されたマウスボタンを識別する ID とする
-
mbutton が主ボタンでなければ return
-
target = ヒットテスト(native からビューポート相対座標で)
-
event = PointerEvent を作成する("dblclick", target)
-
MouseEvent の属性をネイティブから設定する(event, native)
-
event の
screenX
が整数値でない場合は丸める -
event の
screenY
が整数値でない場合は丸める
3.4.3.15. ネイティブのマウスムーブを処理する
- 入力
-
native、ネイティブのマウスムーブ
- 出力
-
なし
このアルゴリズムは PointerEvents のディスパッチについて仮定しているが、現時点では明示的に規定されていない。pointerevents/285 が解決されたら更新が必要かもしれない。
-
target = ヒットテスト(native からビューポート相対座標で)
-
targetDomPath = DOM パスを計算する
-
現在の要素から離れるイベントを生成する:
-
last mouse element が定義されていて target と異なる場合、
-
mouseout = キャンセル可能な MouseEvent を作成する("mouseout", last mouse element)
TODO: native から mouseout の属性を設定する。+CSSOM 属性も
-
pointerout イベントを送信する可能性(mouseout)
-
キャンセル時の挙動要確認(影響はないように見える)。
-
leaveElements = last mouse DOM path のコピーから targetDomPath と共通な要素をすべて除いたもの。
-
leaveElements の各 element について:
element が削除された場合や移動された場合の挙動要確認。DOM 変化で mouseleave が発火すべきか、今送るべきか、送らず無視すべきか。現行ブラウザの挙動要調査。
-
mouseleave = キャンセル不可な MouseEvent を作成する("mouseleave", element)
-
mouseleave.
composed
= false互換性要確認: event.composed の値。仕様は false。Chrome/Linux は true、Firefox/Linux は false。
-
pointerleave イベントを送信する可能性(mouseleave)
-
result = mouseleave を element でディスパッチする
-
-
-
-
新しい要素に入るイベントを生成する:
-
target が last mouse element と異なる場合、
-
mouseover = キャンセル可能な MouseEvent を作成する("mouseover", target)
TODO: native から mouseout の属性を設定する。+CSSOM 属性も
-
pointerover イベントを送信する可能性(mouseover)
-
キャンセル時の挙動要確認(影響はないように見える)。
-
enterElements = targetDomPath のコピーから last mouse DOM path と共通な要素をすべて除いたもの。
-
enterElements の各 element について:
element が削除/移動された場合の挙動要確認。
-
mouseenter = キャンセル不可な MouseEvent を作成する("mouseenter", element)
-
mouseenter.
composed
= false互換性要確認: event.composed の値。仕様は false。Chrome/Linux は true、Firefox/Linux は false。
-
pointerenter イベントを送信する可能性(mouseenter)
shadow DOM 要素での互換性要確認。Chrome/Linux は element および shadow root 両方にこのイベントを発火する。
-
result = mouseenter を element でディスパッチする
-
-
last mouse element を target に設定
-
last mouse DOM path を targetDomPath に設定
-
-
-
mousemove = キャンセル可能な MouseEvent を作成する("mousemove", element)
-
pointermove イベントを送信する可能性(mousemove)
3.4.3.16. コンテキストメニューを表示する可能性
- 入力
-
native、ネイティブの mousedown または pointer イベント
target、イベントの
EventTarget
- 出力
-
なし
-
menuevent = PointerEvent を作成する("contextmenu", target)
-
native が有効なら
-
MouseEvent の属性をネイティブから設定する(native)
-
-
result = menuevent を target でディスパッチする
-
result が true なら UA のコンテキストメニューを表示する
-
キーボードでコンテキストメニューを表示するには、native = null、target = 現在フォーカス中の要素で本アルゴリズムを呼び出す。
3.4.4. マウスイベント順序
この現行標準で定義される特定のマウスイベントは、互いに相対して一定の順序で発生しなければなりません。以下は、ポインティングデバイスのカーソルが要素上に移動したときに発生すべきイベントの順序を示します:
イベントタイプ | 要素 | 備考 | |
---|---|---|---|
1 | mousemove
| ||
ポインティングデバイスが要素Aに入る... | |||
2 | mouseover
| A | |
3 | mouseenter
| A | |
4 | mousemove
| A | 複数の mousemove
イベント
|
ポインティングデバイスが要素Aから出る... | |||
5 | mouseout
| A | |
6 | mouseleave
| A |
ポインティングデバイスが要素Aに入り、さらにネストされた要素Bに入り、再び外に出る場合、次のイベント順序が発生しなければなりません:
イベントタイプ | 要素 | 備考 | |
---|---|---|---|
1 | mousemove
| ||
ポインティングデバイスが要素Aに入る... | |||
2 | mouseover
| A | |
3 | mouseenter
| A | |
4 | mousemove
| A | 複数の mousemove
イベント
|
ポインティングデバイスがネストされた要素Bに入る... | |||
5 | mouseout
| A | |
6 | mouseover
| B | |
7 | mouseenter
| B | |
8 | mousemove
| B | 複数の mousemove
イベント
|
ポインティングデバイスが要素BからAに戻る... | |||
9 | mouseout
| B | |
10 | mouseleave
| B | |
11 | mouseover
| A | |
12 | mousemove
| A | 複数の mousemove イベント
|
ポインティングデバイスが要素Aから出る... | |||
13 | mouseout
| A | |
14 | mouseleave
| A |
要素はCSSで視覚的に重ねることができます。次の例では、A・B・Cの3つの要素がページ上で同じ寸法・絶対位置に配置されています。CはBの子要素、BはAの子要素です:
ポインティングデバイスが要素スタック外からC(一番上の要素)に入り、その後外に出る場合、次のイベントが発生しなければなりません:
イベントタイプ | 要素 | 備考 | |
---|---|---|---|
1 | mousemove
| ||
ポインティングデバイスがスタックの最上位要素Cに入る | |||
2 | mouseover
| C | |
3 | mouseenter
| A | |
4 | mouseenter
| B | |
5 | mouseenter
| C | |
6 | mousemove
| C | 複数の mousemove イベント
|
ポインティングデバイスが要素Cから外に出る... | |||
7 | mouseout
| C | |
8 | mouseleave
| C | |
9 | mouseleave
| B | |
10 | mouseleave
| A |
mouseover
/mouseout
イベントは一度だけ発火し、 mouseenter
/mouseleave
イベントは3回(各要素ごと)発火します。
ボタン(マウスやトラックパッドなど)の押下・解放が要素上で行われた場合、一般的なイベント順序は以下の通りです:
イベントタイプ | 備考 | |
---|---|---|
1 | mousedown
| |
2 | mousemove
| 任意、複数回発生、制限あり |
3 | mouseup
| |
4 | click
| |
5 | mousemove
| 任意、複数回発生、制限あり |
6 | mousedown
| |
7 | mousemove
| 任意、複数回発生、制限あり |
8 | mouseup
| |
9 | click
| |
10 | dblclick
|
mousedown
と mouseup
間に許容される mousemove
イベントの遅延や回数・距離は実装やデバイス・プラットフォームによって異なります。この許容値は、揺れる手など身体障害を持つユーザーがポインティングデバイスを操作する際の補助となります。
各実装は適切な ヒステリシス許容値を決定しますが、一般的には mousedown
および mouseup
のイベントターゲットが同一要素で、その間に mouseout
または mouseleave
が挟まれなければ click
および dblclick
をその要素で発火すべきです。また、mousedown
とmouseup
のターゲット要素が異なる場合は、最近傍の共通包括祖先で click
および dblclick
を発火すべきです。
例えば、mousedown
イベントがHTML文書のbody要素に対して発生し、対応するmouseup
イベントがルート要素に対して発生した場合、最も近い共通包括祖先であるルート要素でclick
イベントがディスパッチされます。
イベントターゲット(たとえばターゲット要素)がマウスイベント順序中にDOMから削除された場合、その要素に対する残りのイベントは発火されてはなりません。
例えば、ターゲット要素がmousedown
イベントの結果としてDOMから削除された場合、mouseup
、click
、dblclick
、またはデフォルトアクティベーションイベントはその要素ではディスパッチされません。ただし、mouseup
イベントは、初期ターゲット要素の削除後にマウスにさらされる要素で発火されます。同様に、ターゲット要素がmouseup
イベントのディスパッチ中に削除された場合、click
およびそれ以降のイベントは発火されません。
3.4.5. マウスイベント型
マウスイベント型は以下に列挙されています。ネストされた要素の場合、マウスイベント型は常に最も深くネストされた要素がターゲットとなります。ターゲット要素の祖先は、バブリングを利用して、その子孫要素内で発生したマウスイベントの通知を受け取ることができます。
3.4.5.1. auxclick
型 | auxclick
|
---|---|
インターフェース | PointerEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | 要素による |
コンテキスト (信頼されたイベント) |
|
auxclick
イベント型は、ポインタが示す 最上位イベントターゲットで、非主ボタンが押下および解放されたとき、または同様の動作がシミュレートされた場合にディスパッチされなければなりません。マウスボタンの作動方法は、ポインタデバイスと環境設定によって異なります。たとえば、画面位置やボタンの押下・解放の遅延に依存する場合があります。
auxclick
イベントは非主ボタン(button
値が0
以外、buttons
値が1
より大きい)の場合のみ発火すべきです。主ボタン(標準マウスの左ボタンなど)では
auxclick
イベントは発火してはなりません。主ボタンに対応するイベントは click
を参照してください。
auxclick
イベントは、同一要素で mousedown
および mouseup
イベントの後に発生する場合があります(テキストノードなど他のノード型の変更は無視)。環境設定によっては、 auxclick
イベントは mouseover
、mousemove
、mouseout
のいずれかがボタン押下-解放間に発生していてもディスパッチされる場合があります。
auxclick
イベント型の デフォルトアクションは、イベントの イベントターゲットや button
、buttons
属性の値により異なります。一般的な デフォルトアクションは次の通りです:
-
イベントターゲットがアクティベーション挙動を持つ場合は、デフォルトアクションはそのアクティベーション挙動の実行としなければなりません。
中央ボタンの auxclick
を受け取り処理する例。
myLink.addEventListener("auxclick", function(e) {
if (e.button === 1) {
// これは例えばリンクを中央クリックしたとき新しいタブで開くなどの
// デフォルト挙動を防止します。
e.preventDefault();
// アプリに合わせてリンクやボタンを新規タブで開く等処理を行う。
// 例えばタブストリップ上でのタブを閉じるなど通常クリックで
// 行うべき操作もこの中で可能。
}
});
右ボタンの場合は、auxclick
イベントは contextmenu
イベントの後にディスパッチされます。コンテキストメニュー表示中は一部ユーザーエージェントがすべての入力イベントを抑制するため、auxclickがアプリで取得できないことがあります。詳しくは この例 を参照してください。
右ボタンの auxclick を受け取り処理する例
myDiv.addEventListener("contextmenu", function(e) {
// この呼び出しでコンテキストメニュー表示を防止し、
// ページがイベント受信できるようにします。
e.preventDefault();
});
myDiv.addEventListener("auxclick", function(e) {
if (e.button === 2) {
// アプリ内でカスタムコンテキストメニュー表示など
// 右ボタンのクリックに対する独自処理を行う。
}
});
3.4.5.2. click
型 | click
|
---|---|
インターフェース | PointerEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | 要素による |
コンテキスト (信頼されたイベント) |
|
click
イベント型は、ポインタが示す 最上位イベントターゲットで、主ボタンが押下および解放されたとき、または同様の動作がシミュレートされた場合にディスパッチされなければなりません。マウスボタンの作動方法はポインタデバイスと環境設定によって異なります。たとえば、画面位置やボタンの押下・解放の遅延に依存する場合があります。
click
イベントは主ボタン(button
値が0
、buttons
値が1
)の場合のみ発火すべきです。副ボタン(標準マウスの中央ボタンや右ボタンなど)では
click
イベントは発火してはなりません。副ボタンに対応するイベントは auxclick
を参照してください。
click
イベントは、同一要素で mousedown
および mouseup
イベントの後に発生する場合があります(テキストノードなど他のノード型の変更は無視)。環境設定によっては、 click
イベントは mouseover
、mousemove
、mouseout
のいずれかがボタン押下-解放間に発生していてもディスパッチされる場合があります。click
イベントの後に dblclick
イベントが発生する場合もあります。
例:ユーザーが大きな
line-height でスタイルされた <p>
要素のテキストノード子で mousedown
し、そのままマウスをわずかにずらしてテキストがない空間(同じテキストブロックの行間)に移動し、そこで mouseup した場合でも、通常の click
の時間的ヒステリシス内であれば、同じ要素範囲内で動作したとみなされ click
イベントが発火される可能性があります。ちなみに UA
が生成するマウスイベントはテキストノードではディスパッチされません。
ポインタデバイスと関連するだけでなく、click
イベント型は要素アクティベーションの一部としても必ずディスパッチされなければなりません。
最大限のアクセシビリティのため、コンテンツ著者はカスタムコントロールのアクティベーション動作を定義する際、click
イベント型を使用することが推奨されます。mousedown
やmouseup
など他のポインティングデバイスイベント型は、よりデバイス依存です。
click
イベント型は元々ポインタデバイス(例:マウス)に由来しますが、その後の実装拡張によりこの関連を超えて拡張されており、要素のアクティベーションに関してデバイス非依存のイベント型と考えられます。
click
イベント型の デフォルトアクションは、イベントの イベントターゲットや button
、buttons
属性の値により異なります。一般的な デフォルトアクションは次の通りです:
-
イベントターゲットがアクティベーション挙動を持つ場合は、デフォルトアクションはそのアクティベーション挙動の実行としなければなりません。
-
イベントターゲットがフォーカス可能な場合は、デフォルトアクションはその要素にドキュメントフォーカスを与えることとしなければなりません。
3.4.5.3. contextmenu
型 | contextmenu
|
---|---|
インターフェース | PointerEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | 対応している場合はコンテキストメニューを呼び出す |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、コンテキストメニューを呼び出す前にこのイベントをディスパッチしなければなりません。
contextmenu
イベントが右マウスボタンで発生した場合は、mousedown
イベントの後に contextmenu
イベントをディスパッチしなければなりません。
プラットフォームによっては、contextmenu
イベントが mouseup
イベントの前または後にディスパッチされることがあります。
3.4.5.4. dblclick
型 | dblclick
|
---|---|
インターフェース | MouseEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、ポインティングデバイスの主ボタンで要素上を2回クリックした場合にこのイベントをディスパッチしなければなりません。ダブルクリックの定義は環境設定によって異なりますが、イベントターゲットは
mousedown
、mouseup
、dblclick
の間で同じでなければなりません。このイベント型は、クリックとダブルクリックが同時に発生した場合は click
イベント型の後、そうでなければ mouseup
イベント型の後にディスパッチしなければなりません。
click
イベント同様、dblclick
イベントは主ボタンのみ発火すべきです。副ボタンでは dblclick
イベントは発火してはなりません。
click
イベントをキャンセルしても dblclick
イベントの発火には影響しません。
click
イベント型同様、デフォルトアクションは、イベントの イベントターゲットや button
、buttons
属性の値により異なります。典型的な デフォルトアクションは dblclick
イベント型も click
イベント型と同じです。
3.4.5.5. mousedown
型 | mousedown
|
---|---|
インターフェース | MouseEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | 状況による: ドラッグ&ドロップ操作開始; テキスト選択開始; スクロール/パン操作開始(中央マウスボタンと組み合わせた場合、対応している場合のみ) |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、ポインティングデバイスのボタンが要素上で押下されたときにこのイベントをディスパッチしなければなりません。
多くの実装ではmousedown
イベントを様々な状況依存のデフォルトアクション開始に用います。これらのデフォルトアクションはこのイベントがキャンセルされることで防止できます。デフォルトアクションの例として、画像やリンクのドラッグ&ドロップ開始、テキスト選択開始などがあります。さらに、中央マウスボタンが押されたときにパンニング機能を有効にする実装もあり、その際mousedown
イベントがディスパッチされます。
3.4.5.6. mouseenter
型 | mouseenter
|
---|---|
インターフェース | MouseEvent
|
同期 / 非同期 | 同期 |
バブリング | なし |
信頼されたターゲット | Element
|
キャンセル可能 | なし |
合成イベント | なし |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、ポインティングデバイスが要素またはその子孫要素の境界に入ったときにこのイベントをディスパッチしなければなりません。また、要素または子孫要素が主ポインティングデバイスの下に移動した場合もこのイベントをディスパッチしなければなりません。このイベント型はmouseover
と似ていますが、バブリングせず、ポインタデバイスが要素からその子孫要素の境界に移動した場合にはディスパッチしてはなりません。
このイベント型はCSSの:hover
疑似クラス [CSS2]と類似点があります。mouseleave
イベント型も参照してください。
3.4.5.7. mouseleave
型 | mouseleave
|
---|---|
インターフェース | MouseEvent
|
同期 / 非同期 | 同期 |
バブリング | なし |
信頼されたターゲット | Element
|
キャンセル可能 | なし |
合成イベント | なし |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、ポインティングデバイスが要素およびそのすべての子孫要素の境界から外れたときにこのイベントをディスパッチしなければなりません。また、要素またはその子孫が主ポインティングデバイスの下から外れた場合もこのイベントをディスパッチしなければなりません。このイベント型はmouseout
と似ていますが、バブリングせず、ポインティングデバイスが要素とそのすべての子の境界から外れるまでディスパッチしてはなりません。
このイベント型はCSSの:hover
疑似クラス [CSS2]と類似点があります。mouseenter
イベント型も参照してください。
3.4.5.8. mousemove
型 | mousemove
|
---|---|
インターフェース | MouseEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、ポインティングデバイスが要素上にある間に動かされたときにこのイベントをディスパッチしなければなりません。ポインティングデバイスが動いている間のイベント発火頻度は実装・デバイス・プラットフォーム依存ですが、持続的なポインタ動作には複数回連続してmousemove
イベントを発火すべきであり、マウスの動きごとに1回だけ発火するべきではありません。実装では応答性とパフォーマンスのバランスをとる最適な頻度を判断することが推奨されます。
ブラウザなど一部の実装環境では、ユーザーがドラッグ操作(例えばマウスボタンを押したまま)を開始した場合、ポインティングデバイスがユーザーエージェントの境界外に出てもmousemove
イベントが発火し続けることがあります。
このイベントは従来DOM Level 2 Eventsではキャンセル不可と規定されていましたが、現行ユーザーエージェント間の互換性を反映し変更されました。
3.4.5.9. mouseout
型 | mouseout
|
---|---|
インターフェース | MouseEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、ポインティングデバイスが要素または要素が主ポインティングデバイスの下から外れたときにこのイベントをディスパッチしなければなりません。このイベント型はmouseleave
と似ていますが、バブリングし、ポインティングデバイスが要素からその子孫要素の境界に移動したときにもディスパッチされなければなりません。
mouseover
イベント型も参照してください。
3.4.5.10. mouseover
型 | mouseover
|
---|---|
インターフェース | MouseEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、ポインティングデバイスが要素の境界に入ったとき、または要素が主ポインティングデバイスの下に移動したときにこのイベントをディスパッチしなければなりません。このイベント型はmouseenter
と似ていますが、バブリングし、ポインティングデバイスが要素の祖先要素(同じイベントターゲットのイベントリスナーインスタンス)から要素の境界に移動した場合にもディスパッチされなければなりません。
mouseout
イベント型も参照してください。
3.4.5.11. mouseup
型 | mouseup
|
---|---|
インターフェース | MouseEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、ポインティングデバイスのボタンが要素上で解放されたときにこのイベントをディスパッチしなければなりません。
一部の実装環境(例:ブラウザ)では、ポインティングデバイスがユーザーエージェントの境界外に出ていてもmouseup
イベントがディスパッチされることがあります(例:マウスボタンを押したままドラッグ操作を開始した場合)。
3.5. ホイールイベント
ホイールは1つ以上の空間軸で回転でき、ポインタデバイスに関連付けることができるデバイスです。座標系は環境設定によって異なります。
ユーザーの環境設定によっては、垂直スクロールがy軸回転、水平スクロールがx軸回転、ズームがz軸回転に対応している場合があります。
WheelEvent
オブジェクトの deltaX, deltaY, deltaZ
属性は、それぞれの軸方向での測定値をピクセル・行・ページ単位で示します。報告される測定値は、実際のホイールデバイスの回転・移動を環境固有のアルゴリズムで適切な値と単位に変換した後のものです。
ユーザーの環境設定により、ホイールデバイスの回転・移動の実際を様々な方法で解釈できます。一般的なギザギザ型マウスホイールの1回の動きで162ピクセル分の測定値が出ることがあります(162は例で、実際の値はユーザーエージェントの画面サイズ等で変動します)。ユーザーが設定を変更してマウスホイールの速度を速めることもできます。さらに、マウスホイールのソフトウェアは加速度(ホイール回転が速いほど各測定値のdeltaが大きくなる)やサブピクセル回転測定にも対応できます。このため、著者はあるユーザーエージェントでの回転量がすべてのユーザーエージェントで同じdelta値になるとは限らないことに注意してください。
deltaX, deltaY, deltaZ属性の値の符号(正負)は、ホイールデバイスが同じ方向に動いている間は複数回のwheel
イベント間で一貫していなければなりません。ユーザーエージェントがwheel
イベントのデフォルトアクションとしてスクロールを行う場合、符号は右手系座標系に従って、X・Y・Z軸の正方向が文書の右端・下端・奥(ユーザーから遠い)方向になるべきです。
ユーザーエージェントやハードウェア構成によって、同じ物理的ホイール操作の解釈は異なります。例えば、トラックパッド端で上から下へ垂直スワイプすると、ページを下にスクロールする動作(deltaYが正)かページを上にパンする動作(deltaYが負)のいずれかになります。
ユーザーエージェントは最初のホイールイベントが発火したとき、ホイールイベントトランザクションを生成しなければなりません。これにより実装固有の一定時間以内の後続ホイールイベントを同じ要素にターゲットできます。ホイールイベントトランザクションは1つのユーザー操作に関連付けられた一連のホイールイベントのことです。ホイールイベントトランザクションは最初のグループホイールイベント発生時点の最上位イベントターゲットを関連付けなければなりません。
スクロール可能な要素上で始まった一連のホイールイベントが、後続のユーザー操作で子要素上に移動することもあります。
3.5.1. WheelEventインターフェース
この現行標準で導入
WheelEvent
インターフェースはwheel
イベントに関連する特有のコンテキスト情報を提供します。
インスタンス生成には、WheelEvent
コンストラクタを使い、オプションでWheelEventInit
辞書を渡します。
3.5.1.1. WheelEvent
[Exposed =Window ]interface :
WheelEvent MouseEvent {(
constructor DOMString ,
type optional WheelEventInit = {}); // DeltaModeCode
eventInitDict const unsigned long DOM_DELTA_PIXEL = 0x00;const unsigned long DOM_DELTA_LINE = 0x01;const unsigned long DOM_DELTA_PAGE = 0x02;readonly attribute double deltaX ;readonly attribute double deltaY ;readonly attribute double deltaZ ;readonly attribute unsigned long deltaMode ; };
DOM_DELTA_PIXEL
- deltaの測定単位はピクセルでなければなりません。これはほとんどのOSや実装設定で最も一般的です。
DOM_DELTA_LINE
- deltaの測定単位はテキストの1行でなければなりません。多くのフォームコントロールでこれが使われます。
DOM_DELTA_PAGE
- deltaの測定単位はページ(単一画面または区切られたページ)でなければなりません。
deltaX
, 型 double, readonly-
ユーザーエージェントで
wheel
イベントのデフォルトアクションがスクロールの場合、この値はx軸方向(ピクセル・行・ページ単位)のスクロール量(イベントがキャンセルされなかった場合)でなければなりません。そうでなければ、ホイールデバイスのx軸回転の環境固有測定値です。この属性の未初期化値は
0.0
でなければなりません。 deltaY
, 型 double, readonly-
ユーザーエージェントで
wheel
イベントのデフォルトアクションがスクロールの場合、この値はy軸方向(ピクセル・行・ページ単位)のスクロール量(イベントがキャンセルされなかった場合)でなければなりません。そうでなければ、ホイールデバイスのy軸回転の環境固有測定値です。この属性の未初期化値は
0.0
でなければなりません。 deltaZ
, 型 double, readonly-
ユーザーエージェントで
wheel
イベントのデフォルトアクションがスクロールの場合、この値はz軸方向(ピクセル・行・ページ単位)のスクロール量(イベントがキャンセルされなかった場合)でなければなりません。そうでなければ、ホイールデバイスのz軸回転の環境固有測定値です。この属性の未初期化値は
0.0
でなければなりません。 deltaMode
, 型 unsigned long, readonly-
deltaMode
属性はdelta値の測定単位を示します。デフォルト値はDOM_DELTA_PIXEL
(ピクセル)です。この属性は、delta値の測定単位を示すDOM_DELTA定数のいずれかで設定されなければなりません。正確な測定単位はデバイス・OS・アプリケーション構成によって異なります。
この属性の未初期化値は
0
でなければなりません。
3.5.1.2. WheelEventInit
dictionary :
WheelEventInit MouseEventInit {double deltaX = 0.0;double deltaY = 0.0;double deltaZ = 0.0;unsigned long deltaMode = 0; };
deltaX
, 型 double, デフォルト0.0
-
deltaZ
属性を参照。 deltaY
, 型 double, デフォルト0.0
-
deltaZ
属性を参照。 deltaZ
, 型 double, デフォルト0.0
-
deltaZ
属性を初期化する。相対的な正の値(deltaX
やdeltaY
も)は右手系座標系によってX・Y・Z軸が文書の右端・下端・奥(ユーザーから遠い)方向になる。負の値は逆方向。 deltaMode
, 型 unsigned long, デフォルト0
-
deltaMode
属性を0,1,2の定数で初期化する。これは回転によってスクロールされるピクセル(DOM_DELTA_PIXEL
)、行(DOM_DELTA_LINE
)、ページ(DOM_DELTA_PAGE
)の量を表す。
3.5.2. ホイールイベント型
3.5.2.1. wheel
型 | wheel
|
---|---|
インターフェース | WheelEvent
|
同期 / 非同期 | 非同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | 状況による |
合成イベント | あり |
デフォルトアクション | 文書のスクロール(またはズーム) |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、マウスホイールがいずれかの軸で回転した時、または同等の入力デバイス(マウスボール、タブレット、タッチパッド等)が同じ動作をエミュレートした時、このイベントをディスパッチしなければなりません。プラットフォームや入力デバイスによっては、斜め方向のホイールdeltaが1回のwheel
イベントの複数軸値として、または各軸ごとに別のwheel
イベントとして配信されることがあります。
典型的なデフォルトアクションは、文書を指定量スクロール(または場合によってはズーム)することです。このイベントがキャンセルされた場合、実装は文書のスクロール・ズーム・その他現行標準で定めるデフォルト操作をしてはなりません。
一部のユーザーエージェントや入力デバイスでは、ホイールの回転速度がdelta値に影響し、速く回すほどdelta値が大きくなります。
3.5.2.2. ホイールイベントのキャンセル可否
wheelイベントでpreventDefault
を呼ぶことで、スクロールの防止や中断が可能です。最大限のスクロールパフォーマンスのため、ユーザーエージェントはスクロールに関連する各wheelイベントがキャンセルされるかどうか処理を待たない場合があります。その場合、cancelable
属性がfalse
のwheelイベントを生成し、preventDefault
ではスクロールの防止や中断ができないことを示します。そうでなければcancelable
はtrue
になります。
特に、ユーザーエージェントは非パッシブリスナーがないことを検知した場合、キャンセル不可のwheelイベントのみ生成すべきです。
3.6. 入力イベント
入力イベントは、ユーザーの操作(例:編集可能領域でのキーボード入力、テキスト削除やフォーマットなど)によってDOMが更新されたとき(または更新される直前)に通知として送信されます。
3.6.1. InputEventインターフェース
3.6.1.1. InputEvent
DOM Level 3で導入
[Exposed =Window ]interface :
InputEvent UIEvent {(
constructor DOMString ,
type optional InputEventInit = {});
eventInitDict readonly attribute USVString ?data ;readonly attribute boolean isComposing ;readonly attribute DOMString inputType ; };
data
, 型 USVString, readonly, nullable-
data
は入力メソッドによって生成された文字の値を保持します。これは1つのUnicode文字または空でないUnicode文字列列である場合があります [Unicode]。文字は NFC 正規化形式で正規化されるべきです。詳細は [UAX15]参照。 この属性は空文字列を含む場合があります。この属性の未初期化値は
null
でなければなりません。 isComposing
, 型 boolean, readonly-
true
の場合、この入力イベントは合成セッション中(compositionstart
イベント発生後、対応するcompositionend
イベント発生前)に発生したことを示します。この属性の未初期化値は
false
でなければなりません。 inputType
, 型 DOMString, readonly-
inputType
にはイベントに関連する入力の種類を表す文字列が入ります。この属性の有効値一覧は [Input-Events] 現行標準を参照。
この属性の未初期化値は空文字列
""
でなければなりません。
3.6.1.2. InputEventInit
dictionary :
InputEventInit UIEventInit {DOMString ?data =null ;boolean isComposing =false ;DOMString inputType = ""; };
data
, 型 DOMString, nullable, デフォルトnull
- InputEventオブジェクトの
data
属性を初期化する。 isComposing
, 型 boolean, デフォルトfalse
- InputEventオブジェクトの
isComposing
属性を初期化する。 inputType
, 型 DOMString, デフォルト""
- InputEventオブジェクトの
inputType
属性を初期化する。
3.6.2. 入力イベント順序
この現行標準で定義される入力イベントは、互いに相対して一定の順序で発生しなければなりません。
イベントタイプ | 備考 | |
---|---|---|
1 | beforeinput
| |
DOM要素が更新される | ||
2 | input
|
3.6.3. 入力イベント型
3.6.3.1. beforeinput
型 | beforeinput
|
---|---|
インターフェース | InputEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element (特にHTMLInputElement 等のコントロール型、またはcontenteditable 属性が有効なElement )
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | DOM要素の更新 |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、DOMが更新される直前にこのイベントをディスパッチしなければなりません。
3.6.3.2. input
型 | input
|
---|---|
インターフェース | InputEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element (特にHTMLInputElement 等のコントロール型、またはcontenteditable 属性が有効なElement )
|
キャンセル可能 | なし |
合成イベント | あり |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、DOMが更新された直後にこのイベントをディスパッチしなければなりません。
3.7. キーボードイベント
キーボードイベントはデバイス依存であり、入力デバイスの機能やOSでのマッピングに依存します。詳細やキーボードイベントと組み合わせたコンポジションイベントの使用例についてはキーボードイベントとキー値を参照してください。文字生成デバイスによってはキーボードイベントが生成されない場合があります。
キーボードイベントはテキスト入力の一つのモダリティに過ぎません。編集用途の場合は、InputEvent
をキーボードイベントの代替または補助として使用することも考慮してください。
3.7.1. KeyboardEventインターフェース
この現行標準で導入
KeyboardEvent
インターフェースはキーボードデバイスに関連する特有のコンテキスト情報を提供します。各キーボードイベントは値でキーを参照します。キーボードイベントは通常フォーカスを持つ要素に向けて送られます。
KeyboardEvent
インターフェースは、ctrlKey
、
shiftKey
、
altKey
、
metaKey
などの一般的な修飾キーに便利な属性を提供します。これらの属性は、それぞれgetModifierState()
をControl
, Shift
, Alt
,
Meta
で呼び出すのと同等です。
KeyboardEvent
インターフェースのインスタンスを生成するには、KeyboardEvent
コンストラクタにオプションでKeyboardEventInit
辞書を渡します。
3.7.1.1. KeyboardEvent
[Exposed =Window ]interface :
KeyboardEvent UIEvent {(
constructor DOMString ,
type optional KeyboardEventInit = {}); // KeyLocationCode
eventInitDict const unsigned long DOM_KEY_LOCATION_STANDARD = 0x00;const unsigned long DOM_KEY_LOCATION_LEFT = 0x01;const unsigned long DOM_KEY_LOCATION_RIGHT = 0x02;const unsigned long DOM_KEY_LOCATION_NUMPAD = 0x03;readonly attribute DOMString key ;readonly attribute DOMString code ;readonly attribute unsigned long location ;readonly attribute boolean ctrlKey ;readonly attribute boolean shiftKey ;readonly attribute boolean altKey ;readonly attribute boolean metaKey ;readonly attribute boolean repeat ;readonly attribute boolean isComposing ;boolean getModifierState (DOMString ); };
keyArg
DOM_KEY_LOCATION_STANDARD
-
キーの発動が左・右のバージョンの区別なく、かつ(
NumLock
キー以外は)テンキー由来でない場合、またはテンキー相当の仮想キー由来でない場合。PC 101キーUSキーボードの
Q
キー。
PC 101キーUSキーボードのNumLock
キー。
PC 101キーUSキーボードのメインセクションにある1
キー。 DOM_KEY_LOCATION_LEFT
- キーが左側のキー位置から発動した場合(同じキーが複数位置にある場合)。
DOM_KEY_LOCATION_RIGHT
- キーが右側のキー位置から発動した場合(同じキーが複数位置にある場合)。
DOM_KEY_LOCATION_NUMPAD
-
キーがテンキーまたはテンキー相当の仮想キーから発動した場合(同じキーが複数位置にある場合)。なお
NumLock
キーは常にlocation
にDOM_KEY_LOCATION_STANDARD
で符号化すること。 key
, 型 DOMString, readonly-
key
は押されたキーに対応するkey属性値を保持します。key
属性は旧来のkeyCode
属性とは無関係であり、値のセットも異なります。この属性の未初期化値は空文字列
""
でなければなりません。 code
, 型 DOMString, readonly-
code
は物理的に押されたキーを識別する文字列を保持します。値は現在のキーボードレイアウトや修飾キー状態に影響されず、特定キーは常に同じ値となります。この属性の未初期化値は空文字列
""
でなければなりません。 location
, 型 unsigned long, readonly-
location
属性はキーの論理的な位置を示します。この属性はDOM_KEY_LOCATION定数のいずれかでデバイス上のキー位置を示すよう設定しなければなりません。
ユーザーエージェントがキーのリマップを許可する場合、リマップ後のキーに適切な値を設定しなければなりません。例えば
"ControlLeft"
キーが"KeyQ"
キーにリマップされた場合はlocation
属性をDOM_KEY_LOCATION_STANDARD
に設定。逆に、"KeyQ"
キーがControl
キーのいずれかにリマップされた場合はlocation
属性をDOM_KEY_LOCATION_LEFT
またはDOM_KEY_LOCATION_RIGHT
に設定すること。この属性の未初期化値は
0
でなければなりません。 ctrlKey
, 型 boolean, readonly-
true
の場合、Control
(コントロール)修飾キーが有効だったことを示します。この属性の未初期化値は
false
でなければなりません。 shiftKey
, 型 boolean, readonly-
true
の場合、Shift
修飾キーが有効だったことを示します。この属性の未初期化値は
false
でなければなりません。 altKey
, 型 boolean, readonly-
true
の場合、Alt
(オルタナティブ、または"Option"
)修飾キーが有効だったことを示します。この属性の未初期化値は
false
でなければなりません。 metaKey
, 型 boolean, readonly-
true
の場合、Meta
修飾キーが有効だったことを示します。Macintoshシステムでは
"Command"
("⌘"
)修飾キーがこの修飾キーで表現されます。この属性の未初期化値は
false
でなければなりません。 repeat
, 型 boolean, readonly-
true
の場合、キーが持続的に押されていることを示します。キーを押し続けることで、keydown
、beforeinput
、input
がこの順序で、システム設定で定められた速度で繰り返し発火します。モバイルデバイスの長押し動作では、最初にrepeat
属性値がtrue
となるイベントが長押しの指標となります。繰り返し発生するまでの押下時間は環境設定依存です。この属性の未初期化値は
false
でなければなりません。 isComposing
, 型 boolean, readonly-
true
の場合、このキーイベントは合成セッション中(compositionstart
イベント発生後、対応するcompositionend
イベント発生前)に発生したことを示します。この属性の未初期化値は
false
でなければなりません。 getModifierState(keyArg)
-
修飾キーの状態をキー値で問い合わせます。
修飾キーの場合は有効なら
true
、それ以外ならfalse
を返します。- DOMString keyArg
-
修飾キー値。修飾キーはModifier Keys table([UIEvents-Key])で定義。
右左の修飾キーの区別をしたい場合は、キーボードイベントと
location
を併用して判別可能です。
3.7.1.2. KeyboardEventInit
dictionary :
KeyboardEventInit EventModifierInit {DOMString key = "";DOMString code = "";unsigned long location = 0;boolean repeat =false ;boolean isComposing =false ; };
key
, 型 DOMString, デフォルト""
- KeyboardEventオブジェクトの
key
属性を初期化します。すべての修飾キー(シフト状態など)を考慮した後のキーの意味を表すUnicode文字列です。これはキーの最終的な有効値となります。キーが印刷可能文字でない場合は、[UIEvents-Key]で定義されたキー値のいずれかであるべきです。 code
, 型 DOMString, デフォルト""
- KeyboardEventオブジェクトの
code
属性を初期化します。押されたキーを示すUnicode文字列で、キーボードレイアウト等の修飾状態を無視します。この値は[UIEvents-Code]で定義されたコード値のいずれかであるべきです。 location
, 型 unsigned long, デフォルト0
-
KeyboardEventオブジェクトの
location
属性を以下のいずれかの数値定数で初期化します:-
DOM_KEY_LOCATION_STANDARD
(数値 0) -
DOM_KEY_LOCATION_LEFT
(数値 1) -
DOM_KEY_LOCATION_RIGHT
(数値 2) -
DOM_KEY_LOCATION_NUMPAD
(数値 3)
-
repeat
, 型 boolean, デフォルトfalse
- KeyboardEventオブジェクトの
repeat
属性を初期化します。現在のKeyboardEventが長押しされた単一キーによる繰り返しイベント列の一部であればtrue
、そうでなければfalse
とします。 isComposing
, 型 boolean, デフォルトfalse
- KeyboardEventオブジェクトの
isComposing
属性を初期化します。このイベントが合成シーケンス中に発生した場合はtrue
、それ以外はfalse
とします。
keyCode
、charCode
、which
があります。
keyCode
はキーボード上の特定キーに関連付けられた数値値を示し、charCode
はそのキーに関連付けられたASCII値を示します(keyCode
と同じ場合もあり)。charCode
は文字値を生成するキーのみ適用されます。
実際には、keyCode
とcharCode
はプラットフォームや同じ実装でもOSやロケールによって一貫性がありません。この現行標準ではkeyCode
やcharCode
の値や挙動は定義しません。現行標準に準拠するUI
Events実装では、著者は代わりにkey
やcode
を使用してください。
詳細は参考付録旧来のキー属性を参照。
互換性維持のため、仮想キーボード(画面上のソフトウェアキーボード等)は物理キーがなくても通常の範囲のキーボードイベントを生成することが期待されます。
一部の実装やシステム構成では、IMEによってキーイベントや値が抑制される場合があります。
3.7.2. キーボードイベントのキー位置
location
属性は、左/右のShift
キーや物理矢印キーとテンキーの矢印キー(NumLock
オフ時)など、同じキー値が異なる物理キーで生成される場合の判別に使えます。
次の表は、キーボード上で複数位置を持つ特殊キーの有効なlocation
値を示します:
KeyboardEvent
. key
| 有効なlocation
値
|
---|---|
"Shift" ,
"Control" ,
"Alt" ,
"Meta"
| DOM_KEY_LOCATION_LEFT ,
DOM_KEY_LOCATION_RIGHT
|
"ArrowDown" ,
"ArrowLeft" ,
"ArrowRight" ,
"ArrowUp"
| DOM_KEY_LOCATION_STANDARD ,
DOM_KEY_LOCATION_NUMPAD
|
"End" ,
"Home" ,
"PageDown" ,
"PageUp"
| DOM_KEY_LOCATION_STANDARD ,
DOM_KEY_LOCATION_NUMPAD
|
"0" , "1" , "2" ,
"2" , "4" , "5" ,
"6" , "7" , "8" ,
"9" , "." , "Enter" ,
"+" , "-" , "*" ,
"/"
| DOM_KEY_LOCATION_STANDARD ,
DOM_KEY_LOCATION_NUMPAD
|
この表に記載のないすべてのキーでは、location
属性は常にDOM_KEY_LOCATION_STANDARD
に設定しなければなりません。
3.7.3. KeyboardEventアルゴリズム
3.7.3.1. KeyboardEventのグローバル状態
3.7.3.1.1. ユーザーエージェントレベルの状態
UAは、ユーザーエージェント全体で共有される以下の値を維持しなければなりません。
キー修飾状態(初期値は空)。システム上で利用可能な各修飾キーの現在の状態を追跡します。
3.7.4. キーボードイベント順序
この現行標準で定義されるキーボードイベントは、任意のキーごとに相互の順序で発生します:
イベントタイプ | 備考 | |
---|---|---|
1 | keydown
| |
2 | beforeinput
| (文字値を生成するキーのみ) |
このキーに関連する任意のデフォルトアクション(例:DOMに文字を挿入) | ||
3 | input
| (DOMが更新されたキーのみ) |
キーが長押しされた場合は、下記のイベントが環境依存の頻度で繰り返し発生します。 | ||
4 | keyup
|
キーが長押しされた場合、次のイベントが環境依存の頻度で繰り返し発生する場合があります:
イベントタイプ | 備考 | |
---|---|---|
1 | keydown
| (repeat
属性がtrue )
|
2 | beforeinput
| (文字値を生成するキーのみ) |
このキーに関連する任意のデフォルトアクション(例:DOMに文字を挿入) | ||
3 | input
| (DOMが更新されたキーのみ) |
通常、特定のキーに関連するデフォルトアクションはkeyup
イベントがディスパッチされる前に完了します。これによりkeyup
イベントの発火が若干遅れる場合があります(ただし知覚できる遅延ではありません)。
キーイベントのイベントターゲットは現在フォーカスを持ち、キーボード操作を処理している要素です。多くの場合HTMLのinput
要素や編集可能なテキスト要素ですが、ホスト言語によって非テキスト目的(アクセラレータキーの起動や他の挙動のトリガーなど)にキーボード入力を受け付ける要素になる場合もあります。適切な要素がフォーカスされていない場合、イベントターゲットはHTMLのbody要素(存在すれば)、それ以外はroot要素です。
イベントターゲットはキーイベントごとに変わる場合があります。例えばTab
キーのkeydown
イベントは、同じキーストロークのkeyup
イベントとは異なるイベントターゲットになる可能性があります。
3.7.5. キーボードイベント型
3.7.5.1. keydown
型 | keydown
|
---|---|
インターフェース | KeyboardEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | 状況による: beforeinput およびinput イベント; テキスト合成システムの起動;
blur およびfocus イベント; keypress
イベント(対応している場合); アクティベーション挙動; その他イベント
|
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、キーが押下されたときこのイベントをディスパッチしなければなりません。keydown
イベント型はデバイス依存であり、入力デバイスの機能やOSでのマッピングに依存します。このイベント型はキー割り当ての後に生成しなければなりません。また、同じキーに関連するbeforeinput
、input
、keyup
イベントよりも前にディスパッチしなければなりません。
keydown
イベントのデフォルトアクションはキーごとに異なります:
-
キーが文字に対応している場合、デフォルトアクションは
beforeinput
イベントの後にinput
イベントをディスパッチすること。複数の文字(マクロやデッドキー連続など)に対応する場合は、文字ごとにbeforeinput
/input
イベントをセットでディスパッチすること。 -
キーがテキスト合成システムに関連している場合は、デフォルトアクションはそのシステムの起動としなければなりません。
-
キーが
Tab
の場合、デフォルトアクションは現在フォーカスされている要素(存在すれば)から新しいフォーカス要素へドキュメントフォーカスを移すこと(フォーカスイベント型参照)。 -
キーが
Enter
またはclick
イベントおよびDOMActivate
イベント(ユーザーエージェントが対応していれば)をディスパッチすること。
このイベントがキャンセルされた場合、関連イベント型はディスパッチされず、関連アクションも実行されてはなりません。
keydown
およびkeyup
イベントは、文字値を生成するキーだけでなく、すべてのキー検出に伝統的に用いられます。
3.7.5.2. keyup
型 | keyup
|
---|---|
インターフェース | KeyboardEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、キーが解放されたときこのイベントをディスパッチしなければなりません。keyup
イベント型はデバイス依存であり、入力デバイスの機能やOSでのマッピングに依存します。このイベント型はキー割り当ての後に生成しなければなりません。また、同じキーに関連するkeydown
、beforeinput
、input
イベントの後にディスパッチしなければなりません。
3.8. 合成イベント
合成イベントは、キーボードイベント以外にも補助的または代替的な方法でテキスト入力を行う手段を提供します。これにより、キーボード上に一般的に存在しない文字も利用できます。例えば、合成イベントは標準USキーボードにない文字へのアクセント追加、多くのアジア言語の表意文字の構成要素からの合成、モバイルデバイスキーボード上の複数キー操作による単語選択、音声認識プロセッサによる音声コマンドからのテキスト変換などに使われます。合成イベントとキーボードイベントの組み合わせ例については§4 キーボードイベントとキー値を参照してください。
概念的には、合成セッションはcompositionstart
イベントが1回、compositionupdate
イベントが1回以上、compositionend
イベントが1回の流れで構成されます。この間、data
属性の値が各「段階」ごとに保持されます。
注:
合成セッションが有効な間、入力デバイスとしてキーボードが使われていればキーボードイベントもDOMにディスパッチされます。詳細はcompositionstart
イベントの解説およびIMEセクションのイベント順序を参照してください。
すべてのIMEシステムやデバイスが必要なデータをDOMに公開するわけではないので、アクティブな合成文字列(「読みウィンドウ」や「候補選択メニュー」など)がこのインターフェース経由で利用不可の場合、選択結果は空文字列で表現される場合があります。
3.8.1. CompositionEventインターフェース
この現行標準で導入
CompositionEvent
インターフェースは合成イベントに関連する特有のコンテキスト情報を提供します。
インスタンス生成にはCompositionEvent
コンストラクタにオプションでCompositionEventInit
辞書を渡します。
3.8.1.1. CompositionEvent
[Exposed =Window ]interface :
CompositionEvent UIEvent {(
constructor DOMString ,
type optional CompositionEventInit = {});
eventInitDict readonly attribute USVString data ; };
data
, 型 USVString, readonly-
data
は入力メソッドで生成された文字値を保持します。これは1つのUnicode文字または空でないUnicode文字列列である場合があります [Unicode]。文字は NFC 正規化形式で正規化されるべきです。詳細は [UAX15]参照。この属性は空文字列の場合もあります。この属性の未初期化値は空文字列
""
でなければなりません。
3.8.1.2. CompositionEventInit
dictionary :
CompositionEventInit UIEventInit {DOMString data = ""; };
data
, 型 DOMString, デフォルト""
- CompositionEventオブジェクトの
data
属性をIME合成で生成された文字値で初期化します。
3.8.2. 合成イベント順序
この現行標準で定義される合成イベントは以下の順序で発生しなければなりません:
イベントタイプ | 備考 | |
---|---|---|
1 | compositionstart
| |
2 | compositionupdate
| 複数回発生 |
3 | compositionend
|
3.8.3. 手書き認識システム
以下は、ペンタブレット等の手書き認識システムで「text」という文章を合成する場合の、合成イベントを用いた想定イベントシーケンスの例です。
イベントタイプ | CompositionEvent data
| 備考 | |
---|---|---|---|
1 | compositionstart
| ""
| |
ユーザーがタブレット表面に単語を書く | |||
2 | compositionupdate
| "test"
| |
ユーザーが最初の候補語を拒否し、別の候補を選択 | |||
3 | compositionupdate
| "text"
| |
4 | compositionend
| "text"
|
3.8.4. 合成イベントのキャンセル
keydown
イベントがキャンセルされた場合、そのkeydown
に起因して発火するはずだった合成イベントはディスパッチすべきではありません:
イベントタイプ | 備考 | |
---|---|---|
1 | keydown
| デフォルトアクションが防止される(例:preventDefault() 呼び出し)
|
合成イベントはディスパッチされない | ||
2 | keyup
|
最初のcompositionstart
イベントがキャンセルされた場合、テキスト合成セッションは終了すべきです。セッションが終了するか否かに関わらず、compositionend
イベントは必ず送信されなければなりません。
イベントタイプ | 備考 | |
---|---|---|
1 | keydown
| |
2 | compositionstart
| デフォルトアクションが防止される(例:preventDefault() 呼び出し)
|
合成イベントはディスパッチされない | ||
3 | compositionend
| |
4 | keyup
|
3.8.5. 合成中のキーイベント
合成セッション中は、keydown
およびkeyup
イベントは引き続き送信され、これらのイベントはisComposing
属性がtrue
でなければなりません。
イベントタイプ | KeyboardEvent isComposing
| 備考 | |
---|---|---|---|
1 | keydown
| false | このキーイベントが合成を開始する |
2 | compositionstart
| ||
3 | compositionupdate
| ||
4 | keyup
| true | |
... | 合成セッション中に送信されるキーイベントはすべてisComposing がtrue でなければならない
| ||
5 | keydown
| true | このキーイベントが合成を終了する |
6 | compositionend
| ||
7 | keyup
| false |
3.8.6. 合成中の入力イベント
合成セッション中は、compositionupdate
はbeforeinput
の後、input
イベントの前にディスパッチされなければなりません。
イベントタイプ | 備考 | |
---|---|---|
1 | beforeinput
| |
2 | compositionupdate
| |
この時点でDOMの更新が発生する | ||
3 | input
|
ほとんどのIMEは合成セッション中の更新キャンセルをサポートしていません。
beforeinput
およびinput
イベントは、合成に伴うDOM更新時にcompositionupdate
イベントとともに送信されます。compositionend
イベントにはDOM更新が伴わないため、そのタイミングではbeforeinput
およびinput
イベントを送信すべきではありません。
イベントタイプ | 備考 | |
---|---|---|
1 | beforeinput
| これをキャンセルするとDOM更新とinput イベントが防止される
|
2 | compositionupdate
| |
この時点でDOMの更新が発生する | ||
3 | input
| DOMが更新された場合のみ送信される |
4 | compositionend
|
3.8.7. 合成イベント型
3.8.7.1. compositionstart
型 | compositionstart
|
---|---|
インターフェース | CompositionEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | あり |
合成イベント | あり |
デフォルトアクション | テキスト合成システムが有効になったときに新しい合成セッションを開始する |
コンテキスト (信頼されたイベント) |
ユーザーエージェントは、テキスト合成システムが有効化され、新しい合成セッションが開始直前(または開始済み、テキスト合成システムによる)でテキスト入力準備中のとき、このイベントをディスパッチしなければなりません。このイベント型はデバイス依存であり、テキスト変換システムの機能やOSへのマッピングに依存する場合があります。キーボードで入力メソッドエディタに供給する場合、このイベント型はkeydown
イベントの後に生成されますが、音声や手書き認識システムではキーボードイベントなしで本イベント型を送信する場合があります。
一部実装では、data
属性に、現在ドキュメントで選択中のテキスト(編集・置換用)を設定する場合があります。そうでない場合、data
属性の値は空文字列でなければなりません。
このイベントは、テキスト合成システムが新しい合成セッションを開始する直前、および合成処理によるDOM更新前に必ずディスパッチされなければなりません。このイベントのデフォルトアクションは、テキスト合成システムが新しい合成セッションを開始することです。このイベントがキャンセルされた場合、テキスト合成システムは現在の合成セッションを破棄すべきです。
compositionstart
イベント型のキャンセルは、IMEウィンドウのキャンセルボタン押下やウィンドウ閉じによるテキスト合成システム自体のキャンセルとは異なります。
一部IMEは進行中の合成セッションのキャンセルをサポートしていません(例:GTKは現時点でそのようなAPIがない)。この場合、preventDefault()
を呼んでもデフォルトアクションは停止されません。
3.8.7.2. compositionupdate
型 | compositionupdate
|
---|---|
インターフェース | CompositionEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | なし |
合成イベント | あり |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
ユーザーエージェントは、テキスト合成システムがアクティブな文章を新しい文字で更新したとき(その結果がdata
に反映される)、このイベントをディスパッチすべきです。
テキスト合成システムが入力コントロールと継続的に同期する場合、compositionupdate
イベントはコントロールの更新前に必ずディスパッチされなければなりません。
一部のテキスト合成システムはこの情報をDOMに公開しないため、合成処理中にこのイベントが発火しない場合もあります。
合成セッションがキャンセルされた場合、このイベントはcompositionend
イベントの直前に発火し、data
属性は空文字列に設定されます。
3.8.7.3. compositionend
型 | compositionend
|
---|---|
インターフェース | CompositionEvent
|
同期 / 非同期 | 同期 |
バブリング | あり |
信頼されたターゲット | Element
|
キャンセル可能 | なし |
合成イベント | あり |
デフォルトアクション | なし |
コンテキスト (信頼されたイベント) |
ユーザーエージェントは、テキスト合成システムが合成セッションを完了またはキャンセルしたときにこのイベントをディスパッチしなければなりません。compositionend
イベントは、コントロールの更新後に必ずディスパッチされなければなりません。
このイベントは、テキスト合成システムが合成セッションを完了した直後(例:IMEが閉じられた、最小化された、フォーカスが外れたなど)およびフォーカスがユーザーエージェントに戻ったときにディスパッチされます。
4. キーボードイベントとキー値
このセクションではキーボードイベントに関する必要な情報を示します:
-
キーボードレイアウト・マッピング・キー値の説明。
-
キー間の関係(デッドキーや修飾キーなど)。
-
キーボードイベントとそのデフォルトアクションの関係。
-
key
値の集合と、その集合の拡張方法の指針。
このセクションではセルビア語や漢字文字を使用しています。PDF版や印刷版の現行標準では文字が正しく表示されない場合があります。
4.1. キーボード入力
このセクションは非規範的です
各キーとキーボード全体との関係は、以下の3つの側面から成り立ち、モデルや構成(特にロケール固有の場合)によって異なります:
-
機械的レイアウト:物理キーの寸法・サイズ・配置
-
視覚的マーキング:各キーに印字・刻印されているラベル(またはレジェンド)
-
機能的マッピング:各キーの抽象的なキー値の割当。
この現行標準では、key
値とcode
値に関する機能的マッピングのみ定義し、キーのレジェンドについては簡単な説明のみです。
4.1.1. キーのレジェンド
このセクションは参考情報です
キーのレジェンドは、キーキャップ(物理キーの長方形の「キャップ」部分)に印刷または刻印されている視覚的マークです。通常は、キー操作で生成される文字("G"
、"8"
、"ш"
など)や、そのキーの機能を示す記号や名称(上向き矢印"⇧"
でShift
、文字列"Enter"
など)で構成されます。キーはこのマーキングで呼ばれることが多いです(例:「"Shift"
キーと"G"
キーを押してください」)。ただし、キーの見た目はデジタル表現に影響せず、多くの構成では見た目が完全に不正確な場合もあります。Enter
などのコントロール・ファンクションキーも、異なる機能や文字キーにマッピングされる場合があります。
多くのキーボードには通常文字を生成しないキーがあります(記号にUnicodeの対応があっても)。例えばShift
キーは"⇧"
(UnicodeコードポイントU+21E7
)の記号を持つ場合がありますが、Shift
キーを押してもこの文字値は生成されません。またShift
自体にUnicodeコードポイントはありません。
4.2. キーコード
キーcode
は、キーボードイベントに関連付けられた物理キーを識別する属性です。USB Usage IDに似ており、ベンダー非依存の低レベル値(スキャンコード類似)を提供します。
code
属性の主な目的は、物理位置に基づいてキーを一貫して識別する手段を提供することです。また、現在のキーボード状態に左右されない安定したキー名(各物理キーを一意に識別する)も提供します。
有効なcode
値の一覧は[UIEvents-Code]で定義されています。
4.2.1. code
属性の動機
標準PCキーボードには、ユーザーが選択した現在のキーボードレイアウトにより異なるkey
値を生成するキー(書記体系キー)があります。この状況では、物理位置に基づいてキーを検出するコードを書くのが困難です。現在どのレイアウトか把握して、どのkey
値を確認すべきか知る必要があるためです。実例:ゲームで"W"
、"A"
、"S"
、"D"
キーでプレイヤー移動を制御したい場合。code
属性なら、現在のキーボードレイアウトに影響されず安定した値で判定できます。
さらにkey
属性の値も現在のキーボード状態に依存します。修飾キーとの押下・解放順によってkey
属性に格納される値が変わります。code
属性は現在のキーボード状態に影響されない安定した値を提供します。
4.2.2.
key
とcode
の関係
key
key
属性は、現在のキーボードレイアウト(IMEも含む。デッドキーは固有のkey
値を持つ)を考慮したキーの意味を判定したい場合に使います。ユースケース例:修飾キー付きや修飾キー単体の検出(例:キーボードショートカットに反応するアクション)。code
code
属性は、レイアウト変更無しでユーザーが押した物理キー自体を判定したい場合に使います。ユースケース例:WASDキー(ゲームの移動制御)やすべてのキーキャッチ(リモートデスクトップクライアントなど)。
4.2.3. code
の例
キーボードレイアウト | KeyboardEvent key
| KeyboardEvent code
| 備考 |
---|---|---|---|
US | "Alt"
| "AltLeft"
| DOM_KEY_LOCATION_LEFT
|
French | "Alt"
| "AltLeft"
| DOM_KEY_LOCATION_LEFT
|
US | "Alt"
| "AltRight"
| DOM_KEY_LOCATION_RIGHT
|
French | "AltGraph"
| "AltRight"
| DOM_KEY_LOCATION_RIGHT
|
この例では、key
属性を判定すれば左右どちらのAltキーか気にせずAlt
一致ができます。code
属性を判定すれば現在のレイアウトを気にせず右Altキー("AltRight"
)一致が可能です。
なおFrenchの例では、Alt
やAltGraph
キーは左右位置を保持しますが、物理的に1つずつしか存在しない場合もあります。
キーボードレイアウト | KeyboardEvent key
| KeyboardEvent code
| 備考 |
---|---|---|---|
US | "'"
| "Quote"
| |
日本語 | ":"
| "Quote"
| |
US Intl | "Dead"
| "Quote"
|
この例ではデッドキー値の符号化方法を示しています。key
値は現在のロケールによって変化しますが、code
属性は常に一定の値を返します。
"2"
キー(Shift有無)の各国キーボードでの扱い
キーボードレイアウト | KeyboardEvent key
| KeyboardEvent code
| 備考 |
---|---|---|---|
US | "2"
| "Digit2"
| |
US | "@"
| "Digit2"
| shiftKey
|
UK | "2"
| "Digit2"
| |
UK | """
| "Digit2"
| shiftKey
|
French | "é"
| "Digit2"
| |
French | "2"
| "Digit2"
| shiftKey
|
ロケールや修飾キー状態に関係なく、USキーボードで"2"
ラベルのキーを押すと"Digit2"
がcode
属性に設定されます。
Shift
と2
次の2つのキーイベントシーケンスの属性値を比較してください。どちらもUSキーボードで"@"
文字を生成しますが、キー解放順が異なります。1つ目はShift
(押下)→2
(押下)→2
(解放)→Shift
(解放)の順です。
イベントタイプ | KeyboardEvent key
| KeyboardEvent code
| 備考 | |
---|---|---|---|---|
1 | keydown
| "Shift"
| "ShiftLeft"
| DOM_KEY_LOCATION_LEFT
|
2 | keydown
| "@"
| "Digit2"
| shiftKey
|
3 | keypress
| "@"
| "Digit2"
| (対応していれば) |
4 | keyup
| "@"
| "Digit2"
| shiftKey
|
5 | keyup
| "Shift"
| "ShiftLeft"
| DOM_KEY_LOCATION_LEFT
|
2つ目のシーケンスではShiftが2より先に解放されるため、イベント順序は:Shift
(押下)、2
(押下)、Shift
(解放)、2
(解放)となります。
イベントタイプ | KeyboardEvent key
| KeyboardEvent code
| 備考 | |
---|---|---|---|---|
1 | keydown
| "Shift"
| "ShiftLeft"
| DOM_KEY_LOCATION_LEFT
|
2 | keydown
| "@"
| "Digit2"
| shiftKey
|
3 | keypress
| "@"
| "Digit2"
| (対応していれば) |
4 | keyup
| "Shift"
| "ShiftLeft"
| DOM_KEY_LOCATION_LEFT
|
5 | keyup
| "2"
| "Digit2"
|
key
属性の値は、"2"
キーのkeydown/keyupイベント間で一致しない場合があります。code
属性なら修飾キー状態に左右されず一貫した値が得られます。
4.2.4.
code
と仮想キーボード
code
属性の有用性は、仮想キーボード(リモコンやコード入力型キーボードも含む)ではやや分かりづらい場合があります。一般的に、仮想(またはリモートコントロール)キーボードが標準キーボードのレイアウト・機能を模倣する場合は、適切にcode
属性も設定しなければなりません。標準キーボードのレイアウトを模倣しない場合は、code
属性を標準キーボード上の最も近い値に設定するか、未定義のままにしてもかまいません。
仮想キーボードで修飾状態に応じて異なる値を生成するキーの場合、code
値は端末が工場出荷時設定状態のときにボタンを押した場合に生成されるkey
値を基準にするべきです。
4.3. キーボードイベントkey
値
キー値は、DOMString
として、位置や状態に関係なく、キーボード上の任意のキーをその値で示すことができます。これらのkey値は、実装によって生成されたキーボードイベントの返値や、コンテンツ著者が希望入力の指定(キーボードショートカット等)で使う入力値として用いることができます。
有効なkey
値の一覧は[UIEvents-Key]で定義されています。
key値は、key
属性を用いて、押されたキーの値を検出するのに利用できます。コンテンツ著者は、アルファベットの大文字・小文字、数字、記号、その他文字生成キーの文字値や、制御キー・修飾キー・ファンクションキーなど文字を生成しないキーのkey値を取得できます。これらの値は、特定の入力文字列の監視、修飾キー入力と他の入力(マウス等)の組み合わせ検出・動作、仮想キーボードの作成、その他さまざまな用途に利用できます。
key値は、文字列比較や、マークアップ属性値(HTMLのaccesskey
など)としても利用でき、他の関連用途にも使えます。準拠したホスト言語は、コンテンツ著者がキー値として2種類の等価な文字列値(文字値またはkey値)のいずれも使えるようにすべきです。
実装はプラットフォームやキーボードレイアウトマッピングに関係なく、最も妥当な値をキーごとに利用しますが、コンテンツ著者はキーボードデバイスがそれらの値を生成できるとは限らないことを前提にすべきです。ショートカットキー組み合わせでkey値を使う場合は「数字やファンクションキー(F4
、F5
など)をアルファベットの代わりに使うことを検討してください」([DWW95])とされています。多くのレイアウトでそれらのキーは存在します。
key値は物理キーボード上の具体的なキーを示すものではなく、キーに印字された文字とも一致しません。key値は、現在の全ての有効キーと入力モード(シフトモード等)を考慮したイベントの値であり、キーボードのOSマッピングに従って実装に報告されます。つまり、QWERTYキーボードのO
ラベルのキーは、シフト無しで"o"
、シフト付きで"O"
となります。ユーザーはキーボードを任意のカスタム構成にマッピングできるため、著者はキーのシフト状態と文字表現(大文字・小文字)間の関係を前提とせず、key
属性の値だけを使うことが推奨されます。例えば、[UIEvents-Code]に示されたStandard「102」キーボードレイアウトは一例であり、他にも多数の標準・独自レイアウトが存在します。
デッドキー対応を簡略化するため、OSのキーボードマッピングでデッドキー状態を扱う場合、デッドキーシーケンスの現在状態はkey
属性では報告されません。代わりにkey値"Dead"
が報告され、実装はデッドキーシーケンスの途中状態をdata
属性で持つ合成イベントを発生させます。前述の例のように、QWERTYキーボードのO
ラベルのキーは、デッドキー操作(ウムラウト付加)中に非シフトで"ö"
、シフト時は"Ö"
となります。
また、キーイベント状態とkey値の関係は1対1ではありません。特定のkey値を持つキーが複数存在する場合もあります。例:標準キーボードではShift
キー値を持つキーが複数あり(通常はlocation
値DOM_KEY_LOCATION_LEFT
とDOM_KEY_LOCATION_RIGHT
で区別)、8
キー値も複数あり(location
値DOM_KEY_LOCATION_STANDARD
とDOM_KEY_LOCATION_NUMPAD
で区別)、ユーザー設定のカスタムレイアウトでは任意のkey値が複数状態に割り当てられる場合もあります(location
は標準レイアウト向けなので必ずしも意味のある区別を示せません)。
最後に、文字表現の意味は文脈依存で複雑です。例えばアスタリスク(星型)記号"*"
は、文中で脚注や強調(文章の囲み)を表したり、ドキュメントやプログラムによっては乗算演算子とみなされたり、他の文書やプログラムでは乗算記号("×"
、Unicode値U+00D7
)やラテン小文字"x"
(多くのキーボードには乗算キーがなく、記号が似ているため)で表されることもあります。したがって、文字表現の意味や機能はこの現行標準の範囲外です。
4.3.1. 修飾キー
キーボード入力では、修飾キーを使って通常のキー動作を変更します。他のキー同様、修飾キーもkeydown
やkeyup
イベントを発生させます(下記例参照)。一部修飾キーは押下または押し続けている間だけ有効になります(Alt
、Control
、Shift
、AltGraph
、Meta
等)。他は状態によって有効化されます(CapsLock
、NumLock
、ScrollLock
等)。状態変化は修飾キーを押下した際に発生します。KeyboardEvent
インターフェースは、一般的な修飾キー用に便利な属性(ctrlKey
、
shiftKey
、
altKey
、
metaKey
)を備えています。一部のOSではAltGraph
修飾キーをAlt
+Control
キーの組み合わせでエミュレートします。実装はAltGraph
修飾キーの利用を推奨します。
U+0051
)を生成する際のイベントシーケンス例です:
イベントタイプ | KeyboardEvent key
| 修飾キー | 備考 | |
---|---|---|---|---|
1 | keydown
| "Shift"
| shiftKey
| |
2 | keydown
| "Q"
| shiftKey
| ラテン大文字Q |
3 | beforeinput
| |||
4 | input
| |||
5 | keyup
| "Q"
| shiftKey
| |
6 | keyup
| "Shift"
|
Shift
キーをQ
キーより先に解放した場合のシーケンスです。Q
キーのkeyup
イベントでは値が非シフト状態に戻ります:
イベントタイプ | KeyboardEvent key
| 修飾キー | 備考 | |
---|---|---|---|---|
1 | keydown
| "Shift"
| shiftKey
| |
2 | keydown
| "Q"
| shiftKey
| ラテン大文字Q |
3 | beforeinput
| |||
4 | input
| |||
5 | keyup
| "Shift"
| ||
6 | keyup
| "q"
| ラテン小文字q |
イベントタイプ | KeyboardEvent key
| 修飾キー | 備考 | |
---|---|---|---|---|
1 | keydown
| "Control"
| ctrlKey
| |
2 | keydown
| "v"
| ctrlKey
| ラテン小文字v |
beforeinput やinput
イベントは生成されません。
| ||||
3 | keyup
| "v"
| ctrlKey
| ラテン小文字v |
4 | keyup
| "Control"
|
Shift
とControl
両方を押した場合のイベントシーケンスです:
イベントタイプ | KeyboardEvent key
| 修飾キー | 備考 | |
---|---|---|---|---|
1 | keydown
| "Control"
| ctrlKey
| |
2 | keydown
| "Shift"
| ctrlKey ,
shiftKey
| |
3 | keydown
| "V"
| ctrlKey ,
shiftKey
| ラテン大文字V |
beforeinput やinput
イベントは生成されません。
| ||||
4 | keyup
| "V"
| ctrlKey ,
shiftKey
| ラテン大文字V |
5 | keyup
| "Shift"
| ctrlKey
| |
6 | keyup
| "Control"
|
イベントタイプ | KeyboardEvent key
| 修飾キー | 備考 | |
---|---|---|---|---|
1 | keydown
| "Control"
| ctrlKey
| |
2 | keydown
| "ر"
| ctrlKey
| アラビア文字レフ |
beforeinput やinput
イベントは生成されません。
| ||||
3 | keyup
| "ر"
| ctrlKey
| アラビア文字レフ |
4 | keyup
| "Control"
|
keydown
やkeyup
イベントの値は、キー押下時の現在のキーボードレイアウトによって異なります。つまりUSレイアウトのv
キーとアラビア語レイアウトのر
キーは同じ物理キーでも異なるイベント値を生成します。同じ物理キーからのイベントを識別するにはcode
属性を使う必要があります。
一部の場合、修飾キーはキーイベントのkey
値を変更します。例えばMacOSキーボードでは「delete」ラベルのキーは未修飾時はWindowsと同じBackspace
キーとして動作しますが、Fn
修飾時はDelete
キーとして動作し、key
の値もその時の最適な機能に一致します。
4.3.2. デッドキー
一部のキーボード入力では、デッドキーを使って合成文字列を入力します。手書き入力と異なり、ユーザーはまずベース文字を入力するのではなく、デッドキーを押下して特殊状態に入り、限定された「正当な」ベース文字が入力された時のみ文字を出力します。
MacOSおよびLinuxのOSは入力メソッドでデッドキーを処理します。
すべてのキーボードレイアウト・マッピングにおけるデッドキーは、キー値Dead
で表現されます。デッドキーを押下した際、ユーザーエージェントは合成イベントをディスパッチし、compositionupdate
イベントのdata
値は、デッドキー合成シーケンスの現在の文字値でなければなりません。
Unicode合成文字は常に手書き入力シーケンスの後に置かれ(合成文字が対応する文字の後ろに来る)、通常のデッドキー入力ではシーケンスが逆になる場合もあります(合成文字が対応する文字の前)。例えば、単語naïve(合成記号¨使用)は、Unicode上はnai¨veと順序付けされますが、入力時はna¨iveとなる場合もあります。キーストロークU+0302
(合成サーカムフレックスアクセントキー)とU+0065
(ラテン小文字eキー)をフランス語キーボードでフランス語マッピング・修飾なしで入力すると、Unicode文字"ê"
(ラテン小文字eサーカムフレックス付)が生成され、Unicode正規化形式NFCが推奨する表現となります。
イベントタイプ | KeyboardEvent key
| KeyboardEvent isComposing
| CompositionEvent data
| 備考 | |
---|---|---|---|---|---|
1 | keydown
| "Dead"
| false
| 合成サーカムフレックスアクセント(デッドキー) | |
2 | compositionstart
| ""
| |||
3 | compositionupdate
| U+0302
| |||
4 | keyup
| "Dead"
| true
| ||
5 | keydown
| "ê"
| true
| ||
6 | compositionupdate
| "ê"
| |||
7 | compositionend
| "ê"
| |||
8 | keyup
| "e"
| false
| ラテン小文字e |
2番目のkeydown
イベント(ステップ5)では、通常は"e"
(ラテン小文字eキー)とはならず、デッドキー操作で修飾済みの値がユーザーエージェントに渡されます(イベントが抑制されていない限り)。
この処理は、ユーザーが非対応ベース文字(現在のダイアクリティカルマークに対応しない文字)をデッドキー押下後に入力した場合、中断される場合があります:
イベントタイプ | KeyboardEvent key
| KeyboardEvent isComposing
| CompositionEvent data
| 備考 | |
---|---|---|---|---|---|
1 | keydown
| "Dead"
| false
| 合成サーカムフレックスアクセント(デッドキー) | |
2 | compositionstart
| ""
| |||
3 | compositionupdate
| U+0302
| |||
4 | keyup
| "Dead"
| true
| ||
5 | keydown
| "q"
| true
| ラテン小文字q | |
6 | compositionupdate
| ""
| |||
7 | compositionend
| ""
| |||
8 | keyup
| "q"
| false
|
4.3.3. 入力メソッドエディタ
この現行標準は、入力メソッドエディタ(IME)のモデルをCompositionEvent
インターフェースとイベントを通じて含みます。
ただし、合成イベントとキーボードイベントは必ずしも1対1で対応しません。例えば、keydown
でAccept
キー値を受け取っても、現在IMEで選択されているテキストが受理されたことを意味するわけではなく、単にキーストロークがあったことを示すだけです。IMEのAccept機能(多くのIMEではcompositionend
イベントが発生)とは切り離されています。キーボードイベントだけでは入力メソッドエディタの現在状態は判断できません。状態はdata
属性(CompositionEvent
インターフェース)で取得します。さらに、IMEシステムやデバイスは機能やキー割り当てが異なり、Convert
やAccept
キーが他のキーで代用される場合もあります。キーボードイベントは、デバイスのキーボードレイアウトマッピング後に生成されるイベントに対応します。
一部の実装やシステム構成では、IMEによって一部のキーイベントや値が抑制される場合があります。
以下は、日本語入力方式を使ってUnicode文字"市"
(漢字、CJK統合漢字)を生成するキーシーケンス例です。この例はIMEがアクティブで日本語ローマ字入力モードになっていることを前提とします。Convert
やAccept
キーは、使用デバイスやIME構成により他のキーで代用される場合もあり(例:スペースキーU+0020
やEnter
)。
"詩"
(詩)と"市"
(市)は同音異義語(いずれも「し」)のため、ユーザーはConvert
キーで適切な候補を選択する必要があります。
イベントタイプ | KeyboardEvent key
| KeyboardEvent isComposing
| CompositionEvent data
| 備考 | |
---|---|---|---|---|---|
1 | keydown
| "s"
| false
| ラテン小文字s | |
2 | compositionstart
| ""
| |||
3 | beforeinput
| ||||
4 | compositionupdate
| "s"
| |||
DOMが更新される | |||||
5 | input
| ||||
6 | keyup
| "s"
| true
| ||
7 | keydown
| "i"
| true
| ラテン小文字i | |
8 | beforeinput
| ||||
9 | compositionupdate
| "し"
| shi | ||
DOMが更新される | |||||
10 | input
| ||||
11 | keyup
| "i"
| true
| ||
12 | keydown
| "Convert"
| true
| 変換 | |
13 | beforeinput
| ||||
14 | compositionupdate
| "詩"
| 「詩」 | ||
DOMが更新される | |||||
15 | input
| ||||
16 | keyup
| "Convert"
| true
| ||
17 | keydown
| "Convert"
| true
| 変換 | |
18 | beforeinput
| ||||
19 | compositionupdate
| "市"
| 「市」 | ||
DOMが更新される | |||||
20 | input
| ||||
21 | keyup
| "Convert"
| true
| ||
22 | keydown
| "Accept"
| true
| 確定 | |
23 | compositionend
| "市"
| |||
24 | keyup
| "Accept"
| false
|
IME合成は下記のようにキャンセルすることもできます(条件は前例と同じ)。Cancel
キーも、使用デバイスやIME構成により他のキー(例:U+001B
(Escキー))で代用される場合があります。
イベントタイプ | KeyboardEvent key
| KeyboardEvent isComposing
| CompositionEvent data
| 備考 | |
---|---|---|---|---|---|
1 | keydown
| "s"
| false
| ラテン小文字s | |
2 | compositionstart
| ""
| |||
3 | compositionupdate
| "s"
| |||
4 | keyup
| "s"
| true
| ||
5 | keydown
| "i"
| true
| ラテン小文字i | |
6 | compositionupdate
| "し"
| shi | ||
7 | keyup
| "i"
| true
| ||
8 | keydown
| "Convert"
| true
| 変換 | |
9 | compositionupdate
| "詩"
| 「詩」 | ||
10 | keyup
| "Convert"
| true
| ||
11 | keydown
| "Convert"
| true
| 変換 | |
12 | compositionupdate
| "市"
| 「市」 | ||
13 | keyup
| "Convert"
| true
| ||
14 | keydown
| "Cancel"
| true
| キャンセル | |
15 | compositionupdate
| ""
| |||
16 | compositionend
| ""
| |||
17 | keyup
| "Cancel"
| false
|
一部の入力メソッドエディタ(MacOSなど)は、合成キャンセル前に合成データ属性へ空文字列を設定する場合があります。
4.3.3.1. 入力メソッドエディタモードキー
一部デバイスのキーは入力メソッドエディタ機能の起動や、アクティブな入力メソッドエディタのモード変更を目的としています。この目的のためのカスタムキーは、デバイスや言語モードごとに定義できます。この現行標準でこの目的で定義されているキーは、"Alphanumeric"
、
"CodeInput"
、
"FinalMode"
、
"HangulMode"
、
"HanjaMode"
、
"Hiragana"
、
"JunjaMode"
、
"KanaMode"
、
"KanjiMode"
、
"Katakana"
、
"Romaji"
です。これらのキーが押された時、IMEがアクティブでなければ、該当モードでIMEが起動することが期待されます(利用可能な場合)。すでにIMEがアクティブな場合は、IMEが指定モードに切り替わるか、別のIMEが起動するか、あるいは無視される場合もあり、機種やアプリケーションごとに異なります。
現行標準ではIME用の操作を意図した他のキーも定義されています:"Accept"
、"AllCandidates"
、
"Cancel"
、"Convert"
、"Compose"
、"Zenkaku"
(全角)、"Hankaku"
(半角)、"NextCandidate"
、
"NonConvert"
、
"PreviousCandidate"
です。これらのキーの機能は現行標準では定義されていません。IME機能の詳細については他の資料を参照してください。
IME機能付きキーはその目的専用に限らず、デバイスや実装ごとに他用途でも使われる場合があります。
4.3.4. デフォルトアクションとキャンセル可能なキーボードイベント
keydown
イベントのデフォルトアクションをキャンセルしても、対応するkeyup
イベントには影響しませんが、対応するbeforeinput
やinput
(keypress
対応時)のイベントは発生しません。次はUSキーボード(USマッピング)でUnicode文字Q(ラテン大文字Q)を生成する際の例です:
イベントタイプ | KeyboardEvent key
| InputEvent data
| 修飾キー | 備考 | |
---|---|---|---|---|---|
1 | keydown
| "Shift"
| shiftKey
| ||
2 | keydown
| "Q"
| shiftKey
| デフォルトアクションがpreventDefault()等で抑制される | |
beforeinput やinput
(keypress も含む場合)イベントは発生しない
| |||||
3 | keyup
| "Q"
| shiftKey
| ||
4 | keyup
| "Shift"
|
キーが修飾キーの場合でも、キーストロークは修飾状態の判定に考慮しなければなりません。次はUSキーボード(USマッピング)でUnicode文字Q(ラテン大文字Q)を生成する際の例です:
イベントタイプ | KeyboardEvent key
| InputEvent data
| 修飾キー | 備考 | |
---|---|---|---|---|---|
1 | keydown
| "Shift"
| shiftKey
| デフォルトアクションがpreventDefault()等で抑制される | |
2 | keydown
| "Q"
| shiftKey
| ||
3 | beforeinput
| "Q"
| |||
4 | input
| ||||
5 | keyup
| "Q"
| shiftKey
| ||
6 | keyup
| "Shift"
|
キーが複数ストロークの一部(デッドキーやIMEシーケンスへの寄与など)の場合、keydown
イベントのデフォルトアクションがキャンセルされた場合のみ、そのキーストロークは無視(判定対象外)されます。keyup
イベントでデッドキーをキャンセルしてもbeforeinput
やinput
イベントに影響しません。次の例は、デッドキー"Dead"
(U+0302
合成サーカムフレックスアクセントキー)と"e"
(U+0065
ラテン小文字eキー)をフランス語キーボード・フランス語マッピング・修飾なしで入力した場合の例です:
イベントタイプ | KeyboardEvent key
| InputEvent data
| 備考 | |
---|---|---|---|---|
1 | keydown
| "Dead"
| デフォルトアクションがpreventDefault()等で抑制される | |
2 | keyup
| "Dead"
| ||
3 | keydown
| "e"
| ||
4 | beforeinput
| "e"
| ||
5 | input
| |||
6 | keyup
| "e"
|
5. 外部アルゴリズム
このセクションは、現行標準で必要とされるが、他の現行標準で管理するのが適切なアルゴリズムを含みます。
このセクションは一時的な定義場所として意図されており、最終的により適切な現行標準へ移動され、このセクション自体が削除されるべきです。
5.1. コアDOMアルゴリズム
以下のアルゴリズムは...どこかへ移動するべきです。
5.1.1. ヒットテスト
- 入力
-
pos:ビューポート相対のx,y座標
- 出力
-
posで最前面のDOM要素
inertやdisabled要素を考慮するため、elementsFromPointを呼び出し、無効な要素を除外するべきです
-
Return [CSSOM-View]のelementFromPoint(posを指定)
5.1.2. DOMパスの計算
- 入力
-
element:開始要素
- 出力
-
与えられた要素の祖先要素リスト
-
path = elementを含むリストとする
祖先をpathに追加する正式な定義が必要。
-
pathを返す
5.2. PointerLockアルゴリズム
以下のアルゴリズムは[PointerLock]現行標準へ移動すべきです。
5.2.1. PointerLockのグローバル状態
5.2.1.1. ウィンドウレベルの状態
UAはウィンドウ全体で共有される以下の値を維持しなければなりません。
最終マウス移動 値(初期値は未定義)。直近のmousemoveイベント位置を記録する。
5.2.2. MouseEvent用PointerLock属性初期化
- 入力
-
event:
MouseEvent
- 出力
-
なし
5.2.3. mousemove用PointerLock属性設定
- 入力
-
event:
MouseEvent
- 出力
-
なし
5.3. PointerEventアルゴリズム
以下のアルゴリズムは[PointerEvents3]現行標準へ移動すべきです。
5.3.1. PointerEventの初期化
- 入力
-
event:初期化する
PointerEvent
eventType:イベントタイプ(DOMString)
eventTarget:イベントの
EventTarget
- 出力
-
なし
-
MouseEventの初期化(event, eventType, eventTarget)
TODO - pointerevent属性の初期化
5.3.2. PointerEventの生成
- 入力
-
eventType:イベントタイプ(DOMString)
eventTarget:イベントの
EventTarget
- 出力
-
なし
-
event = 新しいイベント作成(
PointerEvent
利用) -
PointerEventの初期化(event, eventType, eventTarget)
-
eventを返す
5.3.3. MouseEventからPointerEvent生成
- 入力
-
eventType:イベントタイプ(DOMString)
mouseevent:対応する
MouseEvent
- 出力
-
なし
-
event = 新しいイベント作成(
PointerEvent
利用) -
target = mouseevent.
target
-
PointerEventの初期化(event, eventType, target)
-
MouseEvent属性をmouseeventからeventへコピーする
-
eventを返す
5.3.4. pointeroutイベント送信の可能性
- 入力
-
mouseout:対応するmouseout
MouseEvent
- 出力
-
なし
-
pointerout = MouseEventからPointerEvent生成("pointerout", mouseout)
-
pointerevent属性の設定
TODO
-
target = mouseout.
target
-
dispatch pointerout(targetに)
5.3.5. pointerleaveイベント送信の可能性
- 入力
-
mouseout:対応するmouseout
MouseEvent
- 出力
-
なし
-
pointerout = MouseEventからPointerEvent生成("pointerout", mouseout)
-
pointerevent属性の設定
TODO
-
target = mouseout.
target
-
dispatch pointerout(targetに)
5.3.6. pointeroverイベント送信の可能性
- 入力
-
mouseout:対応するmouseout
MouseEvent
- 出力
-
なし
-
pointerout = MouseEventからPointerEvent生成("pointerout", mouseout)
-
pointerevent属性の設定
TODO
-
target = mouseout.
target
-
dispatch pointerout(targetに)
5.3.7. pointerenterイベント送信の可能性
- 入力
-
mouseout:対応するmouseout
MouseEvent
- 出力
-
なし
-
pointerout = MouseEventからPointerEvent生成("pointerout", mouseout)
-
pointerevent属性の設定
TODO
-
target = mouseout.
target
-
dispatch pointerout(targetに)
5.3.8. pointermoveイベント送信の可能性
- 入力
-
mouseout:対応するmouseout
MouseEvent
- 出力
-
なし
pointermoveとpointerrawupdate両方送信可能か?2メソッド必要か?
pointermoveイベントのcoalesce定義に必要なものは?
-
pointerout = MouseEventからPointerEvent生成("pointerout", mouseout)
-
pointerevent属性の設定
TODO
-
target = mouseout.
target
-
dispatch pointerout(targetに)
5.3.9. pointerdownイベント送信の可能性
- 入力
-
mouseout:対応するmouseout
MouseEvent
- 出力
-
なし
mousedownイベントと異なり、pointerdownイベントは複数ボタン同時押下時でもネストされません。 MouseEventのフィールドをPointerEventへコピーするためMouseEventを渡します。
-
pointerout = MouseEventからPointerEvent生成("pointerout", mouseout)
-
pointerevent属性の設定
TODO
-
target = mouseout.
target
-
dispatch pointerout(targetに)
5.3.10. pointerupイベント送信の可能性
- 入力
-
mouseout:対応するmouseout
MouseEvent
- 出力
-
なし
mouseupイベントと異なり、pointerupイベントは複数ボタン同時押下時でもネストされません。 MouseEventのフィールドをPointerEventへコピーするためMouseEventを渡します。
-
pointerout = MouseEventからPointerEvent生成("pointerout", mouseout)
-
pointerevent属性の設定
TODO
-
target = mouseout.
target
-
dispatch pointerout(targetに)
6. レガシーイベント初期化子
このセクションは規範的です。 以下の機能は廃止済みであり、レガシーソフトウェアとの互換性が必要なユーザーエージェントだけが実装すべきです。
現行標準初期のバージョンでは、インターフェース上に初期化メソッド(例:initMouseEvent
)が含まれており、多数のパラメータが必要でしたが、多くの場合イベントオブジェクトの全属性を完全には初期化できませんでした。そのため、基本Event
インターフェースから派生したイベントインターフェースでは、全ての派生インターフェースの初期化子を明示的に呼び出す必要がありました。
現行標準の開発期間が長かったこともあり、一部の実装はこれら(現在は廃止済み)の初期化メソッドに依存している場合があります。完全性のため、この付録でレガシーイベント初期化子を説明します。
6.1. レガシーイベント初期化子インターフェース
このセクションは参考情報です
このセクションでは以前の現行標準で導入されたレガシー初期化メソッドを記載します。
6.1.1. UIEventインターフェース用初期化子
partial interface UIEvent { // 現行標準で廃止undefined initUIEvent (DOMString ,
typeArg optional boolean =
bubblesArg false ,optional boolean =
cancelableArg false ,optional Window ?=
viewArg null ,optional long = 0); };
detailArg
initUIEvent(typeArg)
-
UIEvent
オブジェクトの属性を初期化します。 このメソッドはinitEvent()
と同じ動作をします。initUIEvent
メソッドは廃止されていますが、広く普及した実装との互換性のためにサポートされています。- DOMString typeArg
-
initEvent()
のパラメータ説明を参照してください。 - boolean bubblesArg
-
initEvent()
のパラメータ説明を参照してください。 - boolean cancelableArg
-
initEvent()
のパラメータ説明を参照してください。 - Window? viewArg
-
view
を指定します。値はnull
でもかまいません。 - long detailArg
-
detail
を指定します。
6.1.2. MouseEventインターフェース用初期化子
partial interface MouseEvent { // 現行標準で廃止undefined initMouseEvent (DOMString ,
typeArg optional boolean =
bubblesArg false ,optional boolean =
cancelableArg false ,optional Window ?=
viewArg null ,optional long = 0,
detailArg optional long = 0,
screenXArg optional long = 0,
screenYArg optional long = 0,
clientXArg optional long = 0,
clientYArg optional boolean =
ctrlKeyArg false ,optional boolean =
altKeyArg false ,optional boolean =
shiftKeyArg false ,optional boolean =
metaKeyArg false ,optional short = 0,
buttonArg optional EventTarget ?=
relatedTargetArg null ); };
initMouseEvent(typeArg)
-
MouseEvent
オブジェクトの属性を初期化します。このメソッドはUIEvent.initUIEvent()
と同じ動作をします。initMouseEvent
メソッドは廃止されていますが、広く普及した実装との互換性のためにサポートされています。- DOMString typeArg
-
initEvent()
メソッドのパラメータ説明を参照してください。 - boolean bubblesArg
-
initEvent()
メソッドのパラメータ説明を参照してください。 - boolean cancelableArg
-
initEvent()
メソッドのパラメータ説明を参照してください。 - Window? viewArg
-
view
を指定します。この値はnull
でもかまいません。 - long detailArg
-
detail
を指定します。 - long screenXArg
-
screenX
を指定します。 - long screenYArg
-
screenY
を指定します。 - long clientXArg
-
clientX
を指定します。 - long clientYArg
-
clientY
を指定します。 - boolean ctrlKeyArg
-
ctrlKey
を指定します。 - boolean altKeyArg
-
altKey
を指定します。 - boolean shiftKeyArg
-
shiftKey
を指定します。 - boolean metaKeyArg
-
metaKey
を指定します。 - short buttonArg
-
button
を指定します。 - EventTarget? relatedTargetArg
-
relatedTarget
を指定します。この値はnull
でもかまいません。
6.1.3. KeyboardEventインターフェース用初期化子
このレガシーKeyboardEvent初期化子の引数リストにはdetailArg
(他の初期化子にある)が含まれておらず、locale
引数が追加されています。既存実装との互換性のため、この不整合を保持する必要があります。
partial interface KeyboardEvent { // 現行標準で導入(廃止済み)undefined initKeyboardEvent (DOMString ,
typeArg optional boolean =
bubblesArg false ,optional boolean =
cancelableArg false ,optional Window ?=
viewArg null ,optional DOMString = "",
keyArg optional unsigned long = 0,
locationArg optional boolean =
ctrlKey false ,optional boolean =
altKey false ,optional boolean =
shiftKey false ,optional boolean =
metaKey false ); };
initKeyboardEvent(typeArg)
-
KeyboardEvent
オブジェクトの属性を初期化します。このメソッドはUIEvent.initUIEvent()
と同じ動作をします。detail
の値は未定義のままとなります。initKeyboardEvent
メソッドは廃止されています。- DOMString typeArg
-
initEvent()
メソッドのパラメータ説明を参照してください。 - boolean bubblesArg
-
initEvent()
メソッドのパラメータ説明を参照してください。 - boolean cancelableArg
-
initEvent()
メソッドのパラメータ説明を参照してください。 - Window? viewArg
-
view
を指定します。この値はnull
でもかまいません。 - DOMString keyArg
-
key
を指定します。 - unsigned long locationArg
-
location
を指定します。 - boolean ctrlKey
- Controlキー修飾が有効かどうかを指定します。
- boolean altKey
- Altキー修飾が有効かどうかを指定します。
- boolean shiftKey
- Shiftキー修飾が有効かどうかを指定します。
- boolean metaKey
- Metaキー修飾が有効かどうかを指定します。
6.1.4. CompositionEventインターフェース用初期化子
このレガシーCompositionEvent初期化子の引数リストにはdetailArg
(他の初期化子にある)が含まれておらず、locale
引数が追加されています。既存実装との互換性のため、この不整合を保持する必要があります。
partial interface CompositionEvent { // 現行標準で導入(廃止済み)undefined initCompositionEvent (DOMString ,
typeArg optional boolean =
bubblesArg false ,optional boolean =
cancelableArg false ,optional WindowProxy ?=
viewArg null ,optional DOMString = ""); };
dataArg
initCompositionEvent(typeArg)
-
CompositionEvent
オブジェクトの属性を初期化します。このメソッドはUIEvent.initUIEvent()
と同じ動作をします。detail
の値は未定義のままとなります。initCompositionEvent
メソッドは廃止されています。- DOMString typeArg
-
initEvent()
メソッドのパラメータ説明を参照してください。 - boolean bubblesArg
-
initEvent()
メソッドのパラメータ説明を参照してください。 - boolean cancelableArg
-
initEvent()
メソッドのパラメータ説明を参照してください。 - Window? viewArg
-
view
を指定します。この値はnull
でもかまいません。 - DOMString dataArg
-
data
を指定します。
7. レガシーキー・マウスイベント属性
このセクションは非規範的です。以下の属性は廃止済みで、レガシーなソフトウェアとの互換性が必要なユーザーエージェントのみが実装すべきです。
これらの機能は正式な仕様がなく、現行ブラウザ実装は大きく異なります。大量のレガシーコンテンツ(スクリプトライブラリ含む)はユーザーエージェント検出に依存しているため、これらのレガシー属性・イベントを正式化しようとすると、修正や有効化と同程度に既存コンテンツが壊れるリスクがあります。さらに、これらの属性は国際化やアクセシビリティの観点で適切ではありません。
そのため、現行標準ではキーボード入力処理で一般的に使われるイベント・属性は規範的に定義しませんが、互換目的でユーザーエージェントには存在する場合があります。著者はkey
属性を使い、charCode
やkeyCode
属性は使わないべきです。
ただし、現状の機能と規範的イベント・属性との関係を記録する目的で、このセクションは参考説明を提供します。これら属性・イベントをサポートする実装では、本セクションの定義を使用することが推奨されます。
7.1. レガシーUIEvent
補足インターフェース
このセクションは非規範的です
ユーザーエージェントは従来、which
属性を追加し、KeyboardEvent
や
MouseEvent
で補足イベント情報を記録できるようにしていました。
以前の現行標準ではwhich
属性をKeyboardEvent
およびMouseEvent
に直接定義していましたが、現在はUIEvent
上の共通属性となっています。
7.1.1. UIEventインターフェース(補足)
部分UIEvent
インターフェースは、UIEvent
インターフェースの参考拡張で、which
属性を追加します。
partial interface UIEvent { // 以下はレガシーユーザーエージェント向けreadonly attribute unsigned long which ; };
which
, 型 unsigned long, readonly-
MouseEvent
の場合はbutton
+1。KeyboardEvent
の場合は、 押されたキーに対応する未修飾識別子のシステム・実装依存数値コード(通常keyCode
と同じ値)。
7.1.2. UIEventInitインターフェース(補足)
which
をUIEvent
でサポートするブラウザは、UIEventInit
辞書にも以下のメンバーを追加すべきです。
部分UIEventInit
辞書はUIEventInit
の参考拡張で、which
メンバーで対応するUIEvent
属性を初期化できます。
partial dictionary UIEventInit {unsigned long which = 0; };
which
, 型 unsigned long, デフォルト値0
-
UIEvent
のwhich
属性を初期化します。
7.2. レガシーKeyboardEvent
補足インターフェース
このセクションは非規範的です
キーボードのブラウザサポートは従来、keyCode
、
charCode
、
UIEvent
の
which
という3つのアドホック属性に依存していました。
これら3属性は押下キーの各側面を表す数値コードを返します:keyCode
はキー自身のインデックス、charCode
は文字キーのASCII値、which
は可能なら文字値、そうでなければキーインデックス。これらの値や属性の有無はプラットフォーム・キーボード言語・レイアウト・ユーザーエージェント・バージョン・イベントタイプごとに一貫しません。
7.2.1. KeyboardEventインターフェース(補足)
部分KeyboardEvent
インターフェースは
KeyboardEvent
の参考拡張で、charCode
およびkeyCode
属性を追加します。
部分KeyboardEvent
インターフェースは、対応実装でcreateEvent()
メソッドで取得できます。
partial interface KeyboardEvent { // 以下はレガシーユーザーエージェント向けreadonly attribute unsigned long charCode ;readonly attribute unsigned long keyCode ; };
charCode
, 型 unsigned long, readonly-
charCode
はkeypress
イベント(文字入力を生成する場合)で文字値を保持します。 値はその文字のUnicode参照番号(コードポイント)(例:event.charCode = event.key.charCodeAt(0)
)。keydown
やkeyup
イベントではcharCode
値は0
です。 keyCode
, 型 unsigned long, readonly-
keyCode
は押下キーに対応する未修飾識別子のシステム・実装依存数値コードを保持します。key
属性とは異なり、値のセットは現行標準で規範的に定義されません。通常keyCode
値は ASCII([RFC20]、[US-ASCII])や Windows 1252([WIN1252])の10進コードポイントであるべきですが、他の文字セットでも構いません。識別できない場合はキー値0
を使います。詳細は§ 7.3 レガシーキーのモデル参照。
7.2.2. KeyboardEventInitインターフェース(補足)
keyCode
やcharCode
をKeyboardEvent
でサポートするブラウザは、KeyboardEventInit
辞書にも以下のメンバーを追加すべきです。
部分KeyboardEventInit
辞書はKeyboardEventInit
の参考拡張で、charCode
およびkeyCode
メンバーで対応するKeyboardEvent
属性を初期化できます。
partial dictionary KeyboardEventInit { // 以下はレガシーユーザーエージェント向けunsigned long charCode = 0;unsigned long keyCode = 0; };
charCode
, 型 unsigned long, デフォルト値0
- イベントの文字のUnicodeコードポイントで
charCode
属性をKeyboardEvent
に初期化します。 keyCode
, 型 unsigned long, デフォルト値0
- 押下キーに対応する未修飾識別子のシステム・実装依存数値コードで
keyCode
属性をKeyboardEvent
に初期化します。
7.3. レガシーキーのモデル
このセクションは非規範的です
イベントタイプごとにこれら属性で公開される値は実装によって異なります。実装はkeyCode
プロパティで仮想キーコードと文字コードを両方公開してもよく(混合モデル)、またはkeyCode
とcharCode
を分離して報告する(分離モデル)こともあります。
7.3.1. keyCode
の算出方法(keydown
/keyup
)
keyCode
(keydown
/keyup
)は次のように算出します:
-
OSのイベント情報から仮想キーコードを読み取る(利用可能な場合)。
-
IMEがキー入力を処理しておりイベントが
keydown
なら229を返す。 -
修飾なしで押下した場合に数字文字(0-9)を挿入するなら、その数字文字のASCIIコードを返す。
-
修飾なしで押下した場合にa-zの小文字を挿入するなら、対応する大文字のASCIIコードを返す。
-
OS・プラットフォーム向けのキーコード変換テーブルがあるなら、対応値を検索し、指定値があればそれを返す。
-
実装固有方法で判断したキー機能が§ 7.3.3 固定仮想キーコード表のキーに該当するなら、対応するキーコードを返す。
-
OSから仮想キーコードを返す。
-
キーコードが見つからなかった場合は0を返す。
7.3.2.
keyCode
の算出方法(keypress
)
keyCode
(keypress
)は次のように算出します:
7.3.3. 固定仮想キーコード
以下のキーはデスクトップシステムでキーボードレイアウトに関係なく仮想キーコードが通常変わりません:
キー | 仮想キー コード | 備考 |
---|---|---|
Backspace | 8 | |
Tab | 9 | |
Enter | 13 | |
Shift | 16 | |
Control | 17 | |
Alt | 18 | |
CapsLock | 20 | |
Escape | 27 | Esc |
Space | 32 | |
PageUp | 33 | |
PageDown | 34 | |
End | 35 | |
Home | 36 | |
ArrowLeft | 37 | |
ArrowUp | 38 | |
ArrowRight | 39 | |
ArrowDown | 40 | |
Delete | 46 | Del |
7.3.4. オプション固定仮想キーコード
以下の記号文字はキーボードレイアウトによって仮想コードが変化する場合もありますが、US英語キーボードレイアウトを期待するレガシーコンテンツとの互換性のため、これらの値で報告する方がより互換性があります:
キー | 文字 | 仮想キー コード |
---|---|---|
Semicolon | ";"
| 186 |
Colon | ":"
| 186 |
Equals sign | "="
| 187 |
Plus | "+"
| 187 |
Comma | ","
| 188 |
Less than sign | "<"
| 188 |
Minus | "-"
| 189 |
Underscore | "_"
| 189 |
Period | "."
| 190 |
Greater than sign | ">"
| 190 |
Forward slash | "/"
| 191 |
Question mark | "?"
| 191 |
Backtick | "`"
| 192 |
Tilde | "~"
| 192 |
Opening squace bracket | "["
| 219 |
Opening curly brace | "{"
| 219 |
Backslash | "\"
| 220 |
Pipe | "|"
| 220 |
Closing square bracket | "]"
| 221 |
Closing curly brace | "}"
| 221 |
Single quote | "'"
| 222 |
Double quote | """
| 222 |
8. レガシーイベント型
このセクションは規範的です。以下のイベント型は廃止済みであり、レガシーソフトウェアとの互換性が必要なユーザーエージェントのみが実装すべきです。
このセクションの目的は、現状の機能と規範的イベントとの関係を記録することです。これらイベントをサポートする実装では、本セクションの定義を使用することが推奨されます。
次の表は、この現行標準で廃止されたイベント型の参考サマリーです。完全性のためここに記載します。
イベント型 | 同期/非同期 | バブリング段階 | 信頼できるイベントターゲット型 | DOMインターフェース | キャンセル可 | Composed | デフォルトアクション |
---|---|---|---|---|---|---|---|
DOMActivate
| 同期 | はい | Element
| UIEvent
| はい | はい | なし |
DOMFocusIn
| 同期 | はい | Window , Element
| FocusEvent
| いいえ | はい | なし |
DOMFocusOut
| 同期 | はい | Window , Element
| FocusEvent
| いいえ | はい | なし |
keypress
| 同期 | はい | Element
| KeyboardEvent
| はい | はい | 異なる:テキスト合成システムの起動;blur やfocus イベント;DOMActivate イベント;その他イベント
|
textInput
| 同期 | はい | Element
| TextEvent
| はい | はい | 定義参照 |
8.1.
レガシーUIEvent
イベント
8.1.1.
レガシーUIEvent
イベント型
8.1.1.1. DOMActivate
型 | DOMActivate
|
---|---|
インターフェース | UIEvent
|
同期/非同期 | 同期 |
バブリング | はい |
信頼できるターゲット | Element
|
キャンセル可 | はい |
Composed | はい |
デフォルトアクション | なし |
コンテキスト (信頼イベント) |
ユーザーエージェントは、ボタン、リンク、その他状態変化要素がアクティベートされた時、このイベントをディスパッチしなければなりません。
DOMActivate
イベント型は参考・完全性のため本現行標準で定義されていますが、現行標準はこのイベント型の使用を関連するイベント型click
へ移行することを推奨します。他現行標準が後方互換性のために独自にDOMActivate
イベント型を定義・維持する場合もあります。
DOMActivate
とclick
は完全同等ではありませんが、click
イベント型の実装動作は、DOMActivate
イベント型が設計された重要なアクセシビリティ側面を包含するように発展し、より広く実装されています。コンテンツ著者は、最大限のアクセシビリティのため、関連するmousedown
やmouseup
イベント型の代わりにclick
イベント型を利用することを推奨します。
DOMActivate
イベント型をサポートする実装は、activation
triggerに関連したclick
イベントのデフォルトアクションとしてDOMActivate
イベントもディスパッチすべきです。ただし、こうした実装は、activation behaviorを、activation triggerごとに一度だけ開始するべきです。
DOMActivate
イベント型は、XForms [XFORMS11](ホスト言語での実装を意図)向けに必須サポートです。XFormsのプラグインやスクリプトベース実装をこの現行標準のネイティブ実装(DOMActivate
イベント型非サポート)にインストールする場合、XForms ユーザーエージェントは適切なactivation
triggerに基づいて独自にDOMActivate
イベントを合成・ディスパッチしなければなりません。
したがって、UI Eventsに準拠するユーザーエージェントがclick
イベントをディスパッチした場合、XForms ユーザーエージェントは、そのclick
イベントのデフォルトアクションとして同じ関連プロパティを持つDOMActivate
イベントを合成すべきかを判断しなければなりません。判断材料にはclick
イベントのisTrusted
や、イベントターゲットにDOMActivate
イベントリスナーが登録されているか等が考えられます。
多くのDOMActivate
の相互運用サポートは期待しないでください。代わりに、より広く実装されアクセシブルな動作を提供するclick
イベント型を利用するべきです。
DOMActivate
イベント型は本現行標準で廃止されています。
8.1.2. アクティベーションイベントの順序
ユーザーエージェントがDOMActivate
イベントをサポートする場合、イベントは相互の順序で必ずディスパッチされなければなりません(関連イベントのみ記載):
イベント型 | 備考 | |
---|---|---|
1 | click
| |
2 | DOMActivate
| デフォルトアクション、ユーザーエージェントがサポートする場合;合成;isTrusted="true"
|
3 | 他の全てのデフォルトアクション(activation behavior含む) |
フォーカスされた要素がキーイベントでアクティベートされた場合、以下は典型的なイベント順序(関連イベントのみ記載):
イベント型 | 備考 | |
---|---|---|
1 | keydown
| 要素をアクティベートできるキー(Enter や (スペースバー))でなければ要素はアクティベートされない
|
2 | click
| デフォルトアクション;合成;isTrusted="true"
|
3 | DOMActivate
| デフォルトアクション、ユーザーエージェントがサポートする場合;合成;isTrusted="true"
|
4 | 他の全てのデフォルトアクション(activation behavior含む) |
8.2.
レガシーFocusEvent
イベント
8.2.1.
レガシーFocusEvent
イベント型
8.2.1.1. DOMFocusIn
型 | DOMFocusIn
|
---|---|
インターフェース | FocusEvent
|
同期/非同期 | 同期 |
バブリング | はい |
信頼できるターゲット | Window , Element
|
キャンセル可 | いいえ |
Composed | はい |
デフォルトアクション | なし |
コンテキスト (信頼イベント) |
|
ユーザーエージェントは、イベントターゲットがフォーカスを受けたとき、このイベントをディスパッチしなければなりません。フォーカスはこのイベント型のディスパッチ前に要素へ与えられていなければなりません。このイベント型はfocus
イベント型の後にディスパッチされなければなりません。
DOMFocusIn
イベント型は参考・完全性のため本現行標準で定義されていますが、現行標準はこのイベント型の使用を関連イベント型focus
およびfocusin
へ移行を推奨します。
8.2.1.2. DOMFocusOut
型 | DOMFocusOut
|
---|---|
インターフェース | FocusEvent
|
同期/非同期 | 同期 |
バブリング | はい |
信頼できるターゲット | Window , Element
|
キャンセル可 | いいえ |
Composed | はい |
デフォルトアクション | なし |
コンテキスト (信頼イベント) |
|
ユーザーエージェントは、イベントターゲットがフォーカスを失ったとき、このイベントをディスパッチしなければなりません。フォーカスはこのイベント型のディスパッチ前に要素から外れていなければなりません。このイベント型はblur
イベント型の後にディスパッチされなければなりません。
DOMFocusOut
イベント型は参考・完全性のため本現行標準で定義されていますが、現行標準はこのイベント型の使用を関連イベント型blur
およびfocusout
へ移行を推奨します。
8.2.2. レガシーFocusEventイベントの順序
以下は、要素間でフォーカスが移動する際の典型的なイベントシーケンスです。廃止されたDOMFocusIn
およびDOMFocusOut
イベントも含みます。順序は、最初にどの要素にもフォーカスがない状態を前提としています。
イベント型 | 備考 | |
---|---|---|
ユーザーがフォーカスを移動 | ||
1 | focusin
| 最初のターゲット要素がフォーカスを受ける前に送信 |
2 | focus
| 最初のターゲット要素がフォーカスを受けた後に送信 |
3 | DOMFocusIn
| サポートされている場合のみ |
ユーザーがフォーカスを移動 | ||
4 | focusout
| 最初のターゲット要素がフォーカスを失う前に送信 |
5 | focusin
| 2番目のターゲット要素がフォーカスを受ける前に送信 |
6 | blur
| 最初のターゲット要素がフォーカスを失った後に送信 |
7 | DOMFocusOut
| サポートされている場合のみ |
8 | focus
| 2番目のターゲット要素がフォーカスを受けた後に送信 |
9 | DOMFocusIn
| サポートされている場合のみ |
8.3.
レガシーKeyboardEvent
イベント
keypress
イベントは、キーイベントを捕捉し、DOMがキー押下の効果で更新される前に処理する従来の手段です。keypress
イベントを利用するコードは、レガシーなcharCode
、
keyCode
、
which
属性に依存することが多いです。
なお、keypress
イベントはキーイベント専用であり、より一般的なbeforeinput
およびinput
イベントへと置き換えられています。新しいinput
イベントはキーボード操作専用ではなく、入力元を問わずユーザー入力を捕捉できます。
8.3.1. レガシーKeyboardEvent
イベント型
8.3.1.1. keypress
型 | keypress
|
---|---|
インターフェース | KeyboardEvent
|
同期/非同期 | 同期 |
バブリング | はい |
信頼できるターゲット | Element
|
キャンセル可 | はい |
Composed | はい |
デフォルトアクション | 異なる:テキスト合成システムの起動;blur やfocus イベント;
DOMActivate イベント;その他イベント
|
コンテキスト (信頼イベント) |
|
ユーザーエージェントがサポートする場合、キーが押されたとき、かつそのキーが通常文字値を生成する場合のみ、このイベントをディスパッチしなければなりません。keypress
イベント型はデバイス依存であり、入力デバイスとOSマッピングによります。
このイベント型はキー割り当ての後に生成されなければなりません。入力メソッドエディタ利用時は発火してはなりません。
このイベントがキャンセルされると、input
イベントの発火を防ぐべきです(デフォルトアクションのキャンセルも含む)。
著者はkeypress
イベントの代わりにbeforeinput
イベントを使うべきです。
keypress
イベントは伝統的に物理キーよりも文字値検出に関連し、一部構成では全キーに利用できない場合もあります。
keypress
イベント型は本現行標準で参考・完全性のため定義されていますが、この現行標準はこのイベント型の利用を廃止します。編集コンテキストではbeforeinput
イベントを利用できます。
8.3.2.
keypress
イベント順序
keypress
イベント型は、同じキーに関連するkeydown
イベントの後、keyup
イベントの前にディスパッチされなければなりません。
keypress
イベント型は、同じキーに関連するbeforeinput
イベントの後、input
イベントの前にディスパッチされなければなりません。
keypress
イベントをサポートするユーザーエージェントにおけるキーイベントの順序例を示します:
イベント型 | KeyboardEvent key
| InputEvent data
| 備考 | |
---|---|---|---|---|
1 | keydown
| "a"
| ||
2 | beforeinput
| "a"
| ||
3 | keypress
| "a"
| ||
このキー関連のデフォルトアクション(例:DOMへの文字挿入など) | ||||
4 | input
| |||
5 | keyup
| "a"
|
8.4.
レガシーTextEvent
イベント
[Exposed =Window ]interface :
TextEvent UIEvent {readonly attribute DOMString ;
data undefined (
initTextEvent DOMString ,
type optional boolean =
bubbles false ,optional boolean =
cancelable false ,optional Window ?=
view null ,optional DOMString = "undefined"); };
data
UI EventsアルゴリズムのText EventセクションでTextEvent
インターフェースおよびtextInputイベントを参照。
9. イベントの拡張
このセクションは非規範的です
9.1. はじめに
本現行標準は複数のインターフェースや多くのイベントを定義しますが、あらゆる用途に対して網羅的なイベントセットではありません。コンテンツ著者や実装者が必要な機能を追加できるよう、本現行標準では競合なくインターフェースとイベントを拡張するための2つの仕組みを提供します:カスタムイベントと実装固有拡張です。
9.2. カスタムイベント
スクリプト著者が、アプリケーションを機能コンポーネント単位で定義し、そのアーキテクチャに意味のあるイベント型を利用したい場合があります。コンテンツ著者はCustomEvent
インターフェースを使って、利用している抽象レベルに適した独自イベントを生成できます。
updateChartイベントを作成できます:
var chartData = ...;
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent( "updateChart", true, false, { data: chartData });
document.documentElement.dispatchEvent(evt);
9.3. 実装固有拡張
新しいイベントを設計・試作中や、実装固有機能向けイベントの場合は、標準化されたイベントと区別できるようにしたいものです。実装者は、実装固有イベント型には短い文字列プレフィックスを付け、他実装や標準イベントと区別するべきです。これはCSSのベンダー固有キーワードのプレフィックスに似ていますが、JavaScriptの属性名で問題となるためCSSのダッシュ("-"
)は使いません。
FooCorpが新しいイベント
jump
を導入したいとします。このベンダーはプレフィックス"foo"
を使い、fooJump
を実装します。早期導入者は
someElement.addEventListener("fooJump", doJump, false )
を使ってイベントを試し、フィードバックに応じてFooCorpがfooJump
の挙動を調整します。
後に、別のベンダーBarOrg
も同機能を少し異なる実装で導入したいと考え、プレフィックス"bar"
でbarJump
を実装します。コンテンツ著者はBarOrg用のイベント型名でイベントを登録します。両ブラウザ対応コードは個別ハンドラーを登録するか、同一ハンドラー内でイベント型名をswitchすることで衝突を回避できます。こうした初期実験が競合を起こさず、早期導入者も複数実装向けの保守しやすいコードを書けます。
やがて、両ブラウザの挙動が成熟し、フィードバックや標準化を経て収束していくと、著者はforkしたコードを削除し、正式標準化前でも共通イベント型名jump
で同じハンドラーを使えるようになります(someElement.addEventListener( "jump",
doJump, false)
利用)。
9.3.1. 既知の実装固有プレフィックス
執筆時点で、以下のイベント型名プレフィックスが知られています:
プレフィックス | Webエンジン | 組織 |
---|---|---|
moz , Moz
| Gecko | Mozilla |
ms , MS
| Trident | Microsoft |
o , O
| Presto | Opera Software |
webkit
| WebKit | Apple, Google, 他 |
10. セキュリティに関する考慮事項
この付録ではUI Events実装のセキュリティに関する考慮事項について説明します。 議論は、本現行標準で定義されるイベントモデル・API・イベントの実装から直接生じるセキュリティ問題に限定されます。実装は通常、スクリプト言語や他のAPI、現行標準外の追加イベントもサポートします。これらは未知の要因であり、本書の範囲外です。 実装者はそれぞれの機能の現行標準で定められたセキュリティ考慮事項を参照するべきです。
本現行標準で定義される多くのイベント型はユーザー操作に応じてディスパッチされます。これにより悪意あるイベントリスナーが、ユーザーが通常機密と考える情報(例:フォーム入力時のタイプミス、送信直前に選択肢を変更した場合、タイピング速度や主要入力手段など)にアクセスできる可能性があります。最悪の場合、悪意あるイベントリスナーが全てのユーザー操作を取得し、DOM実装で一般的に利用可能な手段(例:XMLHttpRequestインターフェース)を使って第三者へ送信することも可能です(本現行標準では定義されない手段)。
外部データのロードをサポートするDOM実装では、error
イベントなどが、
コンピュータシステムやネットワーク環境の機微な情報にアクセスする手段となる場合があります。例えば、悪意あるHTML文書がローカルネットワークやlocalhost上の異なるポートへリソース埋め込みを試みる場合、埋め込まれたDOMアプリケーションがerror
やload
イベントを監視して、ローカルシステムからアクセス可能な他のコンピュータや開いているポートを特定し、後続攻撃の準備が可能となります。
UI
Events単体の実装ではこの種の攻撃を行うことは一般的に困難ですが、攻撃を可能にする他の機能のセキュリティ考慮事項が適用されます。本現行標準の準拠のため、DOM実装はDOMアプリケーションが機密情報やセンシティブな情報へアクセスできないよう合理的な措置を取っても構いません。例えば、ローカルネットワーク上のリソース埋め込みを試みるノードにload
イベントをディスパッチしない選択も考えられます。
11. 謝辞
多くの方々がDOM現行標準(Level 1, 2, 3)に貢献しました。DOMワーキンググループ、DOMインタレストグループ、WebAPIワーキンググループ、WebAppsワーキンググループの参加者を含み、特に以下の方々に感謝します:
Andrew Watson (Object Management Group), Andy Heninger (IBM), Angel Diaz (IBM), Anne van Kesteren (Opera Software), Arnaud Le Hors (W3C and IBM), Arun Ranganathan (AOL), Ashok Malhotra (IBM and Microsoft), Ben Chang (Oracle), Bill Shea (Merrill Lynch), Bill Smith (Sun), Björn Höhrmann, Bob Sutor (IBM), Charles McCathie-Nevile (Opera Software, 共同議長), Chris Lovett (Microsoft), Chris Wilson (Microsoft), Christophe Jolif (ILOG), David Brownell (Sun), David Ezell (Hewlett-Packard Company), David Singer (IBM), Dean Jackson (W3C, W3Cチーム連絡先), Dimitris Dimitriadis (Improve AB and invited expert), Don Park (invited), Doug Schepers (Vectoreal), Elena Litani (IBM), Eric Vasilik (Microsoft), Gavin Nicol (INSO), Gorm Haug Eriksen (Opera Software), Ian Davis (Talis Information Limited), Ian Hickson (Google), Ian Jacobs (W3C), James Clark (invited), James Davidson (Sun), Jared Sorensen (Novell), Jeroen van Rotterdam (X-Hive Corporation), Joe Kesselman (IBM), Joe Lapp (webMethods), Joe Marini (Macromedia), John Robinson (AOL), Johnny Stenback (Netscape/AOL), Jon Ferraiolo (Adobe), Jonas Sicking (Mozilla Foundation), Jonathan Marsh (Microsoft), Jonathan Robie (Texcel Research and Software AG), Kim Adamson-Sharpe (SoftQuad Software Inc.), Lauren Wood (SoftQuad Software Inc., 前議長), Laurence Cable (Sun), Luca Mascaro (HTML Writers Guild), Maciej Stachowiak (Apple Computer), Marc Hadley (Sun Microsystems), Mark Davis (IBM), Mark Scardina (Oracle), Martin Dürst (W3C), Mary Brady (NIST), Michael Shenfield (Research In Motion), Mick Goulish (Software AG), Mike Champion (Arbortext and Software AG), Miles Sabin (Cromwell Media), Patti Lutsky (Arbortext), Paul Grosso (Arbortext), Peter Sharpe (SoftQuad Software Inc.), Phil Karlton (Netscape), Philippe Le Hégaret (W3C, W3Cチーム連絡先および前議長), Ramesh Lekshmynarayanan (Merrill Lynch), Ray Whitmer (iMall, Excite@Home, Netscape/AOL, 議長), Rezaur Rahman (Intel), Rich Rollman (Microsoft), Rick Gessner (Netscape), Rick Jelliffe (invited), Rob Relyea (Microsoft), Robin Berjon (Expway, 共同議長), Scott Hayman (Research In Motion), Scott Isaacs (Microsoft), Sharon Adler (INSO), Stéphane Sire (IntuiLab), Steve Byrne (JavaSoft), Tim Bray (invited), Tim Yu (Oracle), Tom Pixley (Netscape/AOL), T.V. Raman (Google). Vidur Apparao (Netscape), Vinod Anupam (Lucent).
前編集者: Tom Pixley (Netscape Communications Corporation)(2002年7月まで)、 Philippe Le Hégaret (W3C)(2003年11月まで)、 Björn Höhrmann (Invited Expert)(2008年1月まで)、 Jacob Rossi (Microsoft)(2011年3月~10月)。
貢献者: WebAppsワーキンググループでは、以下の方々が現行標準の洗練・改訂に多大な貢献をされました: Bob Lund (Cable Laboratories), Cameron McCormack (Invited Expert / Mozilla), Daniel Danilatos (Google), Gary Kacmarcik (Google), Glenn Adams (Samsung), Hallvord R. M. Steen (Opera), Hironori Bono (Google), Mark Vickers (Comcast), Masayuki Nakano (Mozilla), Olli Pettay (Mozilla), Takayoshi Kochi (Google), Travis Leithead (Microsoft)。
用語集貢献者: Arnaud Le Hors (W3C)、Robert S. Sutor (IBM Research)。
テストスイート貢献者: Carmelo Montanez (NIST), Fred Drake, Mary Brady (NIST), Neil Delima (IBM), Rick Rivello (NIST), Robert Clary (Netscape), 特別にCurt Arnoldにも感謝します。
本現行標準の改良にあたり、提案や修正を送ってくださった皆様(是非今後もフィードバックください!)、また有用な書籍やウェブサイトを執筆された方々にも感謝します: Al Gilman, Alex Russell, Alexander J. Vincent, Alexey Proskuryakov, Arkadiusz Michalski, Brad Pettit, Cameron McCormack, Chris Rebert, Curt Arnold, David Flanagan, Dylan Schiemann, Erik Arvidsson, Garrett Smith, Giuseppe Pascale, James Su, Jan Goyvaerts (regular-expressions.info), Jorge Chamorro, Kazuyuki Ashimura, Ken Rehor, Magnus Kristiansen, Martijn Wargers, Martin Dürst, Michael B. Allen, Mike Taylor, Misha Wolf, Ojan Vafai, Oliver Hunt, Paul Irish, Peter-Paul Koch, Richard Ishida, Sean Hogan, Sergey Ilinsky, Sigurd Lerstad, Steven Pemberton, Tony Chang, William Edney, Øistein E. Andersen。
12. 用語集
以下の用語定義の一部は、他のW3Cや現行標準文書の定義を参考・改変しています。詳細は定義内リンクを参照してください。
- アクティベーション・トリガー
-
activation behaviorを開始するイベント。
- 著者
-
本現行標準の文脈では、著者、コンテンツ著者、スクリプト著者は、現行標準で定義されたインターフェース、イベント、イベントフローを利用するスクリプトやその他実行可能コンテンツを書く人を指します。詳細は§ 1.2.3 コンテンツ著者とコンテンツの準拠カテゴリ参照。
- body要素
-
HTMLまたはXHTML文書において、body要素は文書内容を表します。適切なHTML文書では、body要素はルート要素の最初の子。
- 文字値
-
キー値の文脈において、文字値は1つ以上のUnicode文字(例:文字や記号、または有効なUnicode文字カテゴリに属する文字列)を表す文字列です。 本現行標準では、文字値はunicode文字列(例:
U+0020
)または同じコードポイントのグリフ表現(例:" "
)で表記され、区別しやすいよう色分けされています。ソースコードでは、非グラフィック文字など一部キー値は使用言語の文字エスケープ構文で表現される場合があります。
- デッドキー
-
デッドキーは、単独では文字を生成しないが、他のキーとの組み合わせや連続押下で修飾文字(例:
"ö"
、"é"
、"â"
)を生成するキーまたはキーの組み合わせ。 - デフォルトアクション
-
デフォルトアクションは、イベントオブジェクトのディスパッチと併せて実装が必ず行うべきOPTIONALな追加動作です。各イベント型定義や現行標準が、そのイベント型のデフォルトアクションを定義します(ある場合)。イベントインスタンスによっては、アクティベーション・トリガーに関連する場合など、複数のデフォルトアクションを持つこともあります。デフォルトアクションは
preventDefault()
メソッド呼び出しでキャンセルできます。 - デルタ
-
WheelEvent
インターフェース対応入力デバイス(マウスホイールやタッチパッド等)の物理操作に対し、ユーザーエージェントがスクロールやズームする推定量(ピクセル数・行数・ページ数)。デルタ値(例:deltaX
、deltaY
、deltaZ
)は現在のdeltaMode
プロパティの文脈で解釈される。物理操作とデルタの符号(正負)の関係は環境・デバイス依存だが、ユーザーエージェントがデフォルトアクションでスクロールする場合は右手系座標系に従い、正のX,Y,Z軸はドキュメントの右端・下端・奥方向を指す。 - 廃止
-
廃止とされた機能は、旧実装や現行標準を参考にこの現行標準に含まれるが、OPTIONALで使用は推奨されない。代替が現存または進行中の機能のみ本現行標準で廃止指定される。未対応の実装は互換目的で廃止機能を実装してもよいが、新規コンテンツ著者は他に手段がない場合以外、廃止機能を使うべきでない。他現行標準は廃止機能を参照せず、代替を指すべき。廃止機能は将来現行標準で削除予定。
- 空文字列
-
空文字列は長さ
0
のDOMString
型値(印刷・制御文字なし)です。 - イベント・フォーカス
-
イベント・フォーカスは、イベントターゲット(要素など)への特別な集中・受信状態。要素ごとに機能に応じた挙動(ボタンやリンクのアクティベート準備、チェックボックスの状態切替、テキスト入力や選択範囲コピー等)。詳細は§ 3.3.3 ドキュメントフォーカスとフォーカス文脈参照。
- イベント・フォーカスリング
-
イベント・フォーカスリングは、イベント・フォーカスのターゲットを順序付けした集合。ホスト言語が文書順、インデックス、明示的ポインタなど順序付け方法を定義する場合がある。文書ごとに複数のフォーカスリングや条件付きリングも可。通常は文書順やインデックス型リングでフォーカスは最後→最初へ循環。
- イベントターゲット
- イベント型
-
イベント型は、特定名を持つイベントオブジェクトであり、特定のトリガー条件・プロパティ・特徴を定義し、他イベント型と区別される。例:
click
イベント型はmouseover
やload
イベント型と異なる特徴を持つ。イベント型はイベントオブジェクトのtype
属性で公開される。 また「イベント」とも緩やかに呼ばれる(click
イベントなど)。 - ホスト言語
-
他言語やAPI現行標準の機能を統合し、元現行標準を規範参照しつつ、定義通りの拡張のみ行う言語。元現行標準は通常ホスト言語内実装を想定(単独言語ではない)。例:XHTML, HTML, SVGはUI Eventsのホスト言語であり、本現行標準で定義されるオブジェクト・モデルを統合・拡張する。
- ヒステリシス
-
人間工学的に、位置や時間の一定範囲内で入力値を許容し、UXを向上させる設計特性。例:ダブルクリックの許容時間の範囲(時間的ヒステリシス)、親ウィンドウから子メニューへのマウス移動時に即座にメニューを閉じない(位置的ヒステリシス)。
- IME
- 入力メソッドエディタ
-
入力メソッドエディタ(IME)は、フロントエンドプロセッサとも呼ばれる、キーストロークと表意文字などの変換を行うアプリケーション。通常、辞書検索をユーザー誘導で行い、中国語・日本語・韓国語など東アジア言語で利用。IMEは、モバイル端末の辞書ベース単語補完にも利用。IMEの扱いは§ 4.3.3 入力メソッドエディタ参照。テキスト合成システムも参照。
- キー割り当て
-
キー割り当ては、キー値を特定キーに割り当てる処理で、OSやキーボード配列(例:QWERTY、Dvorak、スペイン語、InScript、中国語など)に加え、全ての修飾キー(
Shift
、Alt
等)およびデッドキー状態を考慮した結果。 - キー値
-
キー値は、特定状態のキーに関連付けられた文字値または複数文字列(例:
"Enter"
、"Tab"
、"MediaTrackNext"
など)。 全てのキーはキー値を持ち、文字値がなくても該当。コントロールキー・ファンクションキー・修飾キー・デッドキーなども含む。キー値はその時点のキー割り当てに依存。 - 修飾キー
-
修飾キーは通常のキー動作を変更するキー。例:
Shift
で文字種を変更、Fn
やAlt
で機能切替。詳細は§ 4.3.1 修飾キー、有効な修飾キー一覧はModifier Keys table([UIEvents-Key])参照。 - 名前空間URI
-
名前空間URIはXML名前空間を識別するURI。[XML-Names11]ではnamespace nameと呼ばれる。DOM APIでのURI・名前空間URIの扱い・比較については、1.3.2 DOM URIおよび1.3.3 XML Namespaces参照。
- QWERTY
-
QWERTY(クワーティ)は一般的なキーボード配列(上段左からQ,W,E,R,T,Y)。他にもDvorak・Colemakなど多様な配列が存在(多くは地域・人間工学目的)。
- ルート要素
-
文書内最初の要素ノード。全要素の親。文書要素。
- 回転
-
WheelEvent
インターフェース対応デバイスの増分変化指標。デバイスによっては実際のホイール回転、または平面移動・ボタン圧力の場合も。 - テキスト合成システム
-
代替入力(入力メソッドエディタ、音声処理、手書き認識など)を解釈し、テキスト変換するソフトウェアコンポーネント。
- 最上位イベントターゲット
-
最上位イベントターゲットは、レンダリング順で最も上位にあり、イベントターゲットとなれる要素。グラフィカルUIではユーザーのポインティングデバイス下の要素。ヒットテストや積み重ね順詳細はホスト言語参照。
- Unicode文字カテゴリ
-
各Unicodeコードポイントに定義されるGeneral Category値の部分集合。文字(Ll, Lm, Lo, Lt, Lu)、 数字(Nd, Nl, No)、 句読点(Pc, Pd, Pe, Pf, Pi, Po, Ps)、 記号(Sc, Sk, Sm, So) が含まれる。
- 未初期化値
-
イベント属性(
bubbles
やcurrentTarget
等)の値は、initEvent()
で初期化する前は未初期化値。新しいイベントをcreateEvent()
で生成した直後に適用。