datalist と JavaScript を使った入力候補
<datalist> は <input> において入力候補の一覧を提供するためのタグエレメントです。予め <datalist> タグを使用して入力候補を web ページ内で編集しておく方法もありますがスマートではありません。
入力候補は別ファイルやデータベースを利用したほうが利便性が上がります。しかし、そのためには JavaScript を使用して非同期通信
で <datalist> タグのための一覧データを読み込む必要があります。
ここでは <datalist> と JavaScript による非同期通信
を利用した入力候補の作成方法を解説します。
ページ内 Index
<datalist> について
まずは <datalist> タグエレメントについて解説します。
<datalist> タグは、<input> エレメントの入力候補リスト(a list of predefined options)が定義できます。
<datalist> は <option> タグによって一覧の項目データを作成します。
<datalist> と <input> エレメントは、datalist の id 名と<input>エレメントの list 属性名でバインドします。
<option>で一覧の表示を編集することができます。
この <datalist> の <option> データを JavaScript ので非同期通信
によって外部ファイルまたはデータベースから読み込むようにします。
非同期通信
次に JavaScript による非同期通信
について解説します。
非同期通信とは、非同期処理
のひとつで web ページの遷移がなくてもサーバーと通信を行いページ内の一部を変更することを可能にする手法です。ページのリロードを行わなくても一部を更新することができます。
通信方法は web ページと同じ HTTP 接続で web サーバーと通信を行います。web サーバーには URL でリクエストします。
以下は非同期通信
のコード例です。
この例は単純に外部の HTML テキストファイルを読み込んで、web ページにそのテキストを挿入しています。
非同期通信
のコードは以下の要素から成り立っています。
- 非同期通信のためのインスタンスを生成
- 通信が成功した場合の処理
- 通信設定と通信の実行
流れが前後しているように感じますが、この3つの処理要素が必要になります。1番目は非同期通信のためのインスタンスを生成しているだけです。
2番めに通信が成功した場合の処理を予め編集しておきます。そのあとに通信を実行します。
xhr_rel.responseType = "document";
はxhr_rel.response
でファイルデータを取得する際に必要になります。
自動で何のデータ化を識別されるようなら必要はありません。
作成手順
ここでは、簡単に作成手順を解説します。<datalist> を外部ファイルとして作成しておき、非同期通信によってそれを読み込み、反映します。
まずは <datalist> を作成します。
以上の内容でtest_datalist.html
として保存します。
上記の JavaScript のコードを <input> エレメントの onforcus イベントの発生時に実行します。
onfocus イベントによって呼び出されるメソッドは上記の非同期通信
を参考にしてください。
非同期通信によって読み込んだ HTML テキストはid='example_list_00'
エレメントに挿入されます。
挿入された HTML テキストは即時にオブジェクト化されるようです。上記の <input> エレメントの list="test" と <datalist> の id="test" によって自動でバインドされ一覧として表示されます。
Example
実際の <datalist> タグと JavaScript による非同期通信による作成例です。
XML、JSON
サーバーからレスポンスを XML や JSON データで受け取る場合には非同期通信の通信設定を XML や JSON 用に切り替えます。
データベースを利用して一覧データを取得する方法には XML や JSON データに変換する方法もあります。
XML
以下のように XML テキストは .responseXML として受け取るようにします。
もしも XML テキストファイルとして解釈されない場合は、以下のように MIME を text/xml として設定します。
XML テキストのタグエレメントごとのデータは getElementsByTagName() メソッドでタグ名を指定し取得します。
getElementsByTagName() メソッドは document または Element のメソッドです。返り値は HTMLCollection になります。
JSON
JSON データは以下のように .responseType = "json" に設定して、.response で取得します。
JSON テキストはjson
タイプで読み込むことで自動でオブジェクト化されます。階層化されますのでルートから辿りながらデータを取得することもできます。