静的自動補完への道

このQ&Aのポイント
  • Ajaxなどを用いずに、あらかじめ用意したArrayの中からInputTextを自動補完をする方法を考えています。gと入力するとgoogleやごん蔵などが表示されるようにしたいです。
  • どのような処理を行えばよいかわからないですが、displayを動的に生成し、文字を入れ、指定したInputTextの下に並べて表示する必要があると思います。
  • 教えていただけると助かります。
回答を見る
  • ベストアンサー

静的自動補完への道

あけましておめでとうございます。 Ajaxなどを用いずに、あらかじめ用意したArrayの中からInputTextを自動補完をすることを考えています。 たとえば、「g」といれたら「google」がでてきたり、「ごん蔵」が出てきたりするようにしたいのです。 そこで最初の難問なのですが、InputTextに文字を入れたら、そのInputTextの下に自分の用意したArrayの文字の中から5つほどdisplayで表示させたいと思います。 --------------- | と         | --------------- トマト トナカイ トルストイ   これにはどのような処理を行えばよろしいのでしょうか。「displayを動的に生成(1)」し、さらに「中に文字を入れ(2)」、「指定したInputTextの下に並べて表示する(3)」という3つをクリアしないといけないのではないかと予測しているのですが、そのすべての方法がわかりません。 すべてわからなくても、わかる範囲で教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

たいさく(?)なので、ぶんかつして いちぶだけ。 はいれつから、がいとうしそうなもじを かえします 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'));

JoyWorld
質問者

お礼

まってました!! お礼遅くなってすいません。 ありがとうございます。 助かりました

その他の回答 (4)

回答No.5

まちがえた! 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] } に! もう~、しんねんそうそう…。

回答No.3

配列の1つ1つの要素に対して、正規表現やindexOf()で該当の文字があるかを調べて、 その文字が含まれる要素を<li>なり<p>なりで表示してください。 以下のページの"互換性"のコードをアレンジして前方一致検索などに改変できると思います。 https://developer.mozilla.org/ja/docs/JavaScript/Reference/Global_Objects/Array/indexOf Ajaxを使うのは、検索をサーバーに任せるというだけですから。

JoyWorld
質問者

補足

リンクありがとうございます。参考にしたいと思います。

回答No.2

勉強の為に作るのは良いと思いますが、ここまで高度な仕様のプログラムでしたら素直に既存のライブラリやAPIなどを使って作った方が良いと思いますよ。 「ご」を入力して「ごん蔵」ならまだ単純で簡単ですが、「g」で「ごん蔵」はかなりメンドくさいかと。 どこまで対応するかにもよりますが、その仕様ですと「g」で「が、ぎ、ぐ、げ、ご、ぎゃ、ぎゅ、ぎょ、ガ、ギ、グ、ゲ、ゴ、ギャ、ギュ、ギョ」などで始まるすべての単語に対応しなくてはならないので。googleですらもそこまで対応したのは割とここ2、3年だったと思います。 まぁ、ということを言いましたが一応質問に答えますと、 (1)のdisplayを動的に生成と言うのがよく分からないのですが、タグを動的に生成でよろしいでしょうか?それならばjQueryなどでタグを生成しぶっ込んでやれば良いと思います。 (2)も同じく、arrayの中からマッチさせて、$(element).text(マッチした文字)として(1)で生成した要素にテキストを流し込んでやります。 (3)はCSSで縦に並べてあげるって形ですね。 という感じになると思います。

JoyWorld
質問者

補足

>displayを動的に生成と言うのがよく分からないのですが InputTextの下に変換候補を出力したいのですが、そこにdisplayタグを使うのだろうと予測しています。 回答ありがとうございます

回答No.1

HTML5 の入力補間に、datalist があるよ。 きっとそれが 道?

JoyWorld
質問者

補足

ありがとうございます。 使うブラウザがIE7なのでおそらく使えないのと、datalistはいろいろと痒いところに手が届かないので、javascriptでの実装を考えています

関連するQ&A

  • Outlook 2007でアドレスが補完されず、困っています

    Outlook 2007で、過去にメールのやりとりをしている相手のアドレスを [宛先]欄に打ち込んでも補完してくれません。普通は文字を打ち込 む度に候補となるアドレスのリストが下に表示されると思うのですが。 仕事の能率が下がり、大変困っています。どうかご助力願います。 以下詳細です。 ・OS: Windows Vista Home Premium 32bit ・[ツール]メニュー下の[[宛先]、[CC]、[BCC] フィールドを入力する時に  名前の候補を表示する]チェックボックスはオンになっている。 ・VistaのPCは今が2台目で、1台目では補完機能が使えていた。  1台目のOutlookから「個人用フォルダ ファイル(.pst)」の形式で  データを引き継いだが、その時点から補完機能は使えなかった。  それ以前がどうだったかはわかりません。 ・アドレス帳へ登録してあるものもしていないものも、補完されない。

  • 閉じ括弧の自動入力(自動補完)の仕方はないでしょうか?

    Mac OS X 10.5.6 を使っています. エディタやワープロソフトで,文章を書くときに,「」や()や『』などの括弧類を頻繁に使用しますが,私はいつも,前括弧→後括弧の順で打ち込んだ後,(例えば『』括弧の中に書名を書くために)カーソルを一文字分前に戻してから,括弧の中に語句を打つ……ということをしています. これが非常に面倒です. できれば,前括弧を打てば自動的に閉括弧(後括弧)が補完され,しかも,前括弧と後括弧が表示された時点で,カーソルが前と後の括弧の間にある……というのが理想です. このようなことが可能であれば,後括弧を打ち込む手間も,カーソルを一文字分前に動かす手間もなくなるので,かなり楽になります. ご存じであれば,ぜひお教えください.

    • ベストアンサー
    • Mac
  • 自動で改行させたくない

    自作HP作成にチャレンジしているのですが文字が勝手に62バイトで折り返されてしまいます。 <Br>は入れていません。 改行させずに一行全てを表示させるにはどうすればいいでしょうか? 文字数が多ければスクロールバーで移動できるようにしたいです。 横のスクロールバーは表示されますが下には表示されません。 ブラウザはie7を使用しています。 よろしくお願いします。

    • ベストアンサー
    • HTML
  • ふぎしな ぶんょしう

    最近ネットで話題になっているみたいですが例えば、 ぶんょしうを すべて ひがらなや カカタナで かき。 かくたごんの さしいょのもじと さごいの もじは かずえに なかの もじの じょんゅじを シッフャルてしも あてるいど しんぜに よめて しまう げしんょう。 こうした現象をなんと説明したら分かり易く理解出来るでしょうか?

  • 新世紀エヴァンゲリオン 人類補完計画について(+その他) いくつか疑問です。

    疑問その1 ゲンドウとゼーレの老人たちは人類補完計画という共通の目標を持っていますが、なんだか対立していますよね。 どこかのサイトで「ゼーレは人類が完全な単体動物に進化するため」「ゲンドウは人類の心の弱い部分を互いに補完するため」にサードインパクトを起こし、人類補完計画を遂行する、といった感じで目標は同じでも目的が違ったという説明がなされていました。 こんなことTVアニメの話の中で説明ありましたっけ?ただ単に憶測なのでしょうか? 疑問その2 第12話 奇跡の価値は の南極でのゲンドウとのやり取りの中で冬月が、「俺は罪にまみれてもヒトが生きている世界を望むよ」と言っており人類が生き続けることを願っていることがわかります。 しかし、ネルフの副司令になるというのは、サードインパクトによって人類がLCLに還元されて滅ぶことを理解した上での話のはずなのに、なぜそれを目標とするゲンドウのもとで働いているのでしょうか?自ら人類の滅びに力を注ぐことになると思うのですが・・・。 疑問その3 すべての生命(使途も含め)の源はターミナルドグマでロンギヌスの槍を刺されていたリリスですか?カヲルがアダムと称されていたそれをリリスであると見破ったみたいですが。 疑問その4 レイって何者なんでしょうか?体は実験に失敗したユイの体からサルベージしたもの、魂はリリスのもの。と聞いたことがありますが実際はどうなんでしょうか? わかるところだけでもご回答お願いしますm(._. )m

  • レイヤーの非表示

    よろしくお願いします。 本文中に <div id="test" style="DISPLAY:none;POSITION:absolute;"> </div> としてあり、何らかのイベントを受けたらjavascript内で、 objTest=document.getElementById('test'); objTest.style.display='block'; と表示したレイヤーを今度は非表示にする場合、 表示したレイヤー、例えばHTMLテーブルを表示した場合そのテーブル以外の場所をクリックしたというイベントを拾うことは可能でしょうか? フォームにテキストが入力された時、テーブルが表示されその中にあるテキスト(リンク)をクリックした場合、入力補完される。リンク以外をクリックした場合(入力補完をせず、他の動作に移ったとき)テーブルが消えるイメージです。 どうぞよろしくお願いいたします。

  • ブラウザのキャッシュを消す?

    お願いします。 グーグルなどで、フォームに何らかの語句を入力すると、 以後その文字を入れようとするを察知して 自動的に補完される(テキストエリアの下に候補の文字列が表示される) ことがありますね。 あれ(履歴?)を消去したいのですが、どうしたらいいですか? ieのツールからファイルの削除を実行しても消えないのですが。。 どなたか教えてください。

  • いきなり今日・・・

    電源を入れると「VIDEO INPUT」の下に「NO SIGNAL」と表示され「NEC」の文字も出ないでディスプレイが真っ暗になってしまう。ディスプレイの電源も一瞬で落ちます。 解決法はありますか? やはりハードディスクかディスプレイが壊れているんですか?

  • ArrayListクラスを利用するプログラムについて質問があるのですが。

    「Genericsを用いたArrayListを使用しループ処理にはiteratorを使用する。 という指定の下、 ArrayListのインスタンスを生成し次の5つの文字列を追加した後、 for文を使ってリストの中身を全て順番に画面表示したいんです。 "AA" "BB" "CC" "DD" "EE" --------------------------- import java.util.ArrayList; class TestA{ public static void main(String args[]) { ArrayList<String> array = new ArrayList<String>(); array.add("AA"); array.add("BB"); array.add("CC"); array.add("DD"); array.add("EE"); } } --------------------------- ここからよく解らないので教えていただけませんでしょうか?

    • ベストアンサー
    • Java
  • エクセルの印刷

    エクセルで、文字を「折り返して全体を表示する」にした場合のことです。作業画面で見るとセルの中に全ての文字が収まっていますが、印刷・印刷プレビューでみると全てが収まりきらず、下の方が見えない場合があります。特に文字数が多く、行数が多くなってしまった時にそうなります。セルの高さを調整することはできますが、セル行数が多くなると面倒です。より少ない作業で全ての文字を表示させるにはどうしたらいいのでしょうか?

専門家に質問してみよう