9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

日本語IMEで未確定文字が無く且つ文字列が変更された場合に処理を実行するためのBackbone.js用Mixinを作りました

Posted at

はじめに

キー入力するたびに検索を実行するようなUIを実現する場合、英語圏ではkeyupイベントで処理を実行すればよいのですが、日本語だとIMEで未確定文字がある間にもkeyupイベントが発生してしまい入力中の文字で検索されてしまい使い勝手がよくありません。

以前日本語入力環境でキー入力が一段落したらハンドラを実行するjQueryプラグインを作ってみた - Qiitaので、それをBackbone.jsに移植してみました。

実装の形式ですが、Backbone.js Patterns and Best Practicesで、例としてドラッグ可能にする機能拡張をDraggableMixinというミックスインとして提供する例が紹介されていたので、今回はこれに習ってMixinとして実装してみました。

#使い方

使い方は以下のように目的のビュークラスのprototypeを指定してBackboneJapaneseInputHandlerMixiを実行するだけです。

https://github.com/hnakamur/backgrid-example/blob/bd916c1455ea168b797a69c6bc8235929eb5c533/complete-example-ja.html#L95-L99
BackboneJapaneseInputHandlerMixin.call(Backgrid.Extension.ClientSideFilter.prototype);
var filter = new Backgrid.Extension.ClientSideFilter({
  collection: pageableTerritories,
  fields: ['name']
});

未確定文字が無く、且つ文字列が変更された場合に即座に処理が実行されます

hnakamur/jquery.japanese-input-changeでは入力が落ち着いてから指定の時間たった場合に検索を実行していましたが、今回は即座に実行するようにしました。

理由は、backgrid-filterプラグインがunderscore.jsのdebounceを使って検索を連発しないようになっているので、さらに待ちを入れるのはよくないと考えたからです。

https://github.com/wyuenho/backgrid-filter/blob/0.3.5/backgrid-filter.js#L229
      this._debounceMethods(["search", "clear"]);

検索以外にも利用可能です

BackboneJapaneseInputHandlerMixin.call()の実装は以下のようになっています。

https://github.com/hnakamur/backbone-japanese-input-handler-mixin.js/blob/279df5034496c037ae66e73b774d21726011fd2c/backbone-japanese-input-handler-mixin.js#L90-L106
    return function(config) {
      this.inputSelector =
        config && config.inputSelector || "input[type=search]";
      this.handlerMethod = config && config.handlerMethod || this.search;
      this._readyToCallHandler = true;
      this._oldVal = undefined;
      this._callHandler = _callHandler;
      this.onFocus = onFocus;
      this.onBlur = onBlur;
      this.onKeyup = onKeyup;
      this.onKeydown = onKeydown;
      this.events["focus " + this.inputSelector] = "onFocus";
      this.events["blur " + this.inputSelector] = "onBlur";
      this.events["keyup " + this.inputSelector] = "onKeyup";
      this.events["keydown " + this.inputSelector] = "onKeydown";
      return this;
    };
BackboneJapaneseInputHandlerMixin.call(Backgrid.Extension.ClientSideFilter.prototype, {
  inputSelector: "別のセレクタ",
  handlerMethod: this.別のメソッド
});

のようにパラメータを指定してミックスインすれば検索以外の用途にも使えるようになっています(実際に試したことはまだ無いです)。

9
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?