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

日本語入力時のキーイベントの仕様変更と対策

Camino 2.1a1pre (Gecko 1.9.2, like Firefox 3.6.6pre) を使っていて、テキストボックスの内容に応じて自動的にサイズを調整するスクリプトが動かなくなっていた。調べてみると、そのスクリプトはkeypressおよびkeyupイベントが発生したときに処理を行っており、日本語入力時にはそのイベントが発生していなかった。
たとえば次の場合。

  • ab [かなキー] あいう [returnキーで確定]

Mac OS X 10.6 Snow Leopard + ことえり、で実験。
Gecko 1.9.2では次の順でイベントが発生する。日本語入力時は最初の文字と入力確定時にしかイベントが発生しない。(角括弧内はキーコード、を読みやすくしたもの)

  1. keydown [A]
  2. keypress
  3. (ここで a が入力される。以下同様)
  4. keyup [A]
  5. keydown [B]
  6. keypress
  7. keyup [B]
  8. keyup [Space] (かなキー)
  9. keydown [A] (最初の文字)
  10. keyup [Enter] (入力確定)

Gecko 1.9はこう。日本語入力中はkeypressイベントが発生しない

  1. keydown [A]
  2. keypress
  3. keyup [A]
  4. keydown [B]
  5. keypress
  6. keyup [B]
  7. keyup [Space] (かなキー)
  8. keydown [A]
  9. keyup [A]
  10. keydown [I]
  11. keyup [I]
  12. keydown [U]
  13. keyup [U]
  14. keydown [Enter] (入力確定)
  15. keyup [Enter]

ちなみに出たばかりのSafari 5だとこうなる。キーコードが異なる点を除いてGecko 1.9と同じ。

  1. keydown [A]
  2. keypress [a]
  3. keyup [A]
  4. keydown [B]
  5. keypress [b]
  6. keyup [B]
  7. keyup <0> (かなキー)
  8. keydown <229>
  9. keyup [A]
  10. keydown <229>
  11. keyup [I]
  12. keydown <229>
  13. keyup [U]
  14. keydown <229>
  15. keyup [Enter] (入力確定)

ちなみにOpera 10.53。かなキーではイベントが発生しない。また、keypressイベントが入力確定時にまとめて発生する。へんなの。

  1. keydown [A]
  2. keypress [a]
  3. keyup [A]
  4. keydown [B]
  5. keypress [b]
  6. keyup [B]
  7. keydown [A]
  8. keyup [A]
  9. keydown [I]
  10. keyup [I]
  11. keydown [U]
  12. keyup [U]
  13. keydown [Enter] (入力確定)
  14. keypress [あ]
  15. keypress [い]
  16. keypress [う]
  17. keyup [Enter]

Geckoのこの仕様変更への対策として、setIntervalで値を監視するのが良さそうだ。以前のバージョンのSafari (3まで?) では日本語入力中はvalueが更新されていなかったが、Safari 5では更新されるようになっている。