◇jQueryのautocompleteサンプル:メモ
[補完情報セット-1]または[補完情報セット-2]ボタンを押した上で、下のテキストボックスに a をタイプしてみてください。
候補が出て、選択できます(残念ながらcocolog表示ではIEでは候補の出る位置がおかしくなるようです。firefox,Chromeは大丈夫でした)
候補は下リストのplanetsまたはatomsがセットされます。
<!DOCTYPE html> <!-- saved from url=(0014)about:internet --> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <script src="../../../js/jquery.js" type="text/javascript"></script> <link href="../../../css/jquery-ui-1.8.10.custom.css" rel="Stylesheet" type="text/css"> <script src="../../../js/jquery-ui-1.8.10.custom.min.js" type="text/javascript"></script> <script type="text/javascript"> function setCandi(target_,candi_,onSelectFunc_){ var _param= { source : candi_, // 入力候補リスト(またはAjax-url) minLength: 1, // リストを表示するための最小文字数 delay : 10, // キー入力からリスト表示までのミリ秒 select : onSelectFunc_// 選択されたときに呼ばれる関数 }; $("#"+target_).autocomplete(_param); } var planets = ['Mercury','Venus','Earth','Mars','Jupiter' ,'Saturn','Uranus','Neptune','Pluto']; var atoms = ['Hydrogen','Helium','Lithium','Beryllium','Boron' ,'Carbon','Nitorogen','Oxygen','Fluorine','Neon' ,'Sodium','Magnesium','Alminium']; function setPlanets(){ setCandi("text_part",planets,onSelect); } function setAtoms(){ setCandi("text_part",atoms,onSelect); } function clearCandi(){ setCandi("text_part",[],onSelect); } function onSelect(event_, ui_){ alert(event_.target.id+" : "+ui_.item.value); return true; } </script> </head> <body> <input type=text id="text_part"></input><br> <input type=button onClick="setPlanets();" value="補完情報セット-1"> <input type=button onClick="setAtoms();" value="補完情報セット-2"> <input type=button onClick="clearCandi();" value="補完情報消去"> <script type="text/javascript"> setPlanets(); // 初期値設定 </script> </body> </html>
jQueryのautocompleteサンプル
jQueryのautocompleteを使かうサンプルです。
autocompleteは<input type=text>要素に入力の補完機能を与えるものです。
サンプルは次の考えで作成しています。
- 候補は画面出力後にダイナミックに切り替える
- 選択イベントを取得し、<input text>インスタンスと選択された文字列を得る
- ダイナミックに候補を削除する
- クロージャは使わない
- jQuery要素は単なる部品として用い、jQuery風コーディングスタイルはとらない
jQueryのautocomplete機能は<input text>に対してキー入力イベントの ハンドリングを付加するよって実装されています。
jQueryの関数$(#xx).autocomplet()を使わず、直接inputインスタンスに
autocomplete()関数を呼ぶ形では動きません。
$()の引数は要素のidの前に"#"を付ける必要があります。
autocompleteの引数には次の指定が出来ます。
source | 配列をセットすると候補文字列の並びとみなされます。 文字列をセットすると候補取得urlとみなされます(詳細はいずれ) |
minLength | リストを表示するための最小文字数 例えば3を設定すると2文字までは候補を出しません |
delay | キー入力後候補を出すまでの時間をミリ秒で指定 |
select | 選択されたときに呼び出される関数を指定 関数の引数はeventとuiで event.targetに対象となる<input text>要素が入り, ui.item.valueに変更される値が入ります。 <input text>にonChangeを設定しても、変更前にイベントが 発生するため変更値を取得できないことに注意が必要です |
なお、このサンプルではcocolog上にjqueryライブラリを置いて動かしていますが 必要に応じ本家からダウンロードしてください。
補足
Javascriptの定義参照は時系列での先出参照です。記述上のstaticな並びではなく 動作が行われる時点で定義されていれば参照できます。この例では onSelect関数は記述上は後ろにありますが、参照動作は、onSelect関数部 が読み込まれた後で行われますので参照可能です。
最後に置いてある<script>ブロックは初期化用です。ターゲットとなる<input> が読み込まれた後になければなりません。初期補完情報が不要の場合省略できます。
命名規則:この例では引数は後ろにアンダースコアを付け、ローカル変数には 前にアンダースコアを付けています。
クロージャの使用は必要最低限にとどめるべきだと考えています。
使っていけないわけではなく、本ブログの記事では、
◆CANVASを用いたHTMLスライダー
のhiSlider.js内でインスタンス毎のイベント処理を設定するために
用いています。ただし、クロージャでの処理記述は手短にしてあります
this.canvas.onmousedown=function(e){_this.mouseDown(e);}
補足-2:jQueryのタブ切り替えとの共存は出来ない?
今の所、
ui.core.js,ui.tabs.js,ui.tabs.css
を用いた「タブ切り替え」はautocompleteの
jquery-ui-1.8.10.custom.js
を読み込むとレイアウトが壊れて
しまい、共存はできないようです。(調査不足かもしれません)
suggest.jsによるオートコンプリート
jqueryの他にも
http://www.enjoyxstudy.com/javascript/suggest/にあるsuggest.jsでも実現できます。
次の動作が得られます。
suggest.jsにイベント呼び出しの修正を施し、次のようなコードで呼んでいます。詳しくは 本家の説明を参照してください。
<!DOCTYPE html> <!-- saved from url=(0014)about:internet --> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <script src="../suggest.js" type="text/javascript"></script> <style type="text/css"> .suggest { position: absolute; background-color: #FFFFFF; border: 1px solid #CCCCFF; width: 252px; } .suggest div { padding: 1px; display: block; width: 250px; overflow: hidden; white-space: nowrap; } .suggest div.select{ color: #FFFFFF; background-color: #3366FF; } .suggest div.over{ background-color: #99CCFF; } </style> </head> <body> <div > <input id="text_part" type="text" name="pattern" value="" autocomplete="off" size="40" style="display: block"/> <div id="suggest_part" class="suggest" style="display:none;"></div> </div> <script type="text/javascript"> function setCandi(target_,suggest_,candi_,onSelectFunc_){ var suggest = new Suggest.Local(target_,suggest_, candi_); suggest.onSelect= onSelectFunc_; } var planets = ['Mercury','Venus','Earth','Mars','Jupiter' ,'Saturn','Uranus','Neptune','Pluto']; var atoms = ['Hydrogen','Helium','Lithium','Beryllium','Boron' ,'Carbon','Nitorogen','Oxygen','Fluorine','Neon' ,'Sodium','Magnesium','Alminium']; function setPlanets(){ setCandi("text_part","suggest_part",planets,onSelect); } function setAtoms(){ setCandi("text_part","suggest_part",atoms,onSelect); } function clearCandi(){ setCandi("text_part","suggest_part",[],onSelect); } function onSelect(id,value){ alert(id+":"+value); return true; } </script> <!--<input type=text id="text_part"></input><br>--> <input type=button onClick="setPlanets();" value="補完情報セット-1"> <input type=button onClick="setAtoms();" value="補完情報セット-2"> <input type=button onClick="clearCandi();" value="補完情報消去"> <script type="text/javascript"> setPlanets(); // 初期値設定 </script> </body> </html>
suggest.jsに施した修正は
・メンバ変数にonSelect追加
this.input = this._getElement(input);
this.suggestArea = this._getElement(suggestArea);
this.candidateList = candidateList;
this.oldText = this.getInputText();
this.onSelcect=null;
if (arguments[3]) this.setOptions(arguments[3]);
と
・moveEndでonSelect呼び出し
moveEnd: function() {
if (this.input.createTextRange) {
this.input.focus(); // Opera
var range = this.input.createTextRange();
range.move('character', this.input.value.length);
range.select();
} else if (this.input.setSelectionRange) {
this.input.setSelectionRange(this.input.value.length, this.input.value.length);
}
if( this.onSelect ) this.onSelect(this.input.id,this.input.value);
},
の2点です
| 固定リンク