LoginSignup
8

More than 3 years have passed since last update.

[jQuery/Select2]動的なselectボックスにSelect2を適用する方法

Posted at

はじめに

公式:Select2

Select2ではselectボックス時に、
入力フォームも使えるようになる素敵なJSライブラリ。
挙動イメージはこんな感じ。

image1.gif

検証環境

以下の環境で実施しました。

[client]
・MacOS Mojave(10.14.2)
・Vagrant 2.2.2
・VBoxManage 6.0.0

[virtual]
・CentOS 7.6

ご参考までに。

やりたいこと

・「+」ボタンを押した際に動的に入力フォームを増やす
・追加されたselectボックスにSelect2を適用する

・事前準備

jQueryとSelect2はちゃんとincludeすること。

index.html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script> 
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />

・実装

まず、

・「+」ボタンを押した際に動的に入力フォームを増やす

まずはSelect2は後にしてこの機能を作りました。

index.html
<form id="sample" action="#">
  <table id="form_table" border="1">
    <thead>
    <tr>
      <td>データ1</td>
      <td>データ2</td>
      <td>データ3</td>
      <td>行削除</td>
    </tr>
    </thead>
    <tbody>
    <tr style="display: none;">
      <td>
        <select>
          <option value="">データ1</option>
          <option value="111">111</option>
          <option value="222">222</option>
          <option value="333">333</option>
          <option value="334">334</option>
        </select>
      </td>
      <td>
        <select>
          <option value="">データ2</option>
          <option value="444">444</option>
          <option value="555">555</option>
          <option value="666">666</option>
          <option value="667">667</option>
        </select>
      </td>
      <td><input type="number" value="0"></td>
      <td><button type="button" id="delete_form">×</button></td>
    </tr>
    </tbody>
  </table>
  <button type="button" id="add_form"></button>
</form>
sample.js
$(function () {
  $("#add_form").click(function(){
    $("#form_table tbody tr:first-child").clone(true).appendTo("#form_table tbody");
    $("#form_table tbody tr:last-child").css("display", "table-row");
  });

  $("#delete_form").click(function(){
    $(this).parent().parent().remove();
  });
});

上記を実装すると、

image2.gif

このように動的に増やしたり減らしたりが出来ます。

で本題。

・追加されたselectボックスにSelect2を適用する

「+」ボタンで1行追加した際に、
追加されたselectボックスに都度Select2を適用するようにJSを修正します。

sample.js
$("#add_form").click(function(){
  $clone = $("#form_table tbody tr:first-child").clone(true);
  $clone.find("span").remove();
  $clone.find("select").select2();
  $clone.appendTo("#form_table tbody");
  $("#form_table tbody tr:last-child").css("display", "table-row");
});

Select2を適用していると、自動的にspanタグが発行されるため、
cloneした際に元のspanタグをremoveしてから再度Select2を付与するようにしています。
なぜそのようにしているかの理由は

Cloned Select2 is not responding

のstackoverflowにも上がっていますが、動的に増やした際、
Select2がうまいこと適用されなかったためです。
(一度Select2を消し去ってから再付与する必要があるとのこと。)

Select2を実装したので確認してみましょう。

image3.gif

追加したもの全てにSelect2が適用されていますね。
(CSSイジってないので見た目の崩れはご了承を)

所感

大量に選択肢が出てくるようなselectボックスには、
ぜひSelect2を導入したいですね。

おわりに

何かお気づきの点がありましたら、
ご指摘やアドバイス等頂けると大変助かります!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8