jQuery Select2 で ajax を使って選択肢を取得する
はじめに
jQuery Select2 で、ajax で選択肢を取得する方法方法を調べた。
TL;DR
ajax
オプション内で設定url
,data
オプションで API Request に関する設定processResults
オプションで API Response を受信した後の処理templateResult
,templateSelection
オプションで見た目(HTML)の設定
目次
環境・条件
詳細
Ajax (remote data) | Select2 にドキュメントあるけど、正直わかりづらい。
JQuery Select2プラグインのリモート検索(インクリメンタルサーチ) - Qiita も読みつつ、手元で色々と試してようやく理解できた。
ミニマムコード
動作サンプル。
See the Pen select2 simple ajax sample by 17num (@17num) on CodePen.
HTML ファイル。CDN から読み込んで、空の select
タグだけ配置。
※諸々細かい部分は省略
1 | <head> |
JS 部分。GitHub のリポジトリ検索 APIを実行して、その結果を選択肢として表示する。
1 | $(document).ready(function() { |
data オプション
data
が API Request に関するオプション。params.term
に検索ワード(ユーザー入力値)が入っている。上記例では {q: params.term}
を返却することで、?q=xxxx
というクエリパラメータが付与された API を実行している。
もし ?name=xxxx
のようなクエリパラメータで API を実行したい場合は、以下のように指定すれば良い。
1 | $("select.select2").select2({ |
processResults オプション
processResults
が API Response に関するオプション。
まず、結果を表示するためのデータは下記の構造でなければならないことに注意しておく(processResults
で最終的に以下のデータを返却する)。
1 | { |
「『id
, text
を持つ Object
』の配列」を、キー results
に対応する値とした Object
を processResults
で返却する。
第一引数 data
に API Response が格納されているため、data.items
の値をもとに上記構造のデータを生成して返却している。
1 | $(document).ready(function() { |
カスタマイズ
前述の内容がミニマムコードで、あとは良くあるカスタマイズについて。
使えるオプションは jQuery $.ajax options にまとまっている。
delay オプション
最終キー入力から API 実行まで、どのぐらいの間隔を空けるか。単位は msec。
1 | $(document).ready(function() { |
url オプション
/search?q=xxxx
ではなく /search/xxxx
のように、クエリパラメータではない形式にしたい場合などは、url
に関数を指定すると良い。
1 | $(document).ready(function() { |
cache オプション
特に何も説明が書かれてないが、たぶんキャッシュが効くようになる(無駄なリクエストが減る)のだと思われる。
1 | $(document).ready(function() { |
templateResult, templateSelection オプション
ajax
のオプションではないが、選択肢や選択結果の見た目を変更したい場合は templateResult
, templateSelection
オプションを使う。
processResults
で返却したデータが利用可能なので、以下のように画像パスを含めておくことで、選択肢内にサムネイルを表示するということも可能。
1 | { |
まとめ
ajax
オプション内で設定url
,data
オプションで API Request に関する設定processResults
オプションで API Response を受信した後の処理templateResult
,templateSelection
オプションで見た目(HTML)の設定
その他・メモ
ちなみに、CDN の jQuery で最初 slim 版を使ってたら、Uncaught TypeError: o.ajax is not a function
というエラーが出て動かずにどハマりした。
jQueryでajaxが使えない($.ajax is not a function) │ Web備忘録
参考文献
- Ajax (remote data) | Select2 - The jQuery replacement for select boxes
- JQuery Select2プラグインのリモート検索(インクリメンタルサーチ) - Qiita
- Options | Select2 - The jQuery replacement for select boxes
関連記事
- jQuery Select2 で、初期値の設定と選択状態のクリア
- jQuery Select2 で動的に選択肢を追加する
- jQuery Select2 で上限ありの複数選択
- Lozad.js で Lazy Load (非 jQuery)
- JavaScript で画像をローカルにダウンロード
- JavaScript で複数画像を zip に圧縮してローカルにダウンロード
- JavaScript で URL のクエリパラメータを操作する方法
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)