[JavaScript]eachメソッドなどで複製したフォームを特定する方法
[JavaScript]eachメソッドなどで複製したフォームを特定する方法:
プレビュー機能(JavaScript)の実装のお話です。
もっと良い方法があるかもしれませんが、
初学者の一つのやり方として大目に見てください。
このような3つ連なった画像投稿フォームがあったとします。
このフォームはtimesメソッドで
これに、JavaScriptでプレビュー機能を追加したいと考えました。
こんな感じに組みましたが画像をフォームにセットすると、、、
当たり前ですが全て同じ要素なので全部に同じ画像がプレビューされてしまいました。
けど複製だからそれぞれクラスなどを直接かけない…。
どうしよう...
複製されたフォームに対してJavaScriptの同じくeach関数で変数付IDを付与して特定します。
スマートではありませんが、
これをセレクタにして、
each関数で
テンプレートリテラルで囲むことで変数が使えます。
無事特定できました!
これで複製されたフォームにもそれぞれプレビューを映すことができます。
テンプレートリテラルって便利ですね!
プレビュー機能(JavaScript)の実装のお話です。
もっと良い方法があるかもしれませんが、
初学者の一つのやり方として大目に見てください。
問題
このような3つ連なった画像投稿フォームがあったとします。このフォームはtimesメソッドで
li.list-group-item
の複製で出来ています。## new.html.haml - 3.times do |i| %li.list-group-item.col-md-4 .image-upload = f.fields_for :captured_images do |image| %img.s-preview = image.file_field = image.hidden_field
## preview.js $(function(){ $('.sub_image_uploader').change(function(e){ var file = e.target.files[0]; var reader = new FileReader(); if(file.type.indexOf("image") < 0){ alert("画像ファイルを指定してください。"); return false; } reader.onload = (function(file){ return function(e){ $(.s-preview).attr("src", e.target.result); $(.s-preview).attr("title", file.name); }; })(file); reader.readAsDataURL(file); }); });
当たり前ですが全て同じ要素なので全部に同じ画像がプレビューされてしまいました。
けど複製だからそれぞれクラスなどを直接かけない…。
どうしよう...
特定しよう
複製されたフォームに対してJavaScriptの同じくeach関数で変数付IDを付与して特定します。## new.html.haml - 3.times do |i| %li.list-group-item.col-md-4 .image-upload.sub_image_uploader = f.fields_for :captured_images do |image| %img.s-preview = image.file_field :content = image.hidden_field :status, value: "sub"
.image-upload
にさらに.sub_image_uploader
というクラスを付け足しました。これをセレクタにして、
li.list-group-item
が複製された分だけ次のeach関数でIDを追加して行きます。## Preview.js //.sub_image_uploaderをそれぞれ特定するためにIDを付与する関数 $(function(){ $('.sub_image_uploader').each(function(i){ i = 1 + i; $(this).attr("id",`image${i}`); }) }) $(function(){ $('.sub_image_uploader').change(function(e){ var file = e.target.files[0]; var reader = new FileReader(); var IdentifiedImg = $(this).children("img") console.log(IdentifiedImg) if(file.type.indexOf("image") < 0){ alert("画像ファイルを指定してください。"); return false; } reader.onload = (function(file){ return function(e){ IdentifiedImg.attr("src", e.target.result); IdentifiedImg.attr("title", file.name); }; })(file); reader.readAsDataURL(file); }); });
id=image${i}
を追加します。テンプレートリテラルで囲むことで変数が使えます。
無事特定できました!
これで複製されたフォームにもそれぞれプレビューを映すことができます。
テンプレートリテラルって便利ですね!
コメント
コメントを投稿