Bug-org 549674 Uncommitted IME means you can't set value of an input
初回投稿日時: 2015-06-19 18:31:19
カテゴリ: Firefox Google Chrome IE IME Mozilla Core Mozilla41 バグ修正
SNS:
Tweet (list)
Geckoは昔から、未確定文字列がある場合に<input>要素や<textarea>要素のvalue属性値を変更しても、IMEは未確定文字列を持ったままで動作がおかしくなるようになっていました。
このバグが長年修正されなかったのは、まず、標準仕様でどうするべきか策定すべきではないかという話がありました。しかし、これは実装側の事情でどうにかしろという話になりました。IE11やGoogle Chromeでは未確定文字列は確定されます(後者はどうにも挙動が怪しいですが)。
もう一つの理由は、LinuxのiBusのように確定のリクエストが非同期で実行される場合にどうすれば良いのかという点がありました。しかし、これはTextCompositionがコンテンツ上での同期的強制確定を保証できている時点で既に問題ではなくなっていました。
今回、IMEまわりの修正を盛大に行っているため、Androidでは一部のサイトでのサジェスト機能がうまく機能しなくなるというregressionが発生してしまっていましたが、その原因の特定やバックアウトが困難なため、今回、この機能の修正に踏み切りました。
今回の修正により、以下のような例では、value属性が変更された場合に、Geckoではtext (Gecko独自イベント)、compositionend、inputイベントが発生するようになっています。また、その最中にvalue属性値を取得して処理する際にも期待通りに動作するように、内部では若干、ハッキーな手法をとって、セットした値がそのまま取得されるようになっています。これは、maxlength等を無視することを意味していることに注意してください。
var textarea = document.getElementsByTagName("textarea")[0];
function handler(aEvent)
{
textarea.value += ", " + aEvent.type;
}
textarea.addEventListener("text", handler);
textarea.addEventListener("compositionupdate", handler);
textarea.addEventListener("compositionend", handler);
textarea.addEventListener("input", handler);
// 未確定文字列("あいうえお")がある状態で
textarea.value += ", " + "setting value";
この結果、textareaの内容は、あいうえお, setting value, text, compositionend, inputとなります。IE 11ではtextとcompositionendは発火しません(前者はともかく、後者はバグですが……)。