つゆだくJavaScript・スタイルシ

ート

 
 
メールを管理人に送信
メールアドレス:
コメント*:
*書いた内容は公開されません

メニュー

トップページ
JavaScriptトップページ
SQLiteトップページ
ライブラリー
個人的サンプル
AJAXのおすすめ書籍
ご意見ご要望
スポンサードリンク

Yahoo! User Interface Library - AutoComplete

YUI AutoCompleteとは

AutoComplete(テキストボックスで入力候補がでてくるやつ)を行うためのライブラリーです。AutoCompleteを行うために引っ張ってくるデータは、文字列の配列,Function,XHR(XMLHttpRequest)が利用できるようになっていて、さらにXHRはXML,JSON,CSVなどのテキストデータに対応しています。

たとえば、GoogleサジェストInfoseekの辞書などの入力補完機能を簡単に実装することができるようになります。

詳しくはhttp://developer.yahoo.com/yui/autocomplete/のオリジナルを読まれるのがよいと思います。

AutoCompleteを使う前準備

必要なのは5つのファイルです。もちろんインストールは済ませておく必要があります。

<script type="text/javascript" src="your install path/yahoo-min.js"></script>
<script type="text/javascript" src="your install path/dom-min.js"></script>
<script type="text/javascript" src="your install path/event-min.js"></script>
<script type="text/javascript" src="your install path/connection-min.js"></script>
<script type="text/javascript" src="your install path/autocomplete-min.js"></script>

データソース

YAHOO.widget.DS_JSArray- 文字列の配列データソース

一番簡単そうな配列を使ったAutoCompleteをやってみます。とくに細かい設定は行わず、とりあえず一番簡単な例です。

まず2つの要素を用意します。

入力ボックス
<input id="input1" type="text"/>
AutoCompleteの表示場所
<div id="suggest1"></div>

次に以下のJavaScriptを書きます。

<script type="text/javascript">
var a = ["aaa", "abc", "abcdefg"];
var arrayDS = new YAHOO.widget.DS_JSArray(a);
var autoCmp = new YAHOO.widget.AutoComplete(
    "input1", "suggest1", arrayDS);
</script>

この数行を書いただけなのに、下の入力ボックスで'a'を入力すると["aaa", "abc", "abcdefg"]にマッチして結果が出力されるのがわかると思います

YAHOO.widget.DS_JSFunction - 関数データソース

基本的にはDS_JSArrayと同じですが、文字列の配列を返す関数をデータソースとして指定します。

<script type="text/javascript">
var f = function() {
    return ["aaa", "abc", "abcdefg"];
}
var funcDS = new YAHOO.widget.DS_JSFunction(f);
var autoCmp2 = new YAHOO.widget.AutoComplete(
    "input2", "suggest2", funcDS);
</script>

これで、'a'を入力すればAutoCompleteされるはずなのですが、IE6でもfirefox1.5でも正しく動作してくれません。。私の使い方が悪いのでしょうか。ソースを追いかける気力がなかったので、そのうち調べたいと思いつつあまりJSFunctionのニーズはないのかなということでほっときます。

YAHOO.widget.DS_XHR - XHRデータソース

Webサービスを使ってAutoCompleteを行うためのデータソースです。JSON, XML, FLAT(カンマ区切りやタブ区切りのデータ)の3つのタイプを指定できますが、ここではXMLフォーマットを試してみます。

下のように書くと /cgi-bin/proxy-yahoo.cgi?query=XXXX にリクエストを投げます(パラメータ名'query' は変更可能)。戻ってくるXMLのサンプルはhttp://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?appid=YahooDemo&query=%e6%b2%96%e7%b8%84&results=2をごらんください。

<script type="text/javascript">
var xml = "/cgi-bin/proxy-yahoo.cgi";
var element = ["Result", "Title"];
var xhrDS = new YAHOO.widget.DS_XHR(xml, element);

xhrDS.responseType = YAHOO.widget.DS_XHR.TYPE_XML;
xhrDS.maxCacheEntries = 100;

var autoCmp3 = new YAHOO.widget.AutoComplete(
    "input3", "suggest3", xhrDS);

autoCmp3.animVert=true;
autoCmp3.animHoriz=true;
autoCmp3.useShadow=true;
autoCmp3.maxResultsDisplayed = 10;
</script>

さらにオートコンプリート風にするためにスタイルシートを定義します。ちなみに下はYahoo!のページに書いてあったものをそのまま持ってきています。

<style type="text/css">
#suggest3 {position:absolute;z-index:9050;}

/* オートコンプリートの表示領域の設定だと思われる */
#suggest3 .yui-ac-content {position:absolute;left:0;top:0;width:20em;border:1px solid #404040;background:#fff;overflow:hidden;text-align:left;z-index:9050;}

/* 影をつける設定にした時に有効 */
#suggest3 .yui-ac-shadow {position:absolute;left:0;top:0;margin:.3em;background:#a0a0a0;z-index:9049;}

/* 検索結果はリスト形式で出力されるのでその設定 */
#suggest3 ul {padding:5px 0;width:100%;}
#suggest3 li {padding:0 5px;cursor:default;white-space:nowrap;}

/* 選んでいる部分に色をつけている */
#suggest3 li.yui-ac-highlight {background:#ff0;}
</style>

これで適当な文字を入力するとYahooのウェブ検索Webサービスの結果が表示されるのがわかると思います。(Firefoxで日本語入力をするといまいち動作が怪しい?)


オプション

AutoCompleteの設定

animVert = <Boolean>
trueにするとAnimationを使って上から下にぐぅいーとでてきます。
animHoriz = <Boolean>
trueにするとAnimationを使って左から右にぐぅいーとでてきます。animVertも同時に有効にすると斜めにぐぅいーってなります。
animSpeed = <Number>
うえ2つのアニメーションが完了するまでの秒
delimChar = <String>
入力の区切り文字。たとえばdelimChar = " " とした場合、'foo bar' と入力すると、query=foo にリクエストした後、query=bar にリクエストを送るようになる
maxResultsDisplayed = <Number>
リストを作成する最大数
minQueryLength = <Number>
クエリを投げ始める文字数。デフォルトでは、1文字目からオートコンプリートが実行されて若干うざいので、ちゃんと設定したほうがよい。
queryDelay = <Number>
入力が終わってからクエリを投げ始める秒数。デフォルト0.5秒。
autoHighlight = <Boolean>
自動的に一番上の行がハイライトされる。逆に言うとfalseにしていても、ハイライトはされる。
highlightClassName = <String>
デフォルトはyui-ac-highlight。好きな名前に変更できる。
prehighlightClassName = <String>
デフォルトはnull。指定すると、ハイライト前に色々エフェクトを追加できる(のだろう)
useShadow = <Boolean>
trueyui-ac-shadowにうまくスタイルを設定して影っぽく見せる事ができるようになる。
useIFrame = <Boolean>
IE5.X, IE6のiframeにはz-indexを無視するバグがあるらしく、これを回避するためにはtrueにしなければならない。
forceSelection = <Boolean>
trueにすると、リストから選択することを強制させることが可能になります。もしリストから選択しないと、入力値は自動的に削除されます。
typeAhead = <Boolean>
trueにすると、自動的に一番上の行が選択される。
allowBrowserAutocomplete = <Boolean>
autocomplete="off|on"を設定してくれる
alwaysShowContainer = <Boolean>
常にリストを表示させておく

XHRDataSourceの設定

maxCacheEntries = <Number>
キャッシュサイズ。デフォルト15。
queryMatchCase = <Boolean>
クエリーを大文字小文字区別するかどうか。falseならtoLowerCase()をして比較される。デフォルトfalse
queryMatchContains = <Boolean>
結果とクエリーをSTARTSWITH かCONTAINSで判定する。falseならSTARTSWITH。デフォルトfalse
queryMatchSubset = <Boolean>
うまく伝えられない。「foo」で検索した後に「food」を検索した場合、「foo」のキャッシュからも結果を得ようとする、みたいなことが英語で書いてある気がする。でも自信ない。
scriptQueryParam = <String>
パラメータ名の変更
myXHRDataSource.scriptQueryParam = "tag";/url?tag=fooとなる
scriptQueryAppend = <String>
パラメータの追加
myXHRDataSource.scriptQueryAppend = "abc=123&def=456";/url?query=foo&abc=123&def=456となる
responseStripAfter = <String>
レスポンスにHTMLのコメントが含まれているような場合は、myXHRDataSource.responseStripAfter = "\n<!-"とする
connTimeout = <Number>
XHRのタイムアウト値を設定。ミリ秒単位。