LoginSignup
0
0

More than 5 years have passed since last update.

JQueryを使わないプレビュー表示できるイメージアップローダー修正版【複数対応】

Last updated at Posted at 2019-04-04

以前投稿したやつの改訂版
https://qiita.com/ketabawo/items/1f40283e2d64c283d13b
上記コードは同一ページ内に複数のアップローダーがあると動かないという欠陥があり、業務中にその欠陥に遭遇したので改良したものを投稿しておきます。

rails simple_formを使ってます。

.imageUploader{onclick: "buttonClick('HUGAHUGA')"}
  .imageUploader__preview
    - if f.object.HOGEHOGE.present?
      = image_tag "#{f.object.HOGEHOGE.retina}"
      %p.change 画像を変更する
    - else
      %p.upload 画像を選ぶ
= f.input :HOGEHOGE, label: false, input_html: {onchange: 'imageUploader(event)'}

function buttonClick(targetNode){
  document.getElementById(targetNode).click();
};
function imageUploader(e){
  var imageFile = e.target.files[0];
  var reader = new FileReader();
  var imageScreen = e.target.parentNode.previousElementSibling.querySelector('.imageUploader__preview');
  var imageTag = e.target.parentNode.previousElementSibling.querySelector('.imageUploader__preview img');
  if(imageTag != null){
    imageScreen.removeChild(imageTag);
  }
  reader.onload = function(){
    var img = document.createElement('img');
    img.setAttribute('src', reader.result);
    imageScreen.appendChild(img);
  };
  reader.readAsDataURL(imageFile);
};

画像タグをどこに出力させるかのアクセス先がおかしかったので、それぞれのinput type='file'の位置から辿って正しい場所を指定。
ご利用の際はHTML構成が異なるはずなので適宜変更してください。

var imageScreen = e.target.parentNode.previousElementSibling.querySelector('.imageUploader__preview');
var imageTag = e.target.parentNode.previousElementSibling.querySelector('.imageUploader__preview img');

これでテストした限りだと正常に動作しているのでOKかとは思いますが、なにせ僕が書いたコードなのでアテになりませんwww

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0