2009年3月5日木曜日

自分用メモ for google chrome key event

このエントリーをはてなブックマークに追加
Google ChromeのGreasemonkeyを書いていたんだけど、はまったのでメモ。

例の如くキーボードショートカットをカスタマイズするという変態コードを書いていたんだけれども、Ctrl系のイベントキャンセル(preventDefault)が上手く行かない。
結論から言うと、イベントを割り当るタイミングが悪く、keypressではなくkeydownにするべきだった。
今までの自分の知識ベースはkeypressでキーバインド割り当ては何とかなっていたけど、それだと駄目なケースがある事を知らなかった。
周知の通り、keypressよりkeydownの方が先にイベント通知が来る。

以下の文は憶測であり、現時点(2009/03/05)での結果を元にArcCosineが勝手に想像して書いているので、頭から信じないこと
OperaやFirefoxはkeypressでpreventDefaultすれば大体のキーのイベントキャンセルできる。
でも、Chromeはちょっと変態ちっくな作りになっていて、Ctrlとの同時押下時はkeypressより前にイベントが走る作りになっている。
イメージとしては

(通常)
keydown

keypress

デフォルトイベント

(Ctrl押下時)
keydown

デフォルトイベント

keypress

こんな感じでイベントが発生するので、keypressのタイミングでpreventDefaultをかましても後の祭りって落ちだった訳。
もしかしたら、Ctrlキー限定でなくて特殊キーなら何でもかもしれないけど、ちゃんと調べてないので、何とも言えない。
暇な人は是非チェックしてみて下さい。

以上、駄文でした。

0 件のコメント :

コメントを投稿