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キー限定でなくて特殊キーなら何でもかもしれないけど、ちゃんと調べてないので、何とも言えない。
暇な人は是非チェックしてみて下さい。
以上、駄文でした。
例の如くキーボードショートカットをカスタマイズするという変態コードを書いていたんだけれども、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キー限定でなくて特殊キーなら何でもかもしれないけど、ちゃんと調べてないので、何とも言えない。
暇な人は是非チェックしてみて下さい。
以上、駄文でした。
コメント
コメントを投稿