UI イベント

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2024/WD-uievents-20240907/
最新公開バージョン:
https://www.w3.org/TR/uievents/
編集者ドラフト:
https://w3c.github.io/uievents/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/uievents/
フィードバック:
GitHub
仕様内でインライン
編集者:
(Google)
(Microsoft)
元編集者:
Doug Schepers (2008年3月 - 2011年5月)
テスト:
web-platform-tests uievents/ (進行中の作業)

概要

この仕様書は、[DOM]で定義されるDOMイベントオブジェクトを拡張するUIイベントを定義します。UIイベントは、通常、マウスやキーボード入力など、ユーザーインタラクションを処理するために視覚的なユーザーエージェントによって実装されます。

この文書の状態

このセクションは、この文書が公開された時点での状態を記述します。現在のW3Cの公開文書の一覧と、この技術報告書の最新改訂版は、W3C技術報告書インデックス(https://www.w3.org/TR/)で確認できます。

この文書は、Web Applications Working Groupによって作業草案として公開されました。この文書は、W3C勧告となることを目的としています。

この文書は、Web Applications Working Groupによって、勧告トラックを使用して作業草案として公開されました。 この仕様に関するフィードバックやコメントは歓迎します。GitHub issuesをご利用ください。以前の議論はpublic-webapps@w3.org archivesで確認できます。

作業草案としての公開は、W3Cおよびそのメンバーによる承認を意味するものではありません。この文書は草案であり、いつでも更新、置き換え、または廃止される可能性があります。この文書を進行中の作業以外のものとして引用することは不適切です。

この文書は、W3C特許ポリシーの下で運営されるグループによって作成されました。W3Cは、グループの成果物に関連して行われた特許開示の公開リストを維持しています。そのページには特許を開示するための指示も含まれています。特許に関する実際の知識を持つ個人は、W3C特許ポリシー第6節に従って情報を開示する必要があります。

この文書は、2023年11月3日W3Cプロセス文書に準拠しています。

1. はじめに

1.1. 概要

UI Eventsは主に2つの目的で設計されています。最初の目的は、event システムを設計することであり、これにより event listeners の登録を可能にし、イベントがツリー構造を通じて流れる仕組みを記述します。さらに、本仕様ではユーザーインターフェイス制御やドキュメントの変更通知のための標準的なイベントモジュールを提供し、これらの各イベントモジュールに関するコンテキスト情報も定義します。

UI Eventsの2つ目の目的は、現行のブラウザで使用されているイベントシステムの共通部分集合を提供することです。これは、既存のスクリプトやコンテンツの相互運用性を促進するためです。この目的が完全な後方互換性を持って達成されるとは期待されていませんが、可能な限りその達成を目指しています。

1.2. 適合性

このセクションは規範的です。

本仕様書内では、キーワード MUSTMUST NOTREQUIREDSHALLSHALL NOTSHOULDSHOULD NOTRECOMMENDEDMAY、および 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 agentDOMString データ型を [WebIDL] で定義されている通りにサポートしなければなりませんが、UI Eventsに適合するだけで [WebIDL] で定義されているすべてのメソッドやデータ型をサポートする必要はありません)。

本仕様では、異なる user agent、仕様、コンテンツ著者向けに複数の適合クラスを定義しています:

1.2.1. Webブラウザおよびその他の動的または対話的な user agents

動的または対話的な user agent、ここでは「ブラウザ」と呼びます(Webブラウザ、AT(アクセシビリティ技術)アプリケーション、またはそれに類するプログラムなど)、は次の条件を満たす場合UI Eventsに適合します:

適合するブラウザは、条件が満たされたとき、適切な 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仕様記述慣例 に従っていますが、以下の追加事項があります:

さらに、本仕様では特定の用語が特別な意味で用いられます。「実装」という用語は、本仕様を実装するブラウザ、コンテンツオーサリングツール、その他の user agent を指します。一方、コンテンツ著者は、本仕様で説明されているインターフェイス、メソッド、属性、イベント等を利用してWebアプリケーションを作成する人を指し、ユーザーはそのWebアプリケーションを実装上で利用する人です。

最後に:

これは注記です。

これは未解決の課題です。

これは警告です。

interface Example {
    // This is an IDL definition.
};

3. 基本イベントインターフェイス

[DOM] で定義される基本的なイベントインターフェイスは、UI Eventsに不可欠です。これらの基本イベントインターフェイスは実装で常にサポートされなければなりません:

本仕様で定義されるイベント型はこれらの基本インターフェイスから派生し、派生元のインターフェイスが持つすべての属性、メソッド、定数を継承しなければなりません。

以下の図は本仕様で記述されるインターフェイスの継承構造を示します。

本仕様で定義されるインターフェイスの継承関係の図示
本仕様で定義されるインターフェイスの継承関係の図示

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 はい 状況による:beforeinputinput イベントの発火、文字入力システムの起動、blurfocus イベントの発火、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 listenerWindowDocumentElement ノード以外や、バブリングフェーズのみで登録された場合、この 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 detail = 0;
};
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

出力

なし

  1. 基本となる Event 属性を初期化します:

    1. Event を初期化するevent, eventType, bubbles, cancelable で呼び出す

    2. event.targeteventTarget を設定

  2. 以下の公開属性を初期化します:

    1. event.vieweventTargetノード文書Window オブジェクトを設定

    2. event.detail に 0 を設定

  3. 以下の歴史的属性を初期化します:

    1. event.which に 0 を設定(MouseEventKeyboardEvent の両方で使用)

3.2.3. UIEvent 型

ユーザーインターフェイスイベント型を以下に示します。これらのイベントの一部は、ユーザーインターフェイスから生成された場合 UIEvent インターフェイスを使用しますが、詳細は各イベントごとに記載されています。

3.2.3.1. load
load
インターフェイス UIEvent (ユーザーインターフェイスから生成された場合)、それ以外は Event
同期 / 非同期 非同期
バブリング いいえ
信頼できるターゲット WindowDocumentElement
キャンセル可能 いいえ
デフォルト動作 なし
コンテキスト
(信頼イベント)

DOM実装がリソース(例:ドキュメント)および依存リソース(画像、スタイルシート、スクリプトなど)の読み込みを完了したとき、user agent はこのイベントを発火しなければなりません。依存リソースのロード失敗は、親リソースがDOM経由でアクセス可能であれば、このイベントの発火を妨げてはなりません。このイベント型が発火される場合、少なくとも Document ノードでこのイベントを発火する必要があります。

旧来の理由により、ドキュメント内のリソース(例:画像)に対する load イベントは、HTML 実装では伝播パスに Window を含みません。詳細は [HTML5] を参照してください。

3.2.3.2. unload
unload
インターフェイス UIEvent (ユーザーインターフェイスから生成された場合)、それ以外は Event
同期 / 非同期 同期
バブリング いいえ
信頼できるターゲット WindowDocumentElement
キャンセル可能 いいえ
デフォルト動作 なし
コンテキスト
(信頼イベント)

DOM実装が環境からリソース(例:ドキュメント)や依存リソース(画像、スタイルシート、スクリプトなど)を除去したとき、user agent はこのイベントを発火しなければなりません。このイベント型の発火後にドキュメントはアンロードされる必要があります。このイベント型が発火される場合、少なくとも Document ノードでこのイベントを発火する必要があります。

3.2.3.3. abort
abort
インターフェイス UIEvent (ユーザーインターフェイスから生成された場合)、それ以外は Event
同期 / 非同期 同期
バブリング いいえ
信頼できるターゲット WindowElement
キャンセル可能 いいえ
デフォルト動作 なし
コンテキスト
(信頼イベント)

リソースのロードが中断されたとき(例:ユーザーがロード中にキャンセルした場合)、user agent はこのイベントを発火しなければなりません。

3.2.3.4. error
error
インターフェイス UIEvent (ユーザーインターフェイスから生成された場合)、それ以外は Event
同期 / 非同期 非同期
バブリング いいえ
信頼できるターゲット WindowElement
キャンセル可能 いいえ
デフォルト動作 なし
コンテキスト
(信頼イベント)

リソースのロードに失敗した場合や、ロードされたが意味的に解釈できない場合(例:不正な画像、スクリプト実行エラー、非整形式XMLなど)、user agent はこのイベントを発火しなければなりません。

3.2.3.5. select
select
インターフェイス UIEvent (ユーザーインターフェイスから生成された場合)、それ以外は Event
同期 / 非同期 同期
バブリング はい
信頼できるターゲット Element
キャンセル可能 いいえ
デフォルト動作 なし
コンテキスト
(信頼イベント)

ユーザーがテキストを選択したとき、user agent はこのイベントを選択後に発火しなければなりません。

本仕様では選択されたテキストへのアクセスに関するコンテキスト情報は提供しません。該当する場合、ホスト言語は、ユーザーがどのように内容を選択できるか(国際的な言語慣習も考慮)、select イベントがどのタイミングで発火されるか、コンテンツ著者がユーザー選択内容にどのようにアクセスできるかを定義するべきです。

ユーザー選択内容へアクセスするには、コンテンツ著者は ホスト言語のネイティブ機能(HTML 編集APIの Document.getSelection() メソッドなど)を使用します。[Editing]

select イベントはすべての要素や言語で利用できるとは限りません。例えば [HTML5] では select イベントはフォームの inputtextarea 要素でのみ発火できます。 実装は、フォームコントロール外のテキスト選択や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 を識別するために使用します。

ネストされたブラウジングコンテキストとのセキュリティ上の理由から、入出時に関連する EventTargetnull であるべきです。

この属性の 未初期化値null でなければなりません。

3.3.1.2. FocusEventInit
dictionary FocusEventInit : UIEventInit {
  EventTarget? relatedTarget = null;
};
FocusEventInit . relatedTarget
relatedTarget は、focusfocusin イベントの場合はフォーカスを失う要素、blurfocusout イベントの場合はフォーカスを得る要素に初期化してください。

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つの区分があります:

本仕様で定義されるイベント型はドキュメントフォーカスのみを対象にしており、イベント詳細で識別される event target はウィンドウ内のドキュメント(または複数ドキュメント)の一部でなければならず、ブラウザやOSの一部であってはなりません(フォーカスコンテキスト間の切り替え時も同様)。

通常、ドキュメントには常にフォーカスされた要素(ドキュメント要素自身の場合も含む)と持続的な フォーカスリング があります。フォーカスコンテキスト間を切り替える場合も、ドキュメントの現在のフォーカス要素とフォーカスリングは通常そのまま維持されます。例えば、3つのフォーカス可能要素があるドキュメントで、2番目の要素がフォーカスされている場合に、ユーザーがOSのフォーカスを他アプリに移し、再びブラウザに戻しても、ドキュメント内では2番目の要素がフォーカスされており、Tabキー操作で3番目の要素にフォーカスが移ります。ホスト言語 は、特定の要素がフォーカスを受け取る条件や方法、フォーカスの変更手段や順序などを定義してもかまいません。例えば、ある場合はポインタ移動でフォーカスを得たり、他の場合はクリックが必要だったりします。フォーカスできない要素や、クリックのみでフォーカスできTabキーではできない要素もあり得ます。ドキュメントは複数のフォーカスリングを持つ場合もあり、他仕様でより複雑なフォーカスモデル(複数要素が同時にフォーカスを持つ等)が定義されることもあります。

3.3.4. フォーカスイベント型

フォーカスイベント型を以下に示します。

3.3.4.1. blur
blur
インターフェイス FocusEvent
同期 / 非同期 同期
バブリング いいえ
信頼できるターゲット WindowElement
キャンセル可能 いいえ
composed はい
デフォルト動作 なし
コンテキスト
(信頼イベント)

user agent は、event target がフォーカスを失ったとき、このイベントを発火しなければなりません。フォーカスはこのイベント型の発火前に要素から取り除かれなければなりません。このイベント型は focusout に似ていますが、バブリングしません。

3.3.4.2. focus
focus
インターフェイス FocusEvent
同期 / 非同期 同期
バブリング いいえ
信頼できるターゲット WindowElement
キャンセル可能 いいえ
composed はい
デフォルト動作 なし
コンテキスト
(信頼イベント)

user agent は、event target がフォーカスを受け取ったとき、このイベントを発火しなければなりません。フォーカスはこのイベント型の発火前に要素に付与されなければなりません。このイベント型は focusin に似ていますが、バブリングしません。

3.3.4.3. focusin
focusin
インターフェイス FocusEvent
同期 / 非同期 同期
バブリング はい
信頼できるターゲット WindowElement
キャンセル可能 いいえ
composed はい
デフォルト動作 なし
コンテキスト
(信頼イベント)

user agent は、event target がフォーカスを受け取ったとき、このイベントを発火しなければなりません。event target はフォーカスを受け取った要素でなければなりません。focus イベントはこのイベント型の発火前に発火される必要があります。このイベント型は focus に似ていますが、バブリングします。

3.3.4.4. focusout
focusout
インターフェイス FocusEvent
同期 / 非同期 同期
バブリング はい
信頼できるターゲット WindowElement
キャンセル可能 いいえ
composed はい
デフォルト動作 なし
コンテキスト
(信頼イベント)

user agent は、event target がフォーカスを失ったとき、このイベントを発火しなければなりません。event target はフォーカスを失った要素でなければなりません。blur イベントはこのイベント型の発火前に発火される必要があります。このイベント型は blur に似ていますが、バブリングします。

3.4. マウスイベント

マウスイベントモジュールは、[HTML401]onclickondblclickonmousedownonmouseuponmouseoveronmousemoveonmouseout 属性に由来します。本イベントモジュールは、マウスやトラックボールなどのポインティング入力デバイスで使用するために特化して設計されています。

3.4.1. MouseEvent インターフェイス

DOM Level 2 で導入され、本仕様で修正

MouseEvent インターフェイスは、マウスイベントに関連する特定のコンテキスト情報を提供します。

ネストされた要素の場合、マウスイベントは常に最も深い入れ子の要素がターゲットとなります。

ターゲット要素の祖先は、イベントバブリングを利用して、その子孫要素内で発生したマウスイベントの通知を受け取ることができます。

MouseEvent インターフェイスのインスタンスを生成するには、MouseEvent コンストラクタを使用し、必要に応じて MouseEventInit 辞書を渡します。

MouseEvent オブジェクトを initMouseEvent で初期化する場合、実装は clientXclientY などのクライアント座標を用いて他の座標(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, 読み取り専用
KeyboardEventctrlKey 属性を参照。

この属性の 未初期化値false でなければなりません。

shiftKey, 型: boolean, 読み取り専用
KeyboardEventshiftKey 属性を参照。

この属性の 未初期化値false でなければなりません。

altKey, 型: boolean, 読み取り専用
KeyboardEventaltKey 属性を参照。

この属性の 未初期化値false でなければなりません。

metaKey, 型: boolean, 読み取り専用
KeyboardEventmetaKey 属性を参照。

この属性の 未初期化値false でなければなりません。

button, 型: short, 読み取り専用
マウスボタンの押下や解放によって発生するマウスイベントでは、button 属性で、どのポインタデバイスのボタンが状態変化したかを示す必要があります。

button 属性の値は以下の通りでなければなりません:

  • 0:デバイスの主ボタン(一般的には左ボタン、または単一ボタンデバイスの場合は唯一のボタン。UIコントロールのアクティベートやテキスト選択に使用)または未初期化値。

  • 1:補助ボタン(一般的には中央ボタン、マウスホイールと組み合わせることが多い)。

  • 2:副ボタン(一般的には右ボタン、コンテキストメニュー表示に使用)。

  • 3:X1(戻る)ボタン。

  • 4:X2(進む)ボタン。

一部のポインティングデバイスはより多くのボタン状態を提供/シミュレートしており、2より大きい、または0より小さい値がそのようなボタンを表す場合があります。

button の値は、マウスボタンの押下/解放で発生していないイベントでは更新されません。 このような場合、値0を左ボタンと解釈せず、未初期化値として扱うよう注意してください。

mousedownmouseup などのイベントに関連する デフォルト動作 は使用するマウスボタンに依存します。

この属性の 未初期化値0 でなければなりません。

buttons, 型: unsigned short, 読み取り専用
すべてのマウスイベントで、buttons 属性は現在押されているマウスボタンの組み合わせをビットマスクで示す必要があります。

buttons 属性と button 属性は名前が似ていますが値の意味が大きく異なります。button 属性は mousedown / mouseup のイベントハンドラ中で妥当な値とされますが、buttons 属性は、どの信頼できる MouseEvent オブジェクトでもマウスボタンの状態を反映します(「現在どのボタンも押されていない」状態は値0で表現)。

buttons 属性の値は以下の通りでなければなりません:

  • 0:現在どのボタンも押されていない場合。

  • 1:デバイスの主ボタン(一般的には左ボタン、または単一ボタンデバイスの場合は唯一のボタン。UIコントロールのアクティベートやテキスト選択に使用)。

  • 2:副ボタン(一般的には右ボタン、コンテキストメニュー表示など)、該当する場合。

  • 4:補助ボタン(一般的には中央ボタン、マウスホイールと組み合わせることが多い)。

一部のポインティングデバイスはより多くのボタンを提供/シミュレートしており、そのようなボタンを表す場合は各ボタンごとに値を2倍(バイナリ系列 81632 ... )する必要があります。

任意のボタン値の合計は一意の値となるため、コンテンツ著者はビット演算を用いて現在押されているボタン数や種類を判定できます。例えば値3は左ボタンと右ボタンが両方押されていること、値5は左ボタンと中央ボタンが両方押されていることを示します。

mousedownmouseup などのイベントに関連する デフォルト動作 は使用するマウスボタンに依存します。

この属性の 未初期化値0 でなければなりません。

relatedTarget, 型: EventTarget, 読み取り専用, nullable
UIイベントの種類に応じて、二次的な EventTarget を識別するために使用します。

この属性の 未初期化値null でなければなりません。

getModifierState(keyArg)

本仕様で導入

キー値を使ってモディファイアの状態を問い合わせます。

モディファイアキーでかつそのモディファイアが有効なら true、そうでなければ false を返します。

DOMString keyArg
KeyboardEventgetModifierState() メソッドの説明を参照してください。
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 は、マウスポインタが直前に離れた要素(mouseovermouseenter イベントの場合)や、マウスポインタが入った要素(mouseoutmouseleavefocusout イベントの場合)に初期化する必要があります。他のイベントではこの値は割り当て不要(デフォルトは null)。

マウスイベント生成時、現在のクリック数を管理しなければなりません。これは、特定の時間内にポインティングデバイスのボタンが連続してクリックされた回数を示す非負整数です。カウントがリセットされる遅延は環境設定に依存します。

3.4.2. イベント修飾子初期化辞書

MouseEventKeyboardEvent インターフェイスは、キーボード修飾子属性のセットを共有し、追加の修飾子状態取得メカニズムをサポートしています。次の辞書は、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で定義されるイベント構築アルゴリズムを補足します:

3.4.3. MouseEventアルゴリズム

3.4.3.1. ネイティブOS要件

このセクションのアルゴリズムは、ネイティブプラットフォームOSが下記を提供することを前提とします:

これらのイベントでは、OSは以下の情報を提供できる必要があります:

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

出力

なし

  1. UIEventを初期化するevent, eventType, eventTarget, bubbles, cancelable で呼び出す。

  2. 以下の公開属性を初期化:

    1. event.screenX = イベント発生位置のデスクトップ原点からのx座標

    2. event.screenY = イベント発生位置のデスクトップ原点からのy座標

    3. event.clientX = イベント発生位置のビューポート原点からのx座標

    4. event.clientY = イベント発生位置のビューポート原点からのy座標

    5. マウスイベント修飾子の設定event に対して行う

    6. event.button = 0

    7. event.buttons = マウスボタン・ビットマスク

  3. MouseEvent用のPointerLock属性を初期化するevent に対して行う

3.4.3.5. マウスイベント修飾子を設定する
入力

event、更新対象の MouseEvent

出力

なし

  1. key modifier state に "Shift" が含まれていれば eventshift flag を設定し、そうでなければ解除する

  2. key modifier state に "Control" が含まれていれば eventcontrol flag を設定し、そうでなければ解除する

  3. key modifier state に "Alt" が含まれていれば eventalt flag を設定し、そうでなければ解除する

  4. key modifier state に "AltGraph" が含まれていれば eventaltgraph flag を設定し、そうでなければ解除する

  5. key modifier state に "Meta" が含まれていれば eventmeta flag を設定し、そうでなければ解除する

  6. event の shiftKey を、event の shift flag が設定されていれば true、そうでなければ false にする

  7. event の ctrlKey を、event の control flag が設定されていれば true、そうでなければ false にする

  8. event の altKey を、event の alt flag または altgraph flag が設定されていれば true、そうでなければ false にする

  9. event の metaKey を、event の meta flag が設定されていれば true、そうでなければ false にする

3.4.3.6. キャンセル可能な MouseEvent を作成する
入力

eventType、有効な MouseEvent 型を含む DOMString

eventTarget、イベントの EventTarget

出力

なし

  1. bubbles を "true" にする

  2. cancelable を "true" にする

  3. event = MouseEvent を使用して 新しいイベントを作成した結果とする

  4. MouseEvent を初期化する(event, eventType, eventTarget, bubbles, cancelable を使用)

  5. event を返す

3.4.3.7. キャンセル不可な MouseEvent を作成する
入力

eventType、有効な MouseEvent 型を含む DOMString

eventTarget、イベントの EventTarget

出力

なし

  1. bubbles を "false" にする

  2. cancelable を "false" にする

  3. event = MouseEvent を使用して 新しいイベントを作成した結果とする

  4. MouseEvent を初期化する(event, eventType, eventTarget, bubbles, cancelable を使用)

  5. event を返す

3.4.3.8. MouseEvent の button 属性を計算する
入力

mbutton、マウスボタンを識別する ID

出力

MouseEventbutton 属性に格納するのに適したボタン ID

  1. mbutton が主ボタンなら 0 を返す

  2. mbutton が補助(中央)ボタンなら 1 を返す

  3. mbutton が副ボタンなら 2 を返す

  4. mbutton が X1(戻る)ボタンなら 3 を返す

  5. mbutton が X2(進む)ボタンなら 4 を返す

3.4.3.9. MouseEvent の属性をネイティブから設定する
入力

event、初期化する MouseEvent

native、ネイティブのマウスイベント

出力

なし

TODO

  1. event の type が [mousedown, mouseup] のいずれかであれば、

    1. native から押されたマウスボタンを識別する ID(mbutton)を取得する

    2. event の buttonMouseEvent の button 属性を計算する (mbutton) の結果を設定する

3.4.3.10. ネイティブのマウスダウンを処理する
入力

native、ネイティブの mousedown

出力

なし

  1. mbuttonnative から取得し、押されたマウスボタンを識別する ID とする

  2. マウスボタンのビットマスク を次のように更新する:

    1. mbutton が主ボタンなら 0x01 ビットをセットする

    2. mbutton が副ボタンなら 0x02 ビットをセットする

    3. mbutton が補助(中央)ボタンなら 0x04 ビットをセットする

    他のボタンは 0x08 から追加可能

  3. target = ヒットテストnative からビューポート相対座標で)

  4. event = キャンセル可能な MouseEvent を作成する("mousedown", target

  5. MouseEvent の属性をネイティブから設定するnative

  6. pointerdown イベントを送信する可能性event

  7. result = event を target でディスパッチする

  8. result が true かつ targetフォーカス可能領域 かつ クリックでフォーカス可能 なら

    1. フォーカス手順target で実行する

  9. mbutton が副ボタンなら

    1. コンテキストメニューを表示する可能性native, target

3.4.3.11. ネイティブのマウスアップを処理する
入力

native、ネイティブの mouseup

出力

なし

mousedown と mouseup の間に他のマウスイベントが発生することがある。

  1. mbuttonnative から取得し、押されたマウスボタンを識別する ID とする

  2. マウスボタンのビットマスク を次のように更新する:

    1. mbutton が主ボタンなら 0x01 ビットをクリアする

    2. mbutton が副ボタンなら 0x02 ビットをクリアする

    3. mbutton が補助(中央)ボタンなら 0x04 ビットをクリアする

  3. target = ヒットテストnative からビューポート相対座標で)

  4. event = キャンセル可能な MouseEvent を作成する("mouseup", target

  5. MouseEvent の属性をネイティブから設定するnative

  6. pointerup イベントを送信する可能性event

  7. event を target でディスパッチする

3.4.3.12. ネイティブのマウスクリックを処理する
入力

native、ネイティブのマウスクリック

出力

なし

プラットフォームは ネイティブのマウスアップを処理する の直後に、クリックが発生する mouseup に対してこれを呼び出すべき。

  1. target = ヒットテストnative からビューポート相対座標で)

  2. クリックイベントを送信するnative, target

3.4.3.13. クリックイベントを送信する
入力

native、ネイティブの mousedown

target、イベントの EventTarget

出力

なし

  1. mbutton = 1(デフォルトは主マウスボタン)

  2. native が有効なら

    1. mbuttonnative から取得し、押されたマウスボタンを識別する ID とする

  3. mbutton が主ボタンなら eventType = "click"、それ以外なら "auxclick" に設定する

  4. event = PointerEvent を作成するeventType, target

  5. native が有効なら

    1. MouseEvent の属性をネイティブから設定するevent, native

    2. eventscreenX が整数値でない場合は丸める

    3. eventscreenY が整数値でない場合は丸める

  6. event を target でディスパッチする

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、ネイティブのマウスダブルクリック

出力

なし

ダブルクリックが発生したクリックの直後にこれを呼び出すべき。

  1. mbuttonnative から取得し、押されたマウスボタンを識別する ID とする

  2. mbutton が主ボタンでなければ return

  3. target = ヒットテストnative からビューポート相対座標で)

  4. event = PointerEvent を作成する("dblclick", target

  5. MouseEvent の属性をネイティブから設定するevent, native

  6. eventscreenX が整数値でない場合は丸める

  7. eventscreenY が整数値でない場合は丸める

  8. event を target でディスパッチする

3.4.3.15. ネイティブのマウスムーブを処理する
入力

native、ネイティブのマウスムーブ

出力

なし

このアルゴリズムは PointerEvents のディスパッチについて仮定しているが、現時点では明示的に規定されていない。pointerevents/285 が解決されたら更新が必要かもしれない。

  1. target = ヒットテストnative からビューポート相対座標で)

  2. targetDomPath = DOM パスを計算する

  3. 現在の要素から離れるイベントを生成する:

    1. last mouse element が定義されていて target と異なる場合、

      1. mouseout = キャンセル可能な MouseEvent を作成する("mouseout", last mouse element

      TODO: native から mouseout の属性を設定する。+CSSOM 属性も

      1. pointerout イベントを送信する可能性mouseout

      2. mouseout を target でディスパッチする

        キャンセル時の挙動要確認(影響はないように見える)。

      3. leaveElements = last mouse DOM path のコピーから targetDomPath と共通な要素をすべて除いたもの。

      4. leaveElements の各 element について:

        element が削除された場合や移動された場合の挙動要確認。DOM 変化で mouseleave が発火すべきか、今送るべきか、送らず無視すべきか。現行ブラウザの挙動要調査。

        1. mouseleave = キャンセル不可な MouseEvent を作成する("mouseleave", element

        2. mouseleave.composed = false

          互換性要確認: event.composed の値。仕様は false。Chrome/Linux は true、Firefox/Linux は false。

        3. pointerleave イベントを送信する可能性mouseleave

        4. result = mouseleave を element でディスパッチする

  4. 新しい要素に入るイベントを生成する:

    1. targetlast mouse element と異なる場合、

      1. mouseover = キャンセル可能な MouseEvent を作成する("mouseover", target

      TODO: native から mouseout の属性を設定する。+CSSOM 属性も

      1. pointerover イベントを送信する可能性mouseover

      2. mouseout を target でディスパッチする

        キャンセル時の挙動要確認(影響はないように見える)。

      3. enterElements = targetDomPath のコピーから last mouse DOM path と共通な要素をすべて除いたもの。

      4. enterElements の各 element について:

        element が削除/移動された場合の挙動要確認。

        1. mouseenter = キャンセル不可な MouseEvent を作成する("mouseenter", element

        2. mouseenter.composed = false

          互換性要確認: event.composed の値。仕様は false。Chrome/Linux は true、Firefox/Linux は false。

        3. pointerenter イベントを送信する可能性mouseenter

        shadow DOM 要素での互換性要確認。Chrome/Linux は element および shadow root 両方にこのイベントを発火する。

        1. result = mouseenter を element でディスパッチする

      5. last mouse elementtarget に設定

      6. last mouse DOM pathtargetDomPath に設定

  5. mousemove = キャンセル可能な MouseEvent を作成する("mousemove", element

  6. mousemove 用に PointerLock 属性を設定する

  7. pointermove イベントを送信する可能性mousemove

  8. mousemove を element でディスパッチする

3.4.3.16. コンテキストメニューを表示する可能性
入力

native、ネイティブの mousedown または pointer イベント

target、イベントの EventTarget

出力

なし

  1. menuevent = PointerEvent を作成する("contextmenu", target

  2. native が有効なら

    1. MouseEvent の属性をネイティブから設定するnative

  3. result = menuevent を target でディスパッチする

  4. 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の子要素です:

3つの重ねられた要素(Aが一番下、Cが一番上)上でポインティングデバイスが動く図
3つの重ねられた要素上でポインティングデバイスが動くグラフィカルな説明図。

ポインティングデバイスが要素スタック外から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

mousedownmouseup 間に許容される mousemove イベントの遅延や回数・距離は実装やデバイス・プラットフォームによって異なります。この許容値は、揺れる手など身体障害を持つユーザーがポインティングデバイスを操作する際の補助となります。

各実装は適切な ヒステリシス許容値を決定しますが、一般的には mousedown および mouseup のイベントターゲットが同一要素で、その間に mouseout または mouseleave が挟まれなければ click および dblclick をその要素で発火すべきです。また、mousedownmouseupのターゲット要素が異なる場合は、最近傍の共通包括祖先で click および dblclick を発火すべきです。

例えば、mousedownイベントがHTML文書のbody要素に対して発生し、対応するmouseupイベントがルート要素に対して発生した場合、最も近い共通包括祖先であるルート要素clickイベントがディスパッチされます。

イベントターゲット(たとえばターゲット要素)がマウスイベント順序中にDOMから削除された場合、その要素に対する残りのイベントは発火されてはなりません。

例えば、ターゲット要素がmousedownイベントの結果としてDOMから削除された場合、mouseupclickdblclick、またはデフォルトアクティベーションイベントはその要素ではディスパッチされません。ただし、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 イベントは mouseovermousemovemouseout のいずれかがボタン押下-解放間に発生していてもディスパッチされる場合があります。

auxclick イベント型の デフォルトアクションは、イベントの イベントターゲットbuttonbuttons 属性の値により異なります。一般的な デフォルトアクションは次の通りです:

中央ボタンの 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値が0buttons値が1)の場合のみ発火すべきです。副ボタン(標準マウスの中央ボタンや右ボタンなど)では click イベントは発火してはなりません。副ボタンに対応するイベントは auxclick を参照してください。

click イベントは、同一要素で mousedown および mouseup イベントの後に発生する場合があります(テキストノードなど他のノード型の変更は無視)。環境設定によっては、 click イベントは mouseovermousemovemouseout のいずれかがボタン押下-解放間に発生していてもディスパッチされる場合があります。click イベントの後に dblclick イベントが発生する場合もあります。

例:ユーザーが大きな line-height でスタイルされた <p> 要素のテキストノード子で mousedown し、そのままマウスをわずかにずらしてテキストがない空間(同じテキストブロックの行間)に移動し、そこで mouseup した場合でも、通常の click の時間的ヒステリシス内であれば、同じ要素範囲内で動作したとみなされ click イベントが発火される可能性があります。ちなみに UA が生成するマウスイベントはテキストノードではディスパッチされません。

ポインタデバイスと関連するだけでなく、click イベント型は要素アクティベーションの一部としても必ずディスパッチされなければなりません。

最大限のアクセシビリティのため、コンテンツ著者はカスタムコントロールのアクティベーション動作を定義する際、clickイベント型を使用することが推奨されます。mousedownmouseupなど他のポインティングデバイスイベント型は、よりデバイス依存です。 clickイベント型は元々ポインタデバイス(例:マウス)に由来しますが、その後の実装拡張によりこの関連を超えて拡張されており、要素のアクティベーションに関してデバイス非依存のイベント型と考えられます。

click イベント型の デフォルトアクションは、イベントの イベントターゲットbuttonbuttons 属性の値により異なります。一般的な デフォルトアクションは次の通りです:

3.4.5.3. contextmenu
contextmenu
インターフェース PointerEvent
同期 / 非同期 同期
バブリング あり
信頼されたターゲット Element
キャンセル可能 あり
合成イベント あり
デフォルトアクション 対応している場合はコンテキストメニューを呼び出す
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、コンテキストメニューを呼び出す前にこのイベントをディスパッチしなければなりません。

contextmenu イベントが右マウスボタンで発生した場合は、mousedownイベントの後に contextmenu イベントをディスパッチしなければなりません。

プラットフォームによっては、contextmenu イベントが mouseup イベントの前または後にディスパッチされることがあります。

3.4.5.4. dblclick
dblclick
インターフェース MouseEvent
同期 / 非同期 同期
バブリング あり
信頼されたターゲット Element
キャンセル可能 あり
合成イベント あり
デフォルトアクション なし
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、ポインティングデバイスの主ボタンで要素上を2回クリックした場合にこのイベントをディスパッチしなければなりません。ダブルクリックの定義は環境設定によって異なりますが、イベントターゲットは mousedownmouseupdblclick の間で同じでなければなりません。このイベント型は、クリックとダブルクリックが同時に発生した場合は click イベント型の後、そうでなければ mouseup イベント型の後にディスパッチしなければなりません。

click イベント同様、dblclick イベントは主ボタンのみ発火すべきです。副ボタンでは dblclick イベントは発火してはなりません。

click イベントをキャンセルしても dblclick イベントの発火には影響しません。

click イベント型同様、デフォルトアクションは、イベントの イベントターゲットbuttonbuttons 属性の値により異なります。典型的な デフォルトアクション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 eventInitDict = {});
  // DeltaModeCode
  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 属性を初期化する。相対的な正の値(deltaXdeltaYも)は右手系座標系によって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
キャンセル可能 状況による
合成イベント あり
デフォルトアクション 文書のスクロール(またはズーム)
コンテキスト
(信頼されたイベント)
  • Event.target : 現在のホイールイベントトランザクションの要素ターゲット
  • UIEvent.view : Window
  • UIEvent.detail : 0
  • MouseEvent.screenX : ホイールがポインタデバイスに関連付けられている場合、画面上のポインタ位置に基づく値、それ以外は0
  • MouseEvent.screenY : ホイールがポインタデバイスに関連付けられている場合、画面上のポインタ位置に基づく値、それ以外は0
  • MouseEvent.clientX : ホイールがポインタデバイスに関連付けられている場合、ビューポート内のポインタ位置に基づく値、それ以外は0
  • MouseEvent.clientY : ホイールがポインタデバイスに関連付けられている場合、ビューポート内のポインタ位置に基づく値、それ以外は0
  • MouseEvent.altKey : Alt修飾キーが有効ならtrue、そうでなければfalse
  • MouseEvent.ctrlKey : Control修飾キーが有効ならtrue、そうでなければfalse
  • MouseEvent.shiftKey : Shift修飾キーが有効ならtrue、そうでなければfalse
  • MouseEvent.metaKey : Meta修飾キーが有効ならtrue、そうでなければfalse
  • MouseEvent.button : ホイールがポインタデバイスに関連付けられている場合、現在押されているボタンに基づく値、それ以外は0
  • MouseEvent.buttons : ホイールがポインタデバイスに関連付けられている場合、現在押下されているすべてのボタンに基づく値。ボタンが押されていなければ0
  • MouseEvent.relatedTarget : ポインティングデバイスが指しているイベントターゲット(あれば)
  • WheelEvent.deltaX : ページがx軸方向にスクロールする予測量(deltaMode単位)、またはホイールのx軸回転の環境固有値
  • WheelEvent.deltaY : ページがy軸方向にスクロールする予測量(deltaMode単位)、またはホイールのy軸回転の環境固有値
  • WheelEvent.deltaZ : ページがz軸方向にスクロールする予測量(deltaMode単位)、またはホイールのz軸回転の環境固有値
  • WheelEvent.deltaMode : deltaX, deltaY, deltaZ属性の単位(ピクセル・行・ページ)

ユーザーエージェントは、マウスホイールがいずれかの軸で回転した時、または同等の入力デバイス(マウスボール、タブレット、タッチパッド等)が同じ動作をエミュレートした時、このイベントをディスパッチしなければなりません。プラットフォームや入力デバイスによっては、斜め方向のホイールdeltaが1回のwheelイベントの複数軸値として、または各軸ごとに別のwheelイベントとして配信されることがあります。

典型的なデフォルトアクションは、文書を指定量スクロール(または場合によってはズーム)することです。このイベントがキャンセルされた場合、実装は文書のスクロール・ズーム・その他現行標準で定めるデフォルト操作をしてはなりません。

一部のユーザーエージェントや入力デバイスでは、ホイールの回転速度がdelta値に影響し、速く回すほどdelta値が大きくなります。

3.5.2.2. ホイールイベントのキャンセル可否

wheelイベントでpreventDefaultを呼ぶことで、スクロールの防止や中断が可能です。最大限のスクロールパフォーマンスのため、ユーザーエージェントはスクロールに関連する各wheelイベントがキャンセルされるかどうか処理を待たない場合があります。その場合、cancelable属性がfalseのwheelイベントを生成し、preventDefaultではスクロールの防止や中断ができないことを示します。そうでなければcancelabletrueになります。

特に、ユーザーエージェントは非パッシブリスナーがないことを検知した場合、キャンセル不可の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 インターフェースは、ctrlKeyshiftKeyaltKeymetaKey などの一般的な修飾キーに便利な属性を提供します。これらの属性は、それぞれgetModifierState()Control, Shift, Alt, Metaで呼び出すのと同等です。

KeyboardEvent インターフェースのインスタンスを生成するには、KeyboardEvent コンストラクタにオプションでKeyboardEventInit 辞書を渡します。

3.7.1.1. KeyboardEvent
[Exposed=Window]
interface KeyboardEvent : UIEvent {
  constructor(DOMString type, optional KeyboardEventInit eventInitDict = {});
  // KeyLocationCode
  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
キーが左側のキー位置から発動した場合(同じキーが複数位置にある場合)。

PC 101キーUSキーボードの左Controlキー。

DOM_KEY_LOCATION_RIGHT
キーが右側のキー位置から発動した場合(同じキーが複数位置にある場合)。

PC 101キーUSキーボードの右Shiftキー。

DOM_KEY_LOCATION_NUMPAD
キーがテンキーまたはテンキー相当の仮想キーから発動した場合(同じキーが複数位置にある場合)。なおNumLockキーは常にlocationDOM_KEY_LOCATION_STANDARDで符号化すること。

PC 101キーUSキーボードのテンキー上の1キー。

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の場合、キーが持続的に押されていることを示します。キーを押し続けることで、keydownbeforeinputinputがこの順序で、システム設定で定められた速度で繰り返し発火します。モバイルデバイスの長押し動作では、最初に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 属性を以下のいずれかの数値定数で初期化します:
repeat, boolean, デフォルトfalse
KeyboardEventオブジェクトのrepeat属性を初期化します。現在のKeyboardEventが長押しされた単一キーによる繰り返しイベント列の一部であればtrue、そうでなければfalseとします。
isComposing, boolean, デフォルトfalse
KeyboardEventオブジェクトのisComposing属性を初期化します。このイベントが合成シーケンス中に発生した場合はtrue、それ以外はfalseとします。
旧来のキーボードイベント実装には追加属性keyCodecharCodewhichがあります。 keyCodeはキーボード上の特定キーに関連付けられた数値値を示し、charCodeはそのキーに関連付けられたASCII値を示します(keyCodeと同じ場合もあり)。charCodeは文字値を生成するキーのみ適用されます。

実際には、keyCodecharCodeはプラットフォームや同じ実装でもOSやロケールによって一貫性がありません。この現行標準ではkeyCodecharCodeの値や挙動は定義しません。現行標準に準拠するUI Events実装では、著者は代わりにkeycodeを使用してください。

詳細は参考付録旧来のキー属性を参照。

互換性維持のため、仮想キーボード(画面上のソフトウェアキーボード等)は物理キーがなくても通常の範囲のキーボードイベントを生成することが期待されます。

一部の実装やシステム構成では、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でのマッピングに依存します。このイベント型はキー割り当ての後に生成しなければなりません。また、同じキーに関連するbeforeinputinputkeyupイベントよりも前にディスパッチしなければなりません。

keydownイベントのデフォルトアクションはキーごとに異なります:

このイベントがキャンセルされた場合、関連イベント型はディスパッチされず、関連アクションも実行されてはなりません。

keydownおよびkeyupイベントは、文字値を生成するキーだけでなく、すべてのキー検出に伝統的に用いられます。

3.7.5.2. keyup
keyup
インターフェース KeyboardEvent
同期 / 非同期 同期
バブリング あり
信頼されたターゲット Element
キャンセル可能 あり
合成イベント あり
デフォルトアクション なし
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、キーが解放されたときこのイベントをディスパッチしなければなりません。keyupイベント型はデバイス依存であり、入力デバイスの機能やOSでのマッピングに依存します。このイベント型はキー割り当ての後に生成しなければなりません。また、同じキーに関連するkeydownbeforeinputinputイベントの後にディスパッチしなければなりません。

keydownおよびkeyupイベントは、文字値を生成するキーだけでなく、すべてのキー検出に伝統的に用いられます。

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
... 合成セッション中に送信されるキーイベントはすべてisComposingtrueでなければならない
5 keydown true このキーイベントが合成を終了する
6 compositionend
7 keyup false

3.8.6. 合成中の入力イベント

合成セッション中は、compositionupdatebeforeinputの後、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. キーボードイベントとキー値

このセクションではキーボードイベントに関する必要な情報を示します:

このセクションではセルビア語や漢字文字を使用しています。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. keycodeの関係

key
key 属性は、現在のキーボードレイアウト(IMEも含む。デッドキーは固有のkey 値を持つ)を考慮したキーの意味を判定したい場合に使います。ユースケース例:修飾キー付きや修飾キー単体の検出(例:キーボードショートカットに反応するアクション)。
code
code 属性は、レイアウト変更無しでユーザーが押した物理キー自体を判定したい場合に使います。ユースケース例:WASDキー(ゲームの移動制御)やすべてのキーキャッチ(リモートデスクトップクライアントなど)。

4.2.3. codeの例

左右Altキーの扱い
キーボードレイアウト 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の例では、AltAltGraphキーは左右位置を保持しますが、物理的に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属性に設定されます。

キーボードイベントの順序:Shift2

次の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値を使う場合は「数字やファンクションキー(F4F5など)をアルファベットの代わりに使うことを検討してください」([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キー値を持つキーが複数あり(通常はlocationDOM_KEY_LOCATION_LEFTDOM_KEY_LOCATION_RIGHTで区別)、8キー値も複数あり(locationDOM_KEY_LOCATION_STANDARDDOM_KEY_LOCATION_NUMPADで区別)、ユーザー設定のカスタムレイアウトでは任意のkey値が複数状態に割り当てられる場合もあります(location は標準レイアウト向けなので必ずしも意味のある区別を示せません)。

最後に、文字表現の意味は文脈依存で複雑です。例えばアスタリスク(星型)記号"*"は、文中で脚注や強調(文章の囲み)を表したり、ドキュメントやプログラムによっては乗算演算子とみなされたり、他の文書やプログラムでは乗算記号("×"、Unicode値U+00D7)やラテン小文字"x"(多くのキーボードには乗算キーがなく、記号が似ているため)で表されることもあります。したがって、文字表現の意味や機能はこの現行標準の範囲外です。

4.3.1. 修飾キー

キーボード入力では、修飾キーを使って通常のキー動作を変更します。他のキー同様、修飾キーもkeydownkeyupイベントを発生させます(下記例参照)。一部修飾キーは押下または押し続けている間だけ有効になります(AltControlShiftAltGraphMeta等)。他は状態によって有効化されます(CapsLockNumLockScrollLock等)。状態変化は修飾キーを押下した際に発生します。KeyboardEvent インターフェースは、一般的な修飾キー用に便利な属性(ctrlKeyshiftKeyaltKeymetaKey)を備えています。一部のOSではAltGraph修飾キーをAltControlキーの組み合わせでエミュレートします。実装はAltGraph修飾キーの利用を推奨します。

この例はUSキーボード(USマッピング)でUnicode文字Q(ラテン大文字Q、Unicodeコードポイント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
次の例はUnicode文字を生成しないキーシーケンス(前と同じ構成)です:
イベントタイプ KeyboardEvent
key
修飾キー 備考
1 keydown "Control" ctrlKey
2 keydown "v" ctrlKey ラテン小文字v
beforeinputinput イベントは生成されません。
3 keyup "v" ctrlKey ラテン小文字v
4 keyup "Control"
次の例はShiftControl両方を押した場合のイベントシーケンスです:
イベントタイプ KeyboardEvent
key
修飾キー 備考
1 keydown "Control" ctrlKey
2 keydown "Shift" ctrlKey, shiftKey
3 keydown "V" ctrlKey, shiftKey ラテン大文字V
beforeinputinput イベントは生成されません。
4 keyup "V" ctrlKey, shiftKey ラテン大文字V
5 keyup "Shift" ctrlKey
6 keyup "Control"
US以外のキーボードレイアウトでもイベント順序は同じですが、キーの値は現在のレイアウトに依存します。下記はアラビア語キーボードレイアウト使用時の例です:
イベントタイプ KeyboardEvent
key
修飾キー 備考
1 keydown "Control" ctrlKey
2 keydown "ر" ctrlKey アラビア文字レフ
beforeinputinput イベントは生成されません。
3 keyup "ر" ctrlKey アラビア文字レフ
4 keyup "Control"

keydownkeyupイベントの値は、キー押下時の現在のキーボードレイアウトによって異なります。つまり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で対応しません。例えば、keydownAcceptキー値を受け取っても、現在IMEで選択されているテキストが受理されたことを意味するわけではなく、単にキーストロークがあったことを示すだけです。IMEのAccept機能(多くのIMEではcompositionendイベントが発生)とは切り離されています。キーボードイベントだけでは入力メソッドエディタの現在状態は判断できません。状態はdata 属性(CompositionEvent インターフェース)で取得します。さらに、IMEシステムやデバイスは機能やキー割り当てが異なり、ConvertAcceptキーが他のキーで代用される場合もあります。キーボードイベントは、デバイスのキーボードレイアウトマッピング後に生成されるイベントに対応します。

一部の実装やシステム構成では、IMEによって一部のキーイベントや値が抑制される場合があります。

以下は、日本語入力方式を使ってUnicode文字"市"(漢字、CJK統合漢字)を生成するキーシーケンス例です。この例はIMEがアクティブで日本語ローマ字入力モードになっていることを前提とします。ConvertAcceptキーは、使用デバイスやIME構成により他のキーで代用される場合もあり(例:スペースキーU+0020Enter)。

"詩"(詩)と"市"(市)は同音異義語(いずれも「し」)のため、ユーザーは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イベントには影響しませんが、対応するbeforeinputinputkeypress対応時)のイベントは発生しません。次はUSキーボード(USマッピング)でUnicode文字Q(ラテン大文字Q)を生成する際の例です:

イベントタイプ KeyboardEvent
key
InputEvent
data
修飾キー 備考
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey デフォルトアクションがpreventDefault()等で抑制される
beforeinputinputkeypressも含む場合)イベントは発生しない
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イベントでデッドキーをキャンセルしてもbeforeinputinputイベントに影響しません。次の例は、デッドキー"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要素

inertdisabled要素を考慮するため、elementsFromPointを呼び出し、無効な要素を除外するべきです

  1. Return [CSSOM-View]elementFromPointposを指定)

5.1.2. DOMパスの計算

入力

element:開始要素

出力

与えられた要素の祖先要素リスト

  1. path = elementを含むリストとする

    祖先をpathに追加する正式な定義が必要。

  2. pathを返す

5.2. PointerLockアルゴリズム

以下のアルゴリズムは[PointerLock]現行標準へ移動すべきです。

5.2.1. PointerLockのグローバル状態

5.2.1.1. ウィンドウレベルの状態

UAはウィンドウ全体で共有される以下の値を維持しなければなりません。

最終マウス移動 値(初期値は未定義)。直近のmousemoveイベント位置を記録する。

5.2.2. MouseEvent用PointerLock属性初期化

入力

eventMouseEvent

出力

なし

  1. event.movementX = 0とする

  2. event.movementY = 0とする

5.2.3. mousemove用PointerLock属性設定

入力

eventMouseEvent

出力

なし

  1. event.type が"mousemove"でない場合、終了

  2. 最終マウス移動が未定義の場合、

    1. event.movementX = 0

    2. event.movementY = 0

  3. そうでなければ、

    1. event.movementX = event.screenX - 最終マウス移動のx座標

    2. event.movementY = event.screenX - 最終マウス移動のy座標

  4. 最終マウス移動 = ( event.screenX, event.screenY )

5.3. PointerEventアルゴリズム

以下のアルゴリズムは[PointerEvents3]現行標準へ移動すべきです。

5.3.1. PointerEventの初期化

入力

event:初期化するPointerEvent

eventType:イベントタイプ(DOMString)

eventTarget:イベントのEventTarget

出力

なし

  1. MouseEventの初期化event, eventType, eventTarget

TODO - pointerevent属性の初期化

5.3.2. PointerEventの生成

入力

eventType:イベントタイプ(DOMString)

eventTarget:イベントのEventTarget

出力

なし

  1. event = 新しいイベント作成PointerEvent利用)

  2. PointerEventの初期化event, eventType, eventTarget

  3. eventを返す

5.3.3. MouseEventからPointerEvent生成

入力

eventType:イベントタイプ(DOMString)

mouseevent:対応するMouseEvent

出力

なし

  1. event = 新しいイベント作成PointerEvent利用)

  2. target = mouseevent.target

  3. PointerEventの初期化event, eventType, target

  4. MouseEvent属性をmouseeventからeventへコピーする

  5. eventを返す

5.3.4. pointeroutイベント送信の可能性

入力

mouseout:対応するmouseoutMouseEvent

出力

なし

  1. pointerout = MouseEventからPointerEvent生成("pointerout", mouseout

  2. pointerevent属性の設定

    TODO

  3. target = mouseout.target

  4. dispatch pointerouttargetに)

5.3.5. pointerleaveイベント送信の可能性

入力

mouseout:対応するmouseoutMouseEvent

出力

なし

  1. pointerout = MouseEventからPointerEvent生成("pointerout", mouseout

  2. pointerevent属性の設定

    TODO

  3. target = mouseout.target

  4. dispatch pointerouttargetに)

5.3.6. pointeroverイベント送信の可能性

入力

mouseout:対応するmouseoutMouseEvent

出力

なし

  1. pointerout = MouseEventからPointerEvent生成("pointerout", mouseout

  2. pointerevent属性の設定

    TODO

  3. target = mouseout.target

  4. dispatch pointerouttargetに)

5.3.7. pointerenterイベント送信の可能性

入力

mouseout:対応するmouseoutMouseEvent

出力

なし

  1. pointerout = MouseEventからPointerEvent生成("pointerout", mouseout

  2. pointerevent属性の設定

    TODO

  3. target = mouseout.target

  4. dispatch pointerouttargetに)

5.3.8. pointermoveイベント送信の可能性

入力

mouseout:対応するmouseoutMouseEvent

出力

なし

pointermoveとpointerrawupdate両方送信可能か?2メソッド必要か?

pointermoveイベントのcoalesce定義に必要なものは?

  1. pointerout = MouseEventからPointerEvent生成("pointerout", mouseout

  2. pointerevent属性の設定

    TODO

  3. target = mouseout.target

  4. dispatch pointerouttargetに)

5.3.9. pointerdownイベント送信の可能性

入力

mouseout:対応するmouseoutMouseEvent

出力

なし

mousedownイベントと異なり、pointerdownイベントは複数ボタン同時押下時でもネストされません。 MouseEventのフィールドをPointerEventへコピーするためMouseEventを渡します。

  1. pointerout = MouseEventからPointerEvent生成("pointerout", mouseout

  2. pointerevent属性の設定

    TODO

  3. target = mouseout.target

  4. dispatch pointerouttargetに)

5.3.10. pointerupイベント送信の可能性

入力

mouseout:対応するmouseoutMouseEvent

出力

なし

mouseupイベントと異なり、pointerupイベントは複数ボタン同時押下時でもネストされません。 MouseEventのフィールドをPointerEventへコピーするためMouseEventを渡します。

  1. pointerout = MouseEventからPointerEvent生成("pointerout", mouseout

  2. pointerevent属性の設定

    TODO

  3. target = mouseout.target

  4. dispatch pointerouttargetに)

6. レガシーイベント初期化子

このセクションは規範的です。 以下の機能は廃止済みであり、レガシーソフトウェアとの互換性が必要なユーザーエージェントだけが実装すべきです。

現行標準初期のバージョンでは、インターフェース上に初期化メソッド(例:initMouseEvent)が含まれており、多数のパラメータが必要でしたが、多くの場合イベントオブジェクトの全属性を完全には初期化できませんでした。そのため、基本Event インターフェースから派生したイベントインターフェースでは、全ての派生インターフェースの初期化子を明示的に呼び出す必要がありました。

UIEventの全属性を初期化するにはinitEventinitUIEventの2つの初期化メソッド呼び出しが必要です。

現行標準の開発期間が長かったこともあり、一部の実装はこれら(現在は廃止済み)の初期化メソッドに依存している場合があります。完全性のため、この付録でレガシーイベント初期化子を説明します。

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 detailArg = 0);
};
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 detailArg = 0,
    optional long screenXArg = 0,
    optional long screenYArg = 0,
    optional long clientXArg = 0,
    optional long clientYArg = 0,
    optional boolean ctrlKeyArg = false,
    optional boolean altKeyArg = false,
    optional boolean shiftKeyArg = false,
    optional boolean metaKeyArg = false,
    optional short buttonArg = 0,
    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 locationArg = 0,
    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 属性を使い、charCodekeyCode 属性は使わないべきです。

ただし、現状の機能と規範的イベント・属性との関係を記録する目的で、このセクションは参考説明を提供します。これら属性・イベントをサポートする実装では、本セクションの定義を使用することが推奨されます。

7.1. レガシーUIEvent 補足インターフェース

このセクションは非規範的です

ユーザーエージェントは従来、which 属性を追加し、KeyboardEventMouseEvent で補足イベント情報を記録できるようにしていました。

以前の現行標準では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インターフェース(補足)

whichUIEventでサポートするブラウザは、UIEventInit 辞書にも以下のメンバーを追加すべきです。

部分UIEventInit 辞書はUIEventInit の参考拡張で、which メンバーで対応するUIEvent属性を初期化できます。

partial dictionary UIEventInit {
  unsigned long which = 0;
};
which, unsigned long, デフォルト値 0
UIEventwhich属性を初期化します。

7.2. レガシーKeyboardEvent 補足インターフェース

このセクションは非規範的です

キーボードのブラウザサポートは従来、keyCodecharCodeUIEventwhich という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
charCodekeypressイベント(文字入力を生成する場合)で文字値を保持します。 値はその文字のUnicode参照番号(コードポイント)(例:event.charCode = event.key.charCodeAt(0))。 keydownkeyupイベントではcharCode値は0です。
keyCode, unsigned long, readonly
keyCode は押下キーに対応する未修飾識別子のシステム・実装依存数値コードを保持します。key属性とは異なり、値のセットは現行標準で規範的に定義されません。通常keyCode値は ASCII([RFC20][US-ASCII])や Windows 1252([WIN1252])の10進コードポイントであるべきですが、他の文字セットでも構いません。識別できない場合はキー値0を使います。

詳細は§ 7.3 レガシーキーのモデル参照。

7.2.2. KeyboardEventInitインターフェース(補足)

keyCodecharCodeKeyboardEventでサポートするブラウザは、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 プロパティで仮想キーコードと文字コードを両方公開してもよく(混合モデル)、またはkeyCodecharCode を分離して報告する(分離モデル)こともあります。

7.3.1. keyCode の算出方法(keydownkeyup

keyCodekeydownkeyup)は次のように算出します:

7.3.2. keyCode の算出方法(keypress

keyCodekeypress)は次のように算出します:

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 はい はい 異なる:テキスト合成システムの起動;blurfocusイベント;DOMActivateイベント;その他イベント
textInput 同期 はい Element TextEvent はい はい 定義参照

8.1. レガシーUIEvent イベント

8.1.1. レガシーUIEvent イベント型

8.1.1.1. DOMActivate
DOMActivate
インターフェース UIEvent
同期/非同期 同期
バブリング はい
信頼できるターゲット Element
キャンセル可 はい
Composed はい
デフォルトアクション なし
コンテキスト
(信頼イベント)

ユーザーエージェントは、ボタン、リンク、その他状態変化要素がアクティベートされた時、このイベントをディスパッチしなければなりません。

DOMActivate イベント型は参考・完全性のため本現行標準で定義されていますが、現行標準はこのイベント型の使用を関連するイベント型clickへ移行することを推奨します。他現行標準が後方互換性のために独自にDOMActivate イベント型を定義・維持する場合もあります。

DOMActivateclickは完全同等ではありませんが、click イベント型の実装動作は、DOMActivate イベント型が設計された重要なアクセシビリティ側面を包含するように発展し、より広く実装されています。コンテンツ著者は、最大限のアクセシビリティのため、関連するmousedownmouseup イベント型の代わりに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イベントを利用するコードは、レガシーなcharCodekeyCodewhich 属性に依存することが多いです。

なお、keypressイベントはキーイベント専用であり、より一般的なbeforeinputおよびinputイベントへと置き換えられています。新しいinputイベントはキーボード操作専用ではなく、入力元を問わずユーザー入力を捕捉できます。

8.3.1. レガシーKeyboardEvent イベント型

8.3.1.1. keypress
keypress
インターフェース KeyboardEvent
同期/非同期 同期
バブリング はい
信頼できるターゲット Element
キャンセル可 はい
Composed はい
デフォルトアクション 異なる:テキスト合成システムの起動;blurfocusイベント; 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 data = "undefined");
};

UI EventsアルゴリズムのText EventセクションTextEvent インターフェースおよびtextInputイベントを参照。

9. イベントの拡張

このセクションは非規範的です

9.1. はじめに

本現行標準は複数のインターフェースや多くのイベントを定義しますが、あらゆる用途に対して網羅的なイベントセットではありません。コンテンツ著者や実装者が必要な機能を追加できるよう、本現行標準では競合なくインターフェースとイベントを拡張するための2つの仕組みを提供します:カスタムイベント実装固有拡張です。

9.2. カスタムイベント

スクリプト著者が、アプリケーションを機能コンポーネント単位で定義し、そのアーキテクチャに意味のあるイベント型を利用したい場合があります。コンテンツ著者はCustomEvent インターフェースを使って、利用している抽象レベルに適した独自イベントを生成できます。

たとえば、動的に生成される棒グラフを持つアプリケーションを作成した著者がいるとします。この棒グラフは5分ごと、フィードに新情報が来たとき、またはユーザーがボタンをクリックして手動で更新したときに更新されます。グラフ更新時に複数のハンドラーを呼ぶ必要があります:最新データの取得、更新中アイコンの表示、グラフ再構築など。これを管理するため、コンテンツ著者はトリガー条件が満たされたときに発火するカスタム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アプリケーションがerrorloadイベントを監視して、ローカルシステムからアクセス可能な他のコンピュータや開いているポートを特定し、後続攻撃の準備が可能となります。

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インターフェース対応入力デバイス(マウスホイールやタッチパッド等)の物理操作に対し、ユーザーエージェントがスクロールやズームする推定量(ピクセル数・行数・ページ数)。デルタ値(例:deltaXdeltaYdeltaZ)は現在のdeltaModeプロパティの文脈で解釈される。物理操作とデルタの符号(正負)の関係は環境・デバイス依存だが、ユーザーエージェントがデフォルトアクションでスクロールする場合は右手系座標系に従い、正のX,Y,Z軸はドキュメントの右端・下端・奥方向を指す。

廃止

廃止とされた機能は、旧実装や現行標準を参考にこの現行標準に含まれるが、OPTIONALで使用は推奨されない。代替が現存または進行中の機能のみ本現行標準で廃止指定される。未対応の実装は互換目的で廃止機能を実装してもよいが、新規コンテンツ著者は他に手段がない場合以外、廃止機能を使うべきでない。他現行標準は廃止機能を参照せず、代替を指すべき。廃止機能は将来現行標準で削除予定。

空文字列

空文字列は長さ0DOMString型値(印刷・制御文字なし)です。

イベント・フォーカス

イベント・フォーカスは、イベントターゲット(要素など)への特別な集中・受信状態。要素ごとに機能に応じた挙動(ボタンやリンクのアクティベート準備、チェックボックスの状態切替、テキスト入力や選択範囲コピー等)。詳細は§ 3.3.3 ドキュメントフォーカスとフォーカス文脈参照。

イベント・フォーカスリング

イベント・フォーカスリングは、イベント・フォーカスのターゲットを順序付けした集合。ホスト言語が文書順、インデックス、明示的ポインタなど順序付け方法を定義する場合がある。文書ごとに複数のフォーカスリングや条件付きリングも可。通常は文書順やインデックス型リングでフォーカスは最後→最初へ循環。

イベントターゲット

イベントフローでターゲットとなるオブジェクト。target属性値。

イベント型

イベント型は、特定名を持つイベントオブジェクトであり、特定のトリガー条件・プロパティ・特徴を定義し、他イベント型と区別される。例:clickイベント型はmouseoverloadイベント型と異なる特徴を持つ。イベント型はイベントオブジェクトのtype属性で公開される。 また「イベント」とも緩やかに呼ばれる(clickイベントなど)。

ホスト言語

他言語やAPI現行標準の機能を統合し、元現行標準を規範参照しつつ、定義通りの拡張のみ行う言語。元現行標準は通常ホスト言語内実装を想定(単独言語ではない)。例:XHTML, HTML, SVGはUI Eventsのホスト言語であり、本現行標準で定義されるオブジェクト・モデルを統合・拡張する。

ヒステリシス

人間工学的に、位置や時間の一定範囲内で入力値を許容し、UXを向上させる設計特性。例:ダブルクリックの許容時間の範囲(時間的ヒステリシス)、親ウィンドウから子メニューへのマウス移動時に即座にメニューを閉じない(位置的ヒステリシス)。

IME
入力メソッドエディタ

入力メソッドエディタ(IME)は、フロントエンドプロセッサとも呼ばれる、キーストロークと表意文字などの変換を行うアプリケーション。通常、辞書検索をユーザー誘導で行い、中国語・日本語・韓国語など東アジア言語で利用。IMEは、モバイル端末の辞書ベース単語補完にも利用。IMEの扱いは§ 4.3.3 入力メソッドエディタ参照。テキスト合成システムも参照。

キー割り当て

キー割り当ては、キー値を特定キーに割り当てる処理で、OSやキーボード配列(例:QWERTY、Dvorak、スペイン語、InScript、中国語など)に加え、全ての修飾キーShiftAlt等)およびデッドキー状態を考慮した結果。

キー値

キー値は、特定状態のキーに関連付けられた文字値または複数文字列(例:"Enter""Tab""MediaTrackNext"など)。 全てのキーはキー値を持ち、文字値がなくても該当。コントロールキー・ファンクションキー・修飾キーデッドキーなども含む。キー値はその時点のキー割り当てに依存。

修飾キー

修飾キーは通常のキー動作を変更するキー。例:Shiftで文字種を変更、FnAltで機能切替。詳細は§ 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) が含まれる。

未初期化値

イベント属性(bubblescurrentTarget等)の値は、initEvent()で初期化する前は未初期化値。新しいイベントをcreateEvent()で生成した直後に適用。

適合性

文書上の規約

適合性要件は、記述的断定およびRFC 2119の用語を組み合わせて表現されています。 規範的部分で使われる「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」などのキーワードはRFC 2119で説明された通りに解釈してください。 ただし、可読性のため、本現行標準ではこれらの語はすべて大文字ではなく小文字で表記されています。

本現行標準の全ての本文は規範的ですが、明示的に非規範的と記載されたセクション、例、注記は除きます。[RFC2119]

本現行標準の例は、「for example」で始まるか、class="example"で規範的本文から分離されています。例:

これは参考例の一例です。

参考的注記は「Note」で始まり、class="note"で規範的本文から分離されます。例:

注:これは参考的注記です。

適合するアルゴリズム

アルゴリズム内で命令形で記述される要件(例:「先頭の空白文字を除去する」「falseを返してこれらの手順を中断する」など)は、アルゴリズム導入部で使われるキーワード("must"、"should"、"may"など)に従って解釈してください。

アルゴリズムや具体的手順として表現された適合性要件は、最終結果が同等である限り、どのような方法で実装しても構いません。 特に、本現行標準で定義されるアルゴリズムは理解しやすいことを重視しており、効率性は意図していません。 実装者は最適化することを推奨します。

索引

この仕様で定義された用語

参考で定義される用語

参考文献

規範的参考文献

[CSS-COLOR-3]
Tantek Çelik; Chris Lilley; David Baron. CSS Color Module Level 3. 2022年1月18日. REC. URL: https://www.w3.org/TR/css-color-3/
[CSS2]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-View]
Simon Pieters. CSSOM View Module. 2016年3月17日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. 現行標準. URL: https://dom.spec.whatwg.org/
[DOM-Level-3-Core]
Arnaud Le Hors; 他. Document Object Model (DOM) Level 3 Core Specification. 2021年9月28日. REC. URL: https://www.w3.org/TR/DOM-Level-3-Core/
[HTML]
Anne van Kesteren; 他. HTML Standard. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準. URL: https://infra.spec.whatwg.org/
[PointerEvents3]
Patrick Lauke; Robert Flack. Pointer Events. 2024年8月14日. WD. URL: https://www.w3.org/TR/pointerevents3/
[POINTERLOCK-2]
Mustaq Ahmed; Vincent Scheib. Pointer Lock 2.0. 2024年6月17日. WD. URL: https://www.w3.org/TR/pointerlock-2/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[UIEvents-Code]
Travis Leithead; Gary Kacmarcik. UI Events KeyboardEvent code Values. 2023年5月30日. CR. URL: https://www.w3.org/TR/uievents-code/
[UIEvents-Key]
Travis Leithead; Gary Kacmarcik. UI Events KeyboardEvent key Values. 2023年5月30日. CR. URL: https://www.w3.org/TR/uievents-key/
[WebIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 現行標準. URL: https://webidl.spec.whatwg.org/

参考的参考文献

[DWW95]
N. Kano. Developing International Software for Windows 95 and Windows NT: A Handbook for International Software Design. 1995年.
[Editing]
A. Gregor. HTML Editing APIs. URL: https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html
[HTML401]
Dave Raggett; Arnaud Le Hors; Ian Jacobs. HTML 4.01 Specification. 2018年3月27日. REC. URL: https://www.w3.org/TR/html401/
[HTML5]
Ian Hickson; 他. HTML5. 2018年3月27日. REC. URL: https://www.w3.org/TR/html5/
[Input-Events]
Johannes Wilm. Input Events Level 1. 2023年9月28日. WD. URL: https://www.w3.org/TR/input-events-1/
[PointerLock]
Vincent Scheib. Pointer Lock. 2016年10月27日. REC. URL: https://www.w3.org/TR/pointerlock/
[RFC20]
V.G. Cerf. ASCII format for network interchange. 1969年10月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc20
[UAAG20]
James Allan; 他. User Agent Accessibility Guidelines (UAAG) 2.0. 2015年12月15日. NOTE. URL: https://www.w3.org/TR/UAAG20/
[UAX15]
Ken Whistler. Unicode Normalization Forms. 2023年8月12日. Unicode Standard Annex #15. URL: https://www.unicode.org/reports/tr15/tr15-54.html
[Unicode]
The Unicode Standard. URL: https://www.unicode.org/versions/latest/
[US-ASCII]
Coded Character Set - 7-Bit American Standard Code for Information Interchange. 1986年.
[WIN1252]
Windows 1252 a Coded Character Set - 8-Bit. URL: https://www.microsoft.com/globaldev/reference/sbcs/1252.htm
[XFORMS11]
John Boyer. XForms 1.1. 2009年10月20日. REC. URL: https://www.w3.org/TR/xforms11/
[XML]
Tim Bray; 他. Extensible Markup Language (XML) 1.0 (Fifth Edition). 2008年11月26日. REC. URL: https://www.w3.org/TR/xml/
[XML-Names11]
Tim Bray; 他. Namespaces in XML 1.1 (Second Edition). 2006年8月16日. REC. URL: https://www.w3.org/TR/xml-names11/

IDL索引

[Exposed=Window]
interface UIEvent : Event {
  constructor(DOMString type, optional UIEventInit eventInitDict = {});
  readonly attribute Window? view;
  readonly attribute long detail;
};

dictionary UIEventInit : EventInit {
  Window? view = null;
  long detail = 0;
};

[Exposed=Window]
interface FocusEvent : UIEvent {
  constructor(DOMString type, optional FocusEventInit eventInitDict = {});
  readonly attribute EventTarget? relatedTarget;
};

dictionary FocusEventInit : UIEventInit {
  EventTarget? relatedTarget = null;
};

[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);
};

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;
};

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;
};

[Exposed=Window]
interface WheelEvent : MouseEvent {
  constructor(DOMString type, optional WheelEventInit eventInitDict = {});
  // DeltaModeCode
  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;
};

dictionary WheelEventInit : MouseEventInit {
  double deltaX = 0.0;
  double deltaY = 0.0;
  double deltaZ = 0.0;
  unsigned long deltaMode = 0;
};

[Exposed=Window]
interface InputEvent : UIEvent {
  constructor(DOMString type, optional InputEventInit eventInitDict = {});
  readonly attribute USVString? data;
  readonly attribute boolean isComposing;
  readonly attribute DOMString inputType;
};

dictionary InputEventInit : UIEventInit {
  DOMString? data = null;
  boolean isComposing = false;
  DOMString inputType = "";
};

[Exposed=Window]
interface KeyboardEvent : UIEvent {
  constructor(DOMString type, optional KeyboardEventInit eventInitDict = {});
  // KeyLocationCode
  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);
};

dictionary KeyboardEventInit : EventModifierInit {
  DOMString key = "";
  DOMString code = "";
  unsigned long location = 0;
  boolean repeat = false;
  boolean isComposing = false;
};

[Exposed=Window]
interface CompositionEvent : UIEvent {
  constructor(DOMString type, optional CompositionEventInit eventInitDict = {});
  readonly attribute USVString data;
};

dictionary CompositionEventInit : UIEventInit {
  DOMString data = "";
};

partial interface UIEvent {
  // Deprecated in this specification
  undefined initUIEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional long detailArg = 0);
};

partial interface MouseEvent {
  // Deprecated in this specification
  undefined initMouseEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional long detailArg = 0,
    optional long screenXArg = 0,
    optional long screenYArg = 0,
    optional long clientXArg = 0,
    optional long clientYArg = 0,
    optional boolean ctrlKeyArg = false,
    optional boolean altKeyArg = false,
    optional boolean shiftKeyArg = false,
    optional boolean metaKeyArg = false,
    optional short buttonArg = 0,
    optional EventTarget? relatedTargetArg = null);
};

partial interface KeyboardEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initKeyboardEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional DOMString keyArg = "",
    optional unsigned long locationArg = 0,
    optional boolean ctrlKey = false,
    optional boolean altKey = false,
    optional boolean shiftKey = false,
    optional boolean metaKey = false);
};

partial interface CompositionEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initCompositionEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional WindowProxy? viewArg = null,
    optional DOMString dataArg = "");
};

partial interface UIEvent {
  // The following support legacy user agents
  readonly attribute unsigned long which;
};

partial dictionary UIEventInit {
  unsigned long which = 0;
};

partial interface KeyboardEvent {
  // The following support legacy user agents
  readonly attribute unsigned long charCode;
  readonly attribute unsigned long keyCode;
};

partial dictionary KeyboardEventInit {
  // The following support legacy user agents
  unsigned long charCode = 0;
  unsigned long keyCode = 0;
};

[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 data = "undefined");
};

課題索引

UI EventsアルゴリズムのText EventセクションTextEventインターフェースおよび textInputイベントを参照してください。
MDN

CompositionEvent/CompositionEvent

In all current engines.

Firefox53+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CompositionEvent/data

In all current engines.

Firefox9+Safari5+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

CompositionEvent

In all current engines.

Firefox9+Safari5+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/auxclick_event

Firefox53+SafariNoneChrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android53+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/blur_event

In all current engines.

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

Window/blur_event

In all current engines.

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/click_event

In all current engines.

Firefox6+Safari3+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android6+iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/compositionend_event

In all current engines.

Firefox9+Safari5+Chrome15+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

Element/compositionstart_event

In all current engines.

Firefox9+Safari5+Chrome15+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

Element/compositionupdate_event

In all current engines.

Firefox9+Safari5+Chrome18+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/contextmenu_event

In all current engines.

Firefox6+Safari3+Chrome1+
Opera10.5+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile11.1+
MDN

Element/dblclick_event

In all current engines.

Firefox6+Safari3+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android6+iOS Safari1+Chrome for AndroidNoneAndroid WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/focus_event

In all current engines.

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

Window/focus_event

In all current engines.

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/focusin_event

In all current engines.

Firefox52+Safari5+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/focusout_event

In all current engines.

Firefox52+Safari5+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/keydown_event

In all current engines.

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/keyup_event

In all current engines.

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/mousedown_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/mouseenter_event

In all current engines.

Firefox10+Safari7+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/mouseleave_event

In all current engines.

Firefox10+Safari7+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/mousemove_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/mouseout_event

In all current engines.

Firefox6+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/mouseover_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera9.5+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Element/mouseup_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/wheel_event

In all current engines.

Firefox17+Safari7+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent/FocusEvent

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent/relatedTarget

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

HTMLElement/beforeinput_event

In all current engines.

Firefox87+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

HTMLElement/error_event

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

HTMLElement/input_event

In all current engines.

Firefox6+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
MDN

InputEvent/InputEvent

Firefox31+SafariNoneChrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent/inputType

In all current engines.

Firefox66+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent/isComposing

In all current engines.

Firefox31+Safari16.4+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent

In all current engines.

Firefox31+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/KeyboardEvent

In all current engines.

Firefox31+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/altKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/code

In all current engines.

Firefox38+Safari10.1+Chrome48+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/ctrlKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/getModifierState

In all current engines.

Firefox15+Safari10.1+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/isComposing

In all current engines.

Firefox31+Safari10.1+Chrome56+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/key

In all current engines.

Firefox23+Safari10.1+Chrome51+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/location

In all current engines.

Firefox15+Safari8+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/metaKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/repeat

In all current engines.

Firefox28+Safari10.1+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/shiftKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/MouseEvent

In all current engines.

Firefox11+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MouseEvent/altKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/button

In all current engines.

Firefox1+Safari1+Chrome1+
Opera10.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile11+
MDN

MouseEvent/buttons

In all current engines.

Firefox15+Safari11.1+Chrome43+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android15+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MouseEvent/clientX

In all current engines.

Firefox1+Safari1+Chrome1+
Opera10.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile11+
MDN

MouseEvent/clientY

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/ctrlKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/getModifierState

In all current engines.

Firefox15+Safari12.1+Chrome47+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MouseEvent/metaKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/relatedTarget

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/screenX

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/screenY

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/shiftKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent

In all current engines.

Firefox1+Safari1+Chrome1+
Opera10.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile11+
MDN

UIEvent/UIEvent

In all current engines.

Firefox11+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView1+Samsung Internet1.0+Opera Mobile?
MDN

UIEvent/detail

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

UIEvent/view

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

UIEvent

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

WheelEvent/WheelEvent

In all current engines.

Firefox17+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?
MDN

WheelEvent/deltaMode

In all current engines.

Firefox17+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?
MDN

WheelEvent/deltaX

In all current engines.

Firefox17+Safari8+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WheelEvent/deltaY

In all current engines.

Firefox17+Safari8+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WheelEvent/deltaZ

In all current engines.

Firefox17+Safari8+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WheelEvent

In all current engines.

Firefox17+Safari3+Chrome1+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Window/load_event

In all current engines.

Firefox1+Safari1.3+Chrome1+
Opera4+Edge79+
Edge (Legacy)12+IE4+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+