JavaScriptのキーボードイベント

現時点での話なので将来的に変わる可能性が大あり。
ちゃんと検証してないのでどうなっても知りません。

Safri 3.0.4

  • keydown, keypress 共に連続して呼ばれる。
  • keydown時にもcharCodeが入る。本当にキャラクタのコード。
  • keypress時のkeyCodeはcharCodeと同値。なのでキャラクタのコード。
  • keydown, keypressのどちらかでpreventDefaultすれば文字入力は阻止できる。
  • keyIdentifierが定義済。Unicode数値実体参照か文字。
  • 矢印、Deleteキーを叩くと6万台のcharCodeが入る。代わりにkeyIdentifierを見た方が良さげ。

Firefox 2.0.0.9

  • keydownは押した最初の1回のみ。
  • keydownでpreventDefaultしても文字入力は阻止できずにkeypressでpreventDefaultしないとだめ。
  • keydownのcharCodeは常にゼロ。
  • keypressで非文字キーだとkeyCodeにキーボードのコードが入ってcharCodeはゼロ。文字キーだとkeyCodeはゼロでcharCodeにASCIIのコードが入る。
  • window.eventがundefined。

Opera 9.24

  • keydownは押した最初の1回のみ。
  • keydown, keypress共にどんな文字であろうがkeyCodeのみ使用。
    • keydownのkeyCodeは基本的にキーコードだけどShiftキーを押すと(多分)ASCIIコード。
    • keypressのkeyCodeは基本的にASCIIコードだけど非文字キーは(多分)キーコード。
  • charCodeはいつでもundefined。
  • keypressでpreventDefaultしないと殺せない。keydownだろうがkeypressだろうがフォーム部品への文字入力自体は殺せない気がする。ブラウザへの伝播は殺せてそう。

IE6

  • keydownが連続して呼ばれる。
  • keypressは文字キーの場合のみ連続して呼ばれる。非文字キーだと呼ばれない。
  • keydownでreturnValue=falseをするとキー入力の阻止と同時にkeypressの呼び出しも阻止される。
  • keydownのkeyCodeは必ずキーコード。Shiftを押しててもControlを押しててもキーコードそのまま。
  • keypressのkeyCodeはASCIIコード。ASCIIコードが取れないキーだとそもそもkeypressが呼ばれないので必ずASCIIコード。
  • W3C DOMではないのでpreventDefaultなんてものはない。