* 仕様書

[REFS[
- [47] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#processing-model-6>
]REFS]

* 鍵盤操作への反応

[12] 基本的に [CODE(HTMLe)@en[[[KeyboardEvent]]]] が[[dispatch]]されます。

@@
[42] ある[[文書]]が[[キーイベント]]を受信した時、その[[対象]]は次のように決定しなければ[['''なりません''']] [SRC[>>47]]。
[FIG[
- [43] [[フォーカス]]されている[[要素]]があれば、その[[要素]]
- [44] >>43 がなく、[[文書[CODE(HTMLe)@en[body]]要素]]があれば、その[[要素]]
- [45] >>43, >>44 がなく、[[文書]]の[[根要素]]があれば、その[[要素]]
- [46] >>43, >>44, >>45 がなければ、[[キーイベント]]は[[発火]]しない
]FIG]

[27] その他に[[プラットフォームの慣習]]による動作も発生します。以下はその例です。

[21] [KBD[[[Enter]]]] は、
[FIG(steps)[
= [30] 編集可能な要素なら、[[改行]]を挿入します。 ([KBD[[[Shift]]]] キーの有無で動作が変わります。)
= [13] [[ハイパーリンク]] ([CODE(HTMLe)@en[[[link]]]] [[要素]]でも?)、
[[ボタン]]では、[[クリック]]に相当するものとして[[合成クリック活性化手順]]が呼び出されます。
([KBD[[[Shift]]]] や [KBD[[[Ctrl]]]] が[[活性化動作]]に影響します。)
= [22] [[プルダウンリスト]]では、[[プルダウンメニュー]]を開きます。
= [23] [[プルダウンメニュー]]上の項目では、その項目を選択します。
= [24] [CODE(HTMLe)@en[[[textarea]]]] では、[[改行]]を挿入します。
= [25] その他の[[フォーム制御子]]では、[[既定のボタン]]の[[クリック]]に相当するものとして[[合成クリック活性化手順]]が呼び出されます。
]FIG]

[26] [[スペースキー]]は、
[FIG(steps)[
= [35] 編集中の[[要素]]では、 [CODE(char)[[[U+0020]]]] の[[鍵盤]]入力として扱います。 ([[IME]] 等により処理されます。 [KBD[[[Shift]]]] の有無によって異なる[[文字]]が挿入されたり、[[IME]] の状態変化のみで文字挿入は行われなかったりします。)
= [14] [[ボタン]]では、[[クリック]]に相当するものとして[[合成クリック活性化手順]]が呼び出されます。
= [16] それ以外の[[要素]]では[[スクロール]]操作 ([KBD[[[Shift]]]] で前ページ、それ以外で次ページ) を呼び出します。
]FIG]

[15] [[矢印キー]]は[[スクロール]]操作を呼び出します。
ただし編集可能または選択中で [KBD[[[Shift]]]] キーが押下されていれば、
選択範囲の変更操作を行います。

[17] [KBD[[[PageDown]]]]、[KBD[[[PageUp]]]]、
[KBD[[[Home]]]]、[KBD[[[End]]]] は[[スクロール]]操作を呼び出します。

[18] [KBD[[[Ctrl]]+R]] や [KBD[[[F5]]]] は[[再読込]]操作を呼び出します。
[KBD[[[Shift]]]] を押下していると[[スーパーリロード]]とします。

[19] [KBD[[[Ctrl]]+F]] は [CODE(JS)@en[[[window.find]]]] [[メソッド]]を呼び出します。

[20] [KBD[[[Ctrl]]+P]] は [CODE(JS)@en[[[window.print]]]] [[メソッド]]を呼び出します。

[28] [KBD[[[Ctrl]]+X]], [KBD[[[Ctrl]]+C]], [KBD[[[Ctrl]]+V]]
は[[クリップボード]]の操作を呼び出します。

[29] [KBD[[[Ctrl]]+Z]] は[[元に戻す]]操作を呼び出します。

[31] [KBD[[[Ctrl]]+A]] は「すべて選択」操作を呼び出します。

[38] [KBD[[[Ctrl]]+D]] は[[ブックマークの追加]]操作を呼び出します。
[[IE]] では [KBD[[[Ctrl]]+B]] は[[ブックマーク]] ([[お気に入り]])
の管理画面を開きます。

[39] [KBD[[[Ctrl]]+S]] は表示中の[[文書]]の保存操作 ([[ダウンロード]]参照。) を呼び出します。

[32] [KBD[[[Backspace]]]] は、編集中なら前の文字を削除する操作を、
それ以外なら [CODE(JS)@en[[[history.back]]]] [[メソッド]]を呼び出します。

[33] [[戻る]]キーや[[進む]]キーは、[[履歴]]操作を呼び出します。

[34] [KBD[[[Tab]]]] は、編集中なら入力操作を、
それ以外なら[[フォーカス]]の順方向の移動操作を呼び出します。

[51] [KBD[[[Shift]]+[[Tab]]]] は、
[[フォーカス]]の逆方向の移動操作を呼び出します。

[45] [KBD[[[Shift]] + [[F10]]]] や[KBD[[[アプリケーションキー]]]]は[[文脈メニュー]]を表示します。

[62] [KBD[ESC]] は [[default unlock gesture]] に割り当てるべきとされています。

;; [63] ただし [[IME]] の動作中や[[ダイアログ]]表示中など、
優先的にこれを処理するものがあれば、そちらのみ動作するべきと思われます。

[73] 通常の[[キー]]の場合で、
[[テキストボックス]]や[[編集ホスト]]であれば、
[[IME]] を介して[[テキスト]]の入力として扱います。

[53] その他、[[プラットフォーム]]依存で、次のような[[プラットフォーム]]側の動作が呼び出されることがあります。
[FIG(list)[
- [37] [[Windows]] では、 [KBD[[[F11]]]] は[[全画面表示]]と通常表示を切り替えます。
- [36] [[Windows]] では、 [KBD[[[F12]]]] は[[開発者ツール]]を呼び出します。
- [52] [KBD[半角/全角]]、[KBD[変換]]、[KBD[カタカナ ひらがな]]、[KBD[無変換]]は、
[[IME]] の操作を呼び出します。
- [54] [[Windows]] では、 [KBD[Alt]] で[[メニューバー]]に[[フォーカス]]が移動します。
- [55] [[Windows]] では、 [KBD[[KBD[Alt]] + [KBD[スペース]]]]で[[窓]]の操作メニューが表示されます。
- [56] [[Windows]] では、 [KBD[[KBD[Alt]] + [KBD[F4]]]] で[[窓]]を閉じます。
現在の[[窓]]内の各[F[窓][窓 (Web)]]の[F[閲覧文脈]]を[[閉じる][閲覧文脈を閉じる]]処理が呼び出されます。
- [57] [[Windows]] では、 [KBD[[KBD[Ctrl]] + [KBD[F4]]]] で[[タブ]]を閉じます。
現在の[[タブ]]である[[窓][窓 (Web)]]の[F[閲覧文脈]]を[[閉じる][閲覧文脈を閉じる]]処理が呼び出されます。
- [58] [[Windows]] では、 [KBD[[KBD[Alt]] + [KBD[Tab]]]] で[[窓]]の切り替えメニューが表示されます。
]FIG]

[46] [[assigned access key]] なら、その処理を行います。

;; [CODE(HTMLa)@en[[[accesskey]]]] 参照。

[40] [[イベントループ]]が[F[[[一時停止]]中]]は、
通常よりも反応を抑制する必要があります。

[43] [[マウス操作]]中の[[鍵盤]]の押下状態が操作に影響をあたえることがあります。

[EG[
[44] [[リンク]]を [KBD[[[Shift]]]] + [[クリック]]すると、
新しい[[窓]]が開かれるかもしれません。
]EG]

;; [[マウス操作]]参照。

[42] [[鍵盤]]操作は、[[イベントリスナー]]からの [CODE(JS)@en[[[window.open]]]]
の呼び出しの挙動に影響を与えることがあります。

;; [CODE(JS)@en[[[window.open]]]] 参照。

[49] [[著者]]は、こうした[[Webブラウザー]]側の一般的な動作を鑑み、
それと衝突するような[[スクリプト]]は避けるべきです。
[[Webブラウザー]]は、[[利用者]]に一貫した挙動を提供するため、
こうした基本的な操作は[[著者]]が[[取り消し]]できないようにするべきです。

[EG[
[50] [[GitHub]] は [KBD[[KBD[Ctrl]] + [KBD[F]]]] で独自の検索フォームを表示し、
[[Webブラウザー]]内蔵の検索機能の呼び出しを拒否しますが、独自の検索フォームは
[[Webブラウザー]]内蔵のものほど使いやすくなく、全体として[[利用者体験]]を低下させています。
]EG]

[61] [[鍵盤操作]]によって発生する[[イベント]]の一部は、
[[engagement gesture]] です。その処理時には、 [[Pointer Lock]] の処理が実行されます。

* 書字方向

[76] [[Windows]] の [[Chrome]] で試した結果です。 [TIME[2025-05-04T09:16:32.800Z]]

- [77] 無選択時の[[矢印]]は[[左横書き]]、[[右横書き]]、[[上横書き]]のいずれであっても、
見た目通りの[[スクロール]]となります。
- [78] [[文字列の選択]]における[[矢印]]はいずれであっても見た目通りの範囲変更になります
(混在時は途中から逆向きに見える動きをすることがありますが)。
- [79] [KEY[PageUp]], [KEY[PageDown]] はいずれであっても上下の[[スクロール]]になります。
- [80] [KEY[ ]], [KBD[[KEY[Ctrl]] + [KEY[ ]]]] はいずれであっても前後の[[スクロール]]になります。

[81] 概ね直感通りの動作ですが、 [KEY[PageUp]], [KEY[PageDown]] だけおかしいです。


* 入力モード

[74] [[入力モード]]参照。

* 歴史

[1]
[CITE@en[Re: new draft of W3C liason stmt from Charles McCathieNevile on 2007-01-27 (public-webapi@w3.org from January 2007)]] ([[Charles McCathieNevile (chaals@opera.com)]] 著, [CODE[2007-01-28 07:00:54 +09:00]] 版) <http://lists.w3.org/Archives/Public/public-webapi/2007Jan/0112>

> We have attempted to resolve this by removing key events from the current  
DOM 3
Events spec which should allow us to publish it very soon.

こういう運命なのね・・・
([[名無しさん]] [WEAK[2007-01-28 05:07:15 +00:00]])

[2]
[CITE@en[WebAPI F2F5 -- 25 and 26 Jan 2007]] <http://lists.w3.org/Archives/Public/public-webapi/2007Feb/att-0023/f2f5.html>
([[名無しさん]])


[3]
[KBD@en[[KBD[[[Ctrl]]]] + [KBD[[[Tab]]]]]] を取得できるか?

'''[[WinIE 6]]''':
[[既定動作]]は[[アドレス・バー]]への[[焦点]]の移動。
[CODE(DOMe)@en[[[keypress]]]] は[[発火]]しない。
[CODE(DOMe)@en[[[keydown]]]] は[[発火]]する。
[CODE(DOMe)@en[[[keydown]]]] を[[取消し]]すると、
[[焦点]]の移動は中止される。

'''[[Firefox]] 2''':
[[既定動作]]は次の[[タブ]]への切り替え ([[タブ]]が複数の場合;
[[タブ]]が1つだけの場合は何も起こらない)。
[CODE(DOMe)@en[[[keypress]]]] が発火される。
[[取消し]]しても、[[タブ]]の切り替えは中止できない。
[CODE(DOMe)@en[[[keydown]]]] も確か発火されたはず。

'''[[Opera]] 9''':
[[既定動作]]は[[タブ]]切り替え候補の表示 ([[Windows]] の
[KBD@en[[KBD[[[Alt]]]] + [KBD[[[Tab]]]]]] による[[窓]]の切り替えと同じような機能)。
[[タブ]]が1つだけの場合は何も起こらない。
[CODE(DOMe)@en[[[keydown]]]] が[[発火]]される。
[[取消し]]しても、[[タブ]]切り替え候補の表示は中止できない。
[CODE(DOMe)@en[[[keypress]]]] は確認していない。

[4] [CITE[The SVG Micro DOM (uDOM) – SVG Tiny 1.2]] ([TIME[2008-12-20 02:31:29 +09:00]] 版) <http://www.w3.org/TR/2008/REC-SVGTiny12-20081222/svgudom.html#events__KeyboardEvent>



[5] [CITE@ja[HTML / DOM におけるキーボードイベント周りの話 - ひだまりソケットは壊れない]]
( ([TIME[2013-02-27 04:44:38 +09:00]] 版))
<http://vividcode.hatenablog.com/entry/dom/keyboard-events>

[6] [CITE[IRC logs: freenode / #whatwg / 20130426]]
( ([TIME[2013-05-06 17:03:20 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130426#l-974>

[7] [CITE@en-US[XML Binding Language (XBL) 2.0]]
( ([TIME[2007-03-16 22:20:16 +09:00]] 版))
<http://www.w3.org/TR/2007/CR-xbl-20070316/#key-event>

[8] [CITE@en[Splitting key/code tables out of DOM3Event spec]]
( ([[Кошмарчик]] 著, [TIME[2014-03-07 02:59:05 +09:00]] 版))
<http://lists.w3.org/Archives/Public/www-dom/2014JanMar/0135.html>

[9] [CITE@en-US[DOM Level 3 KeyboardEvent code Values]]
( ([TIME[2014-06-12 13:23:11 +09:00]] 版))
<http://www.w3.org/TR/2014/WD-DOM-Level-3-Events-code-20140612/>

[10] [CITE@en[UI Events]]
( ([TIME[2014-06-12 13:24:42 +09:00]] 版))
<http://www.w3.org/TR/2014/WD-uievents-20140612/>

[11] [CITE@en-US[DOM Level 3 KeyboardEvent key Values]]
( ([TIME[2014-06-12 13:24:06 +09:00]] 版))
<http://www.w3.org/TR/2014/WD-DOM-Level-3-Events-key-20140612/>

[41] [CITE@en-US[DOM Level 3 KeyboardEvent code Values]]
([TIME[2015-04-28 17:35:07 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-DOM-Level-3-Events-code-20150428/>

[48] [CITE@en[Fix #148: drop "keyevents" as an alias of "keyboardevent" for createE… · whatwg/dom@09d7eb6]]
([TIME[2016-02-29 17:05:18 +09:00]] 版)
<https://github.com/whatwg/dom/commit/09d7eb6f7da7057d605acb4f93627e7ee2cbe0a7>

[59] [CITE@en[UI Events KeyboardEvent key Values]]
([TIME[2016-10-25 02:56:55 +09:00]])
<https://www.w3.org/TR/2016/WD-uievents-key-20161024/>

[60] [CITE@en[UI Events KeyboardEvent code Values]]
([TIME[2016-10-25 03:02:03 +09:00]])
<https://www.w3.org/TR/2016/WD-uievents-code-20161024/>

[64] [CITE@en[Fix: #117, #119, #121 Move 'key' algorithm into uievents-key]]
([[garykac]]著, [TIME[2017-01-25 09:27:39 +09:00]])
<https://github.com/w3c/uievents/commit/179177779c8b1fbe4a1ecd7add4c43ec3eaf055a>

[65] [CITE@en[Reserved keyboard shortcut behaviour in fullscreen · Issue #39 · whatwg/fullscreen]]
([TIME[2017-04-07 00:24:20 +09:00]])
<https://github.com/whatwg/fullscreen/issues/39>

[66] [CITE@en[Re: Update on UI Events specs]]
([[Léonie Watson]]著, [TIME[2017-05-31 00:03:57 +09:00]])
<https://lists.w3.org/Archives/Public/public-webapps/2017AprJun/0094.html>

[67] [CITE@en[Two UI Events specs reach CR]]
([[Léonie Watson]]著, [TIME[2017-06-02 01:03:50 +09:00]])
<https://lists.w3.org/Archives/Public/public-webapps/2017AprJun/0097.html>

[68] [CITE@en[UI Events KeyboardEvent code Values]]
([TIME[2017-05-30 09:38:02 +09:00]])
<https://www.w3.org/TR/2017/CR-uievents-code-20170601/>

[69] [CITE@en[UI Events KeyboardEvent key Values]]
([TIME[2017-05-30 10:01:01 +09:00]])
<https://www.w3.org/TR/2017/CR-uievents-key-20170601/>

[70] [CITE@en["create an event" doesn't work for certain UI events · Issue #414 · whatwg/dom]]
([TIME[2018-04-07 16:02:52 +09:00]])
<https://github.com/whatwg/dom/issues/414>

[71] [CITE@en[Define event constructing steps by annevk · Pull Request #614 · whatwg/dom]]
([TIME[2018-04-07 16:06:55 +09:00]])
<https://github.com/whatwg/dom/pull/614>

[72] [CITE@en[Define "event constructing steps" for complicated events · Issue #194 · w3c/uievents]]
([TIME[2018-04-07 16:07:44 +09:00]])
<https://github.com/w3c/uievents/issues/194>

[75] [CITE@ja[RyuseiさんはTwitterを使っています 「Webでカスタムの入力要素を実装しているサービス、IME周りでバグを入れ込むのでつらい 日本語入力は確定がEnterキーなのでつらい 全部のサービスでバグレポートして回るのつらい」 / Twitter]]
([TIME[2021-11-02T02:04:13.000Z]], [TIME[2021-11-02T02:06:48.143Z]])
<https://twitter.com/mandel59/status/1455062154931945474>