prototype.jsのEvent.observeを使ってイベント登録を行った場合、ブラウザによっては、keypress→keydownとして登録される場合があります。
ソース(prototype.js 1.3.1)の該当箇所を抜粋します。
observe: function(element, name, observer, useCapture) { var element = $(element); useCapture = useCapture || false; if (name == 'keypress' && ((navigator.appVersion.indexOf('AppleWebKit') > 0) || element.attachEvent)) name = 'keydown'; this._observeAndCache(element, name, observer, useCapture); },
各ブラウザを、上記条件に合わせてみると、下記のようになります。
- IE 6.0
element.attachEventが定義されているので、keypress→keydownとして登録。 - FireFox 1.5
条件に合致しないので、keypressのまま登録。 - Opera 8.5
element.attachEventが定義されているので、keypress→keydownとして登録。 - Safari
navigator.appVersion.indexOf('AppleWebKit')に一致するので、keypress→keydownとして登録。
キーイベント(keyup,keydown,keypress)は、ブラウザ毎に挙動が違う部分があるので、それの互換性を取るために、このような処理を入れているものと思われますが、何をターゲットにして、互換性を保とうとしているのかが良くわかりません。
IEとFireFoxだけを見た時点では、カーソルキー長押しでの挙動をあわせるために、このようにしているのかなと思いました。(IEのkeypressイベントでは、カーソルキー長押ししてもイベントが1度しか発生しないので)
が、Operaになると、keydownでは1度で、keypressだと複数発生しますので、上記の意図に合致しません。。
今のところ、prototype.jsの意図がわかりませんが、、とりあえず、Event.observeでkeypressイベントを使用する場合には、十分注意が必要だと思います。
それと、、Safariでのカーソルキー長押しの挙動を確認したかったのですが、当方はMac持ってないので、もし教えていただける方がいらっしゃいましたら、コメントいただけると勉強になります。