前提・実現したいこと
Ruby on Rails
にて、複数の画像をアップロード出来るページ(users/edit.html.erb
)を作成致しました。アップロードの機能自体は既に実装出来ています。
ここからこちらのページを参考に、選択されたファイルサイズが1MB以上である場合はアラートを表示させるコードを記述しました。
要素の取得にgetElementById
を使った場合は問題なくアラートが表示されました。
ただ今回は画像が複数存在するためquerySelectorAll
に変えて試してみたのですが、うまくアラートが表示されません。
該当のソースコード
アップロードしたい複数の画像に関する記述。
users/edit.html.erb
Rails
1<input name="image" type="file" accept=".png, .jpg, .jpeg, .gif" id="file_photo" class="file_photo" style="display:none;"> 2 3<input name="cover_image" type="file" accept=".png, .jpg, .jpeg, .gif" id="file_photo" class="file_photo2" style="display:none;">
以下はまずgetElementById
で試したコードです。
file.js
js
1$(document).on('turbolinks:load', function () { 2 const sizeLimit = 1024 * 1024 * 1; 3 const fileInput = document.getElementById('file_photo'); // 問題の行。 4 const handleFileSelect = () => { 5 const files = fileInput.files; 6 for (let i = 0; i < files.length; i++) { 7 if (files[i].size > sizeLimit) { 8 alert('File size must be less than 1 MB.'); 9 fileInput.value = ''; 10 return; 11 } 12 } 13 } 14 fileInput.addEventListener('change', handleFileSelect); 15});
idは当然一つしか取得できませんので、一つ目の画像選択時にはアラートが表示されますが、二つ目の画像選択時にはアラートが表示されません。
次に他の記述はそのままに、問題の行のみquerySelectorAll
に書き換えてみました。
file.js
js
1 const fileInput = document.querySelectorAll('.file_photo, .file_photo2'); // 問題の行。
しかし二つ目の画像どころか一つ目の方にもアラートが表示されなくなってしまいました。
どこかコードに間違いがありますでしょうか。どなたかご助言を頂けますと有難いです。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3
jquery 1.12.4
追記
ご指摘の通りid
とclass
の使い方が逆になっておりましたので、下記の様に訂正いたします。
users/edit.html.erb
Rails
1<input name="image" type="file" accept=".png, .jpg, .jpeg, .gif" id="file_photo" class="file_photo" style="display:none;"> 2 3<input name="cover_image" type="file" accept=".png, .jpg, .jpeg, .gif" id="file_photo2" class="file_photo" style="display:none;">
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。