SimpleBoxes

keypressとkeydownの関係

javascriptでキーが押された時のイベント処理について、調べてみました。

prototype.jsでは、以下のサイトで触れられているような処理を行っているようです。

確認したブラウザは以下の通り。

  • Safari 2.0.4 for Mac OS X
  • Opera 9.20 for Mac OSX
  • Firefox 2.0.0.3 for Mac OS X
  • iCab 3.0.3 for Mac OS X
  • Internet Explorer 5.2.3 for Mac OS X
  • Internet Explorer 5.5 for Windows XP
  • Internet Explorer 6.0 for Windows XP
  • Internet Explorer 7.0 for Windows XP

keydownとkeypressが送られる回数をカウントするという簡単なサンプルを用意して確認しました(スクリプトの内容)。

ブラウザkeydownkeypress
Safari 2.0.4押したとき一度だけイベント発生キーリピートでイベント発生
Opera 9.20押したとき一度だけイベント発生キーリピートでイベント発生
Firefox 2.0.0.3押したとき一度だけイベント発生キーリピートでイベント発生
iCab 3.0.3キーイベントそのものが発生しない?(註1)キーイベントそのものが発生しない?(註1)
Internet Explorer 5.2.3キーリピートでイベント発生キーリピートでイベント発生(註2)
Internet Explorer 5.5/6.0/7.0キーリピートでイベント発生キーリピートでイベント発生(註2)

[註1] 私が試した限り、iCabではキーイベントを拾ってくれませんでした。そもそもオブジェクトにフォーカスを当てることができない感じです。マウスクリックイベントは他のブラウザと同じように扱ってくれます。

[註2] Internet Explorerの挙動はちょっと面白くて、keypressイベントでは拾ってくれないキーが存在します。例えば、カーソルやタブキーはkeydownイベントでは捕捉されますが、keypressイベントでは捕捉できません。ここでは、「英数字」とありますが、おそらくキーを押したときに何らかの文字が出力されるキーかと思います。

また、オブジェクトに対してイベントを割り付ける関数については、attachEventとaddEventListenerがありますが、

var check_atatchEvent = !!window.attachEvent;
var check_addEventListener = !!window.addEventListener;

というコードで、対応の有無を調べることができます。

ブラウザattachEventaddEventListener
Safari 2.0.4falsetrue
Opera 9.20truetrue
Firefox 2.0.0.3falsetrue
iCab 3.0.3falsetrue
Internet Explorer 5.2.3falsefalse
Internet Explorer 5.5/6.0/7.0truefalse

という訳で、キーが押された時のイベント処理を、ここで挙げたブラウザについて統一させる場合。

addEventListenerに対応しているか否かだけを調べて、対応していればkeypressで、そうでなければkeydownで処理する

というのが良さそうです。

Safari 2.0.4では、問題なくkeypressイベントをハンドリングできるようですが、ここを見る限り、もしかしたら、過去のWebkitではkeypressがうまくハンドルできないというのがあったのかもしれません。

スポンサーリンク

<< ウェブログツールを作る上で気を付けたこと :: Re: Firefox の意外と知らない10の基本機能 >>