- ベストアンサー
静的自動補完への道
- Ajaxなどを用いずに、あらかじめ用意したArrayの中からInputTextを自動補完をする方法を考えています。gと入力するとgoogleやごん蔵などが表示されるようにしたいです。
- どのような処理を行えばよいかわからないですが、displayを動的に生成し、文字を入れ、指定したInputTextの下に並べて表示する必要があると思います。
- 教えていただけると助かります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
たいさく(?)なので、ぶんかつして いちぶだけ。 はいれつから、がいとうしそうなもじを かえします var v = [ ['Mac Air', 'apple', 'air', 'mac note'], ['Macintosh', 'apple', 'mac'], ['Mac mini', 'apple', 'mac', 'mini'], ['google', 'グーグル', 'ぐーぐる'], ['ごん蔵', 'ごんぞう', 'gonzou'] ]; (function () { if(!Array.prototype.map) Array.prototype.map= function(b,e){ var c=this.length; if(typeof b!="function")throw new TypeError; for(var d=Array(c),a=0;a<c;a++) a in this&&(d[a]=b.call(e,this[a],a,this));return d }; //________ function Referee (list) { this.list = list; } function getList (key) { var cb = { result: [], length: key.length, key: key, keyLow: key.toLowerCase ()} ; this.list.map (wordCheck, cb); return cb.result.sort (oerder).map (firstValue); } function wordCheck (list) { (this.key === list[0]) ? this.result.push ([list[0], 1]) : list.map (secondLatterCheck, (this.word = list[0], this)); } function secondLatterCheck (word) { if (0 === word.indexOf (this.keyLow)) this.result.push ([this.word, this.length / word.length]); } function firstValue (ary) { return ary[0] } function toLowerCase (str) { return String (str).toLowerCase () } function oerder (a, b) { return a[0] === b[0] ? 0: b[0] - a[0] } function create (list) { if (1 > arguments.length) return null; return new Referee (list); } //____________ Referee.prototype.getList = getList; Referee.create = create; this.Referee = Referee; }) () var a = Referee.create (v); alert (a.getList ('g')); alert (a.getList ('ma'));
その他の回答 (4)
- babu_baboo
- ベストアンサー率51% (268/525)
まちがえた! function oerder (a, b) { return a[0] === b[0] ? 0: b[0] - a[0] } を function oerder (a, b) { return a[1] === b[1] ? 0: b[1] - a[1] } に! もう~、しんねんそうそう…。
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
配列の1つ1つの要素に対して、正規表現やindexOf()で該当の文字があるかを調べて、 その文字が含まれる要素を<li>なり<p>なりで表示してください。 以下のページの"互換性"のコードをアレンジして前方一致検索などに改変できると思います。 https://developer.mozilla.org/ja/docs/JavaScript/Reference/Global_Objects/Array/indexOf Ajaxを使うのは、検索をサーバーに任せるというだけですから。
補足
リンクありがとうございます。参考にしたいと思います。
- takuhito_hihara
- ベストアンサー率40% (2/5)
勉強の為に作るのは良いと思いますが、ここまで高度な仕様のプログラムでしたら素直に既存のライブラリやAPIなどを使って作った方が良いと思いますよ。 「ご」を入力して「ごん蔵」ならまだ単純で簡単ですが、「g」で「ごん蔵」はかなりメンドくさいかと。 どこまで対応するかにもよりますが、その仕様ですと「g」で「が、ぎ、ぐ、げ、ご、ぎゃ、ぎゅ、ぎょ、ガ、ギ、グ、ゲ、ゴ、ギャ、ギュ、ギョ」などで始まるすべての単語に対応しなくてはならないので。googleですらもそこまで対応したのは割とここ2、3年だったと思います。 まぁ、ということを言いましたが一応質問に答えますと、 (1)のdisplayを動的に生成と言うのがよく分からないのですが、タグを動的に生成でよろしいでしょうか?それならばjQueryなどでタグを生成しぶっ込んでやれば良いと思います。 (2)も同じく、arrayの中からマッチさせて、$(element).text(マッチした文字)として(1)で生成した要素にテキストを流し込んでやります。 (3)はCSSで縦に並べてあげるって形ですね。 という感じになると思います。
補足
>displayを動的に生成と言うのがよく分からないのですが InputTextの下に変換候補を出力したいのですが、そこにdisplayタグを使うのだろうと予測しています。 回答ありがとうございます
- babu_baboo
- ベストアンサー率51% (268/525)
HTML5 の入力補間に、datalist があるよ。 きっとそれが 道?
補足
ありがとうございます。 使うブラウザがIE7なのでおそらく使えないのと、datalistはいろいろと痒いところに手が届かないので、javascriptでの実装を考えています
お礼
まってました!! お礼遅くなってすいません。 ありがとうございます。 助かりました