この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2010年12月)

2010年12月10日

DOMのkeydownkeyupイベントのkeyCodeの値
初回投稿日時: 2010年12月10日05時03分17秒
カテゴリ: Javascript Mozilla Core 雑談
SNS: (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と記述します。

関連するかもしれないエントリ

関連するかもしれないエントリを発見できませんでしたが、無いとは限りません。