Bug-org 587243 Textbox of tab group lost focus immediately by keypress Eenter(Conversion Enter Commit) while IME composition
初回投稿日時: 2010年09月12日12時53分20秒
最終更新日時: 2010年09月12日13時09分53秒
カテゴリ: Mozilla Core バグ修正
SNS:
Tweet (list)
IMEで確定する時のEnterキーや、キャンセル時のESCキーの入力でtab group名を入れるエディタからフォーカスが失われてしまう、というバグです。
今回のtab candyはjQueryとHTMLで実装されているようで、このjQueryがバグの原因でした。
Geckoの流儀ではキーの入力処理は基本的にkeypress
イベントを活用します。しかし、jQueryはおそらくクロスブラウザな動作を実現するためにESCキーのような文字を入力しないキーではkeypress
イベントを発生させていません。このため、代わりにkeyup
イベントが利用されていたことが直接の原因です。
GeckoのキーイベントとIMEのイベントの関係は次のようになっています。
アクション | 発生するイベント |
---|---|
最初の一文字のキー入力 |
|
途中のキー入力 |
|
最後のキー入力 |
|
そう、未確定文字列を確定、もしくはキャンセルさせた場合、keyup
イベントは発生しているのですが、これはすでにOS側で消費されているはずのキー入力なのにもう一度アクションを起こしてしまうから変な動きになっていたのです。
対策として、EnterキーとESCキーで未確定文字列が発生することは無いことを利用してkeydown
でフォーカスまわりの処理を行うようにし、またそのイベントをそこで消費してしまうようにしました。ただし、ラベルの保存等はkeydown
イベントではテキストの入力がまだ終わっていない可能性が高いので引き続きkeyup
イベントハンドラに残したままにしています。
テスト用URI
data:text/html,<script type="text/javascript"> function printEvent(e) { var p = document.getElementById('p'); p.innerHTML = e.type + "<br>" + p.innerHTML; } </script> <body onload="document.addEventListener('compositionstart', function (e) { printEvent(e); }, false); document.addEventListener('compositionend', function (e) { printEvent(e); }, false); document.addEventListener('text', function (e) { printEvent(e); }, false);"> <input onkeypress="printEvent(event);" onkeydown="printEvent(event);" onkeyup="printEvent(event);"> <p id="p"></p> </body>