15.

jQueryでセレクトボックスにoptionを追加する方法|append・each・動的生成

編集

jQueryでセレクトボックス(<select>)に<option>を追加するには、$('#sel').append('<option value="1">A</option>') のように対象の<select>append()でオプション文字列を渡すのが基本です。動的な値や配列・データからの一括追加では、HTML文字列の組み立てよりも $('<option>', {value, text}) でオブジェクトを生成する方法が安全で読みやすくなります。

この記事の要点
  • 基本は $('#sel').append('<option value="1">A</option>') で末尾に追加する。
  • 動的な値には $('<option>', {value: v, text: t}) でオブジェクト生成すると安全。
  • 配列やサーバーから取得したデータは $.each() でループして一括追加する。
  • 先頭は prepend()、特定位置は対象<option>に対する after() / before() を使う。
  • 追加後の選択状態は $('#sel').val(値) で設定し、入れ替え前は empty() でクリアする。
  • ユーザー入力など外部由来の文字列は text プロパティ経由で入れ、HTML文字列連結によるXSSを避ける。

基本: append() でオプションを末尾に追加する

最も手軽な方法は、対象の<select>を取得し、append()にオプションのHTML文字列を渡すことです。append()は指定した要素の内部末尾に追加するため、新しい<option>はリストの一番下に並びます。

まず、操作対象となる<select>を用意します。idを付けておくと、jQueryのIDセレクタで一意に指定できます。

<select id="sel">
  <option value="1">りんご</option>
  <option value="2">みかん</option>
</select>

この<select>に対して、jQueryで新しいオプションを追加します。

// 末尾に1件追加する
$('#sel').append('<option value="3">ぶどう</option>');

このコードを実行すると、「ぶどう」(値は3)がリストの末尾に追加されます。append()に渡す文字列は完結した<option>タグとして記述します。value属性を省略した場合、多くのブラウザではタグ内のテキストがそのまま値として扱われます。

なお、jQueryでDOMを操作するコードは、対象の要素が読み込まれた後で実行する必要があります。<head>内などページの早い段階でスクリプトを書く場合は、次のように準備完了後に実行されるようにします。

$(function() {
  $('#sel').append('<option value="3">ぶどう</option>');
});

$(function() { ... })$(document).ready(function() { ... }) の短縮記法で、HTMLの解析が終わってから中の処理を実行します。<select>より後ろにスクリプトを置く場合は、必ずしもこの囲みは必要ありません。

$('<option>', {...}) でオプションを生成する

値やテキストが変数の場合、HTML文字列を連結して組み立てると、引用符の扱いを誤ったり、後述するXSSのリスクが生じたりします。jQueryでは、要素名と属性オブジェクトを渡して要素を生成する記法が用意されており、こちらのほうが安全で読みやすくなります。

var value = '3';
var label = 'ぶどう';

// 属性をオブジェクトで指定して<option>を生成
var $opt = $('<option>', {
  value: value,
  text: label
});

$('#sel').append($opt);

textプロパティに渡した文字列は、jQueryが内部でtext()相当として扱うため、<>を含んでいてもタグとして解釈されず、文字としてそのまま表示されます。これにより、外部から受け取った値を安全に表示できます。

属性オブジェクトにはselected: truedisabled: trueなども指定できます。

var $opt = $('<option>', {
  value: '3',
  text: 'ぶどう',
  selected: true   // 追加と同時に選択状態にする
});
$('#sel').append($opt);

new Option()(素のJavaScript)を使う方法もあり、これについては後半で対比します。

配列・データから $.each() で一括追加する

選択肢が複数あり、配列やサーバーから取得したデータをもとに追加する場合は、$.each()などでループしながらオプションを生成します。ループのたびにappend()を呼ぶこともできますが、件数が多いときは一度文字列やドキュメントフラグメントにまとめてから1回で追加するほうが、再描画の回数を抑えられます。

まず、単純な配列から追加する例です。

var items = [
  {value: '1', text: 'りんご'},
  {value: '2', text: 'みかん'},
  {value: '3', text: 'ぶどう'}
];

$.each(items, function(index, item) {
  var $opt = $('<option>', {value: item.value, text: item.text});
  $('#sel').append($opt);
});

件数が多い場合は、いったん配列に<option>要素をためてから一括で渡すと、DOM操作の回数が1回で済みます。

var $options = [];
$.each(items, function(index, item) {
  $options.push($('<option>', {value: item.value, text: item.text}));
});
$('#sel').append($options);   // 配列をまとめて追加

サーバーからJSONを取得して選択肢を作る場合も、取得したデータに対して同じようにループします。下記は$.getJSON()でデータを取得し、<select>を組み立てる例です。

$.getJSON('/api/fruits', function(data) {
  var $sel = $('#sel');
  $sel.empty();   // 既存の選択肢をクリア(必要に応じて)
  $.each(data, function(i, item) {
    $sel.append($('<option>', {value: item.id, text: item.name}));
  });
});

先頭や特定位置に追加する(prepend / after / before)

append()は末尾への追加でしたが、追加位置を変えたい場合は別のメソッドを使います。代表的なものを次の表にまとめます。

メソッド 追加される位置 呼び出し対象
append() リストの末尾(内部の最後) <select>
prepend() リストの先頭(内部の最初) <select>
after() 指定した<option>の直後 基準となる<option>
before() 指定した<option>の直前 基準となる<option>

先頭に「選択してください」のようなプレースホルダーを置きたい場合はprepend()が便利です。

// 先頭に追加
$('#sel').prepend('<option value="">選択してください</option>');

「2番目の<option>の後ろ」のように、特定の選択肢を基準にして挿入したい場合はafter()before()を使います。基準となる<option>を選び、それに対してメソッドを呼びます。

// value="2"のオプションの直後に挿入
$('#sel option[value="2"]').after('<option value="3">ぶどう</option>');

// 先頭から数えて2番目(0始まりのindex 1)の直前に挿入
$('#sel option').eq(1).before('<option value="9">新規</option>');

選択状態の設定とクリア(val / empty)

オプションを追加したあとに、どれを選択状態にするかはval()で指定します。引数に選択したい<option>valueを渡すと、その項目が選択されます。

// value="3"の項目を選択状態にする
$('#sel').val('3');

// 現在選択されている値を取得する
var current = $('#sel').val();

選択肢をすべて入れ替えたいときは、追加の前にempty()で既存の<option>をすべて削除します。これにより、古い選択肢が残ったまま重複することを防げます。

// いったん空にしてから入れ直す
$('#sel').empty();
$('#sel').append('<option value="1">りんご</option>');
$('#sel').append('<option value="2">みかん</option>');

特定の<option>だけを削除したい場合は、その要素を選択してremove()を呼びます。

// value="2"のオプションだけ削除
$('#sel option[value="2"]').remove();

素のJavaScript(Option / add)との対比

同じ操作は、jQueryを使わずに標準のDOM APIでも実現できます。new Option()でオプションを生成し、<select>add()appendChild()で追加します。jQueryを読み込めない環境や、ライブラリ依存を減らしたい場合の選択肢になります。

var sel = document.getElementById('sel');

// new Option(テキスト, 値) で生成して末尾へ追加
var opt = new Option('ぶどう', '3');
sel.add(opt);

// textContentで入れるとタグとして解釈されず安全
var opt2 = document.createElement('option');
opt2.value = '4';
opt2.textContent = 'もも';
sel.appendChild(opt2);

jQueryの記法と標準APIの対応関係を次の表に整理します。

やりたいこと jQuery 素のJavaScript
末尾に追加 $('#sel').append($opt) sel.add(opt)
生成 $('<option>', {value, text}) new Option(text, value)
選択値の設定 $('#sel').val('3') sel.value = '3'
全削除 $('#sel').empty() sel.length = 0
よくある落とし穴
  • XSS(クロスサイトスクリプティング): ユーザー入力やサーバーから受け取った文字列をHTML文字列として連結しappend()に渡すと、<等を含む値がタグとして解釈される危険があります。外部由来の値は$('<option>', {text: ...})text()、標準APIならtextContentで入れます。
  • value重複: 同じvalueを持つ<option>が複数あると、val()での選択や送信値の判別が意図と異なる結果になります。一意になるよう、追加前に重複チェックをするかempty()で作り直します。
  • 選択状態のリセット: empty()で作り直すと、それまでの選択状態は失われます。再構築の前にval()で現在の値を保存し、追加後に再設定すると選択を維持できます。
  • 追加前にスクリプトが走る: <select>がまだ読み込まれていない段階で実行すると追加されません。$(function(){ ... })で囲むか、対象より後ろにスクリプトを置きます。

選択状態を保ったまま選択肢を作り直す例を示します。

var $sel = $('#sel');
var prev = $sel.val();   // 現在の選択値を退避

$sel.empty();
$.each(items, function(i, item) {
  $sel.append($('<option>', {value: item.value, text: item.text}));
});

$sel.val(prev);   // 選択状態を復元(該当値があれば)

よくある質問

Q. append() に渡す文字列と $('<option>', {...}) はどちらを使うべきですか。
固定の選択肢で値も自分で管理しているなら、どちらでも問題ありません。値やテキストが変数、特にユーザー入力やサーバーから取得したデータの場合は、$('<option>', {text: ...})を使うと文字列が自動的にエスケープされ、XSSを避けられます。

Q. 追加したのにセレクトボックスに表示されません。
主な原因は、対象の<select>がまだ読み込まれる前にスクリプトが実行されている、IDセレクタの綴りが合っていない、jQuery本体が読み込まれていない、のいずれかです。$(function(){ ... })で囲み、$('#sel').length0でないか(要素が取得できているか)を確認してください。

Q. 追加した選択肢を最初から選択状態にしたいです。
追加後に$('#sel').val(選択したい値)を呼ぶか、生成時に$('<option>', {value: v, text: t, selected: true})のようにselected: trueを指定します。複数選択(multiple)の場合はval(['1','2'])のように配列で渡せます。

Q. 重複した選択肢を追加しないようにするには。
追加前に同じvalueが既にあるかを調べます。$('#sel option[value="3"]').length0のときだけ追加すれば、重複を防げます。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 導入方法
  2. 文法
  3. HTML/CSS 操作・制御
  4. 要素の取得
  5. 値の取得
  6. jQuery で要素を追加(append / prepend / before / after / wrap)
  7. 値と要素の削除
  8. 子要素の削除
  9. 要素のコピー
  10. Ajax
  11. 項目をタッチ/クリックしてスライドさせる方法
  12. テキスト/セレクトボックス/ラジオボタン変更時のイベント
  13. パスワードを一時的に表示させる方法
  14. $(document).ready(function() { ...
  15. セレクトボックスにオプションを追加する方法

最近更新/作成されたページ