🐾

SNSサイト 写真を複数枚投稿できるようにしたい(選択可)

2024/07/15に公開
  • 画像を追加するボタンが押された時に、新しいファイルフィールドを追加する
views/new.html.erb
<script>
  document.addEventListener("DOMContentLoaded", function() {
    document.getElementById("add-file-field").addEventListener("click", function() {
      const fileField = document.querySelector("input[type='file']");
      const newFileField = fileField.cloneNode();
      fileField.parentNode.insertBefore(newFileField, fileField.nextSibling);
    });
  });
</script>

写真複数投稿できるようになる。
ビューの一番下に記述。

views/new.html.erb
<tr>
 <th>写真</th>
  <td><%= f.file_field :images, multiple: true, accept: 'image/*', class: 'form-control' %></td>
 <td><button type="button" id="add-file-field" class="btn btn-secondary">画像を追加</button></td>
</tr>

画像追加ボタン作る。

  • 解説
document.addEventListener("DOMContentLoaded", function() {

ページのDOMが完全に読み込まれた時に関数を実行するイベントリスナーを追加する。これによって、DOM要素を操作できるようになる。

document.getElementById("add-file-field").addEventListener("click", function() {

画像追加ボタン(idがadd-file-field)がクリックされたときに実行されるイベントリスナーを追加している。

const fileField = document.querySelector("input[type='file']");

ページ内の最初のファイルフィールドを取得し、("input type="file")
それを"fileField変数に格納する。

const newFileField = fileField.cloneNode();

すでにある、ファイルフィールドのクローン(コピー)を作成し、
"newField"変数に格納する。
元のファイルフィールドと同じ属性だけど、入力されたファイルはない。

fileField.parentNode.insertBefore(newFileField, fileField.nextSibling);

新しいファイルフィールドを元のファイルフィールド直後に挿入します。
"fileField.parentNode"元のファイルフィールドの親要素を取得する。
"insertBefore(newFileField, fileField.nextSiblung"
新しいファイルフィールドを元のファイルフィールドの次の兄弟要素の前に挿入する。
(画像を追加をクリックすると、間にフィールドが増える)

- まとめ
1.ページのDONが完全に読み込まれると、関数が実行される
2.画像を追加ボタンがクリックされると

  • 現在のファイルフィールドを取得
  • クローン作成
  • クローンを元のファイルフィールドの直後に追加される

わかるかーい。

Discussion