この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2014年4月)

2014年4月11日

Bug-org 993253 Implement D3E InputEvent interface with isComposing
初回投稿日時: 2014年04月11日16時05分47秒
カテゴリ: Events Mozilla Core Mozilla31 バグ修正
SNS: (list)

こちらは、inputイベントや、D3Eで提案されているbeforeinputのための、InputEventインターフェースを、isComposing属性のみでひとまず実装しようというバグです。

こちらのInputEvent.isComposingはGeckoでも使いやすいものとなっています。例えば、テキストが変更される度に、その文字列を使って、何らかの処理を行いたい場合で、未確定文字列の変化は無視したい場合、これまでは、

var target = document.getElementById("foo");
var isComposing = false;
target.addEventListener("compositionstart", function (event) { isComposing = true; }, false);
target.addEventListener("compositionend", function(event) { isComposing = false; }, false);
target.addEventListener("input",
  function (event) {
    if (!isComposing) {
      doSomething(target.value);
    }
  }, false);

と、フラグをひとつ設け、管理しなくてはいけませんでした。この処理では、ブラウザにバグがあり、compositionstartcompositionendが適切に発生しないケースがあると破綻していました。

しかし、InputEvent.isComposingを利用することで、

var target = document.getElementById("foo");
target.addEventListener("input",
  function (event) {
    if (!event.isComposing) {
      doSomething(target.value);
    }
  }, false);

このような、シンプルなコードで同様のことが実現可能になりました。

関連するかもしれないエントリ

bug-org 993253を含むエントリ