DOMのkeydown
とkeyup
イベントのkeyCode
の値
初回投稿日時: 2010年12月10日05時03分17秒
カテゴリ: Javascript Mozilla Core 雑談
SNS:
Tweet (list)
DevConでも質問が出ていたこの問題、あれから調べ続けてますが、とりあえず同じGeckoでもOSごとにかなり処理がバラバラで、駄目なことが分かりました。Fx4に向けてあまりいじる訳にもいかないと思うので、betaの遅れ具合と他に抱えてるブロッカーバグの進捗との相談になってきますが、徐々に修正していこうかと計画しています。
まず必要だと思われるのは、ASCII文字は全て固有のkeyCode
値を定義しなくてはいけないと思われます(この時点でもう現在のtrunkでは正攻法では修正不可ではありますが)。DOM3の仕様案では、keyCode
はモディファイアキーを押していない状態で入力される文字から算出するべきであるという指針が提案されています。これは非常に良いアイデアだと思いますので採用すべきでしょう。現に、現在のGeckoは基本的にはこの考え方で設計されています(考え方が、というだけで、一部のキーはそうではありませんし、USのキーボードレイアウト以外では無茶苦茶ですが)。それに対して、Unicode文字を入力してしまうキー、例えばàのようなキーは0を返すしかないでしょう。
ただし、馬鹿正直にモディファイアキー無しのキーの入力文字からキーコードを算出すると、キリルとかギリシャあたりのレイアウトでは使い物にならなくなります(Linux版のGeckoなんかはそうなんですが)。これを回避するために、ハッキーな方法ですが、算出した文字がUnicode文字だった場合、USキーボードレイアウトでAにあたるキーでASCII文字が入力できるキーボードレイアウトを探して、そのレイアウトから算出したキーコードをセットすべきだと考えています。問題点としてすぐに考えられるのは、複数のキーが同じキーコードを返す可能性がある点です。例えば、ギリシャ文字を入力するキーボードレイアウトで入力できるASCII文字の記号のキーが、共にインストールしているASCII文字用のキーボードレイアウトの記号の位置と異なる場合、重なってしまう可能性があります。常にASCII文字入力用のレイアウトからのみ算出されたキーコードを使えばこのようなことはありませんが、それはそれで利用者の直感には反しそうに思います。
また、フランス語用のAZERTY配列に関してはやはり特殊な処理が必要だと考えています。AZERTY配列では数字はShiftキーと共に入力することになります。しかし、他のレイアウトを前提にしたWebアプリでの利用シーンを考えると、Shiftキー押下時の入力文字が数字なのであれば、数字キーとしてのキーコードをルールに反して返すべきではないかと考えています。
最後に、参考までにGeckoのキーイベントで定義されている定数の定義している場所を示しておきます: http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/events/nsIDOMKeyEvent.idl ここで定義されている定数はkeydown
イベントハンドラ等で渡されたイベントから参照できます。例えば、event.DOM_VK_CANCEL
と記述します。