Bug-org 630810 Should convert from native keycode to DOM keycode for every keys on Windows
初回投稿日時: 2012年05月24日13時26分39秒
カテゴリ: Mozilla Core Mozilla15 バグ修正
SNS:
Tweet (list)
Keycode ReimplementationのWindows版です。
Gecko(というかほとんどのブラウザ)はキーイベントのkeyCode
の値に、Windowsのキーメッセージで与えられるvirtual keycodeと同じ値で定義しています。おそらくNetscapeあたりが最初に実装した時から、それを見よう見まねで各社が適当にそれっぽく動くようにしたのが原因だと思いますが、とにかく標準的なルールが全く無く、US ANSIキーボード以外での値がブラウザ間で互換がとれていなかったり、Geckoでもプラットフォームごとに値が違うことが多いという状況でした。
これを改善すべく、簡単なルールを決め、GeckoのWindows版、Mac版、Linux(GTK)版ではほぼ同じ挙動をとるように今回改善しています。
そのルールは全プラットフォーム版をMDNにも記述しましたが、こちらではWindowsに絞った内容で紹介しておきます。
- Windowsではvirtual keycodeがAからZか、0から9のキーに対しては、これに対応したDOMキーコード(これに関してはそのままの値)を使用する
- それ以外の文字を入力するキーでは、そのキーで入力される文字がASCII文字の場合、それにあったキーコードを利用する
- もしその文字がASCII文字ではないものの、Shiftキーを押しながらだとASCII文字を入力できる場合、それにあったキーコードを利用する
- それ以外のキーに関してはそのキーにあったキーコードが利用される
- 上記ルールで対応するキーコードが求められない場合は0とする
Windowsではこれまで+
を入力するキーと、-
を入力するキー以外では、システムのvirtual keycodeをそのままDOMキーイベントのkeyCode
に設定していました。平たく言うと、何も考えずに垂れ流ししていたわけです。このままでは他のプラットフォームでは手詰まりに陥るのでWindowsでもきちんと対応するDOMキーコードを自身で定義しているか確認し、存在しない場合にはゼロとするようにしています。
Windowsではあまりキーコードが変化するキーはありませんが、Windowsキーには新たに専用のキーコードが割り当てられています。
JISキーボードの;+キーはDOM_VK_PLUS
ではなく、DOM_VK_SEMICOLON
に変化しています。他の記号キーに関してもいくつか変わっている可能性はあります。ただ、元々文字を入力するキーのkeyCode
値をkeydown
もしくはkeyup
イベントでチェックすべきではないので実際のWebアプリへの影響は限定的だと思います。