松太郎 さんのプロフィールかめスペースフォトブログリスト ツール ヘルプ

ブログ


    10月8日

    jQueryのオートコンプリートプラグインをオレ好みに

    テキストボックスに入力された語句を元に関連語句の検索を行い、その結果をリストに表示したかった。それは、純粋なオートコンプリートではない。例えば、「あ」と入力すると結果は{赤,青}、「あい」と入力すると{愛知,アイス,試合}、といった具合にしたい。だから、オートコンプリートに使用するリストが動的に変更できるものを探してたんだけど、ちょうどいいのがあった!

    jQuery Autocomplete Mod

    日本語ドキュメント

    そして、オレ好みにするためにプラグイン(jquery.autocomplete.js)を少々改変した。

    【改変箇所1】リストを選択した後にフォーカスが行方不明になる。テキストボックスにフォーカスを戻したいので90行目(サンプル1の5行目)のblur()をコメント、313行目(サンプル2の4行目)にFocus()を追加。

       1: case 9:  // tab
       2: case 13: // return
       3:     if (selectCurrent()) {
       4:         // make sure to blur off the current field
       5:         //$input.get(0).blur(); //blurする必要は無いかな...
       6:         e.preventDefault();
       7:     }
       8:     break;

    サンプル1

       1: $(li).hover(
       2:     function() { $("li", ul).removeClass("ac_over"); $(this).addClass("ac_over"); active = $("li", ul).indexOf($(this).get(0)); },
       3:     function() { $(this).removeClass("ac_over"); }
       4: ).click(function(e) { e.preventDefault(); e.stopPropagation(); selectItem(this); $input.get(0).focus(); }); //選択後にフォーカスを設定

    サンプル2

    【改変個所2】バグ?matchSubsetオプションにゼロを指定しても1になってしまうので、472行目(サンプル3の2行目)で初期値をゼロに変更。

       1: options.matchCase = options.matchCase || 0;
       2: options.matchSubset = options.matchSubset || 0; //オプションでゼロを設定しても1になっちゃうので初期値ゼロに修正
       3: options.matchContains = options.matchContains || 0;

    サンプル3

    matchSubsetオプション(小山さんの日本語訳より)

    オートコンプリーターがより特定のクエリーに対してキャッシュを使うかどうか。”foot” にたいしてマッチした項目は、”foo” に対してマッチしたもののサブセットです。通常はこれは真であり、このオプションを使うことはサーバーへの負荷を減らしパフォーマンスを向上させます。

    このmatchSubsetを偽にすることは今回の要件では最重要。最初はゼロをセットしているにもかかわらずそのように動作しなかったので、だいぶ悩んだ。

    リストに表示するデータを返すWebサービスは、ASP.NETのジェネリックハンドラ(ashx)で実装した。改行区切のテキストを戻すだけだからね。

    んで、こんなかんじに仕上げた。うむ、満足。

    image 

    ところで、似たようなのにFlexBoxてのもある。高機能そうなので遠慮したけど、どんなもんなんでしょうね。

    コメント

    しばらくお待ちください。
    入力されたコメントは長すぎます。短くしてください。
    何も入力されていません。もう一度やり直してください。
    現在、コメントを追加できません。後でもう一度やり直してください。
    コメントと書くには、保護者 (ほごしゃ) の方の許可 (きょか) をもらってください。許可をリクエストする
    保護者 (ほごしゃ) の方が、あなたがコメントを書けないようにしています。
    現在、コメントを削除できません。後でもう一度やり直してください。
    1 日に投稿できるコメントの最大数を超えました。24 時間経過してから、もう一度やり直してください。
    あなたが他のユーザーに対して迷惑行為を行っている可能性があると確認されたため、お使いのアカウントによるコメントの投稿を無効にしています。誤って無効にされたと思われる場合は、Windows Live のサポートにお問い合わせください。
    コメントを投稿する前に、以下のセキュリティ チェックを完了してください。
    セキュリティ チェックに入力する文字は、画像に表示されている文字または音声で流れた文字と一致していなければいけません。

    コメントを投稿するには、お使いの Windows Live ID でサインインしてください (Hotmail、Messenger、または Xbox LIVE を既に使用している場合は、そのアカウントが Windows Live ID です)。サインイン


    Windows Live ID をお持ちでない場合は、アカウントを新規登録してください。

    トラックバック

    この記事のトラックバックの URL は次のとおりです。
    http://kame-taro.spaces.live.com/blog/cns!CD806281181610EF!1196.trak
    この記事を参照しているブログ
    • なし