読者です 読者をやめる 読者になる 読者になる

prototype.jsでの、keypressイベントの扱いについて

スポンサーリンク

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持ってないので、もし教えていただける方がいらっしゃいましたら、コメントいただけると勉強になります。