0

I am trying to make some upload image function with preview, I push the image URL to the array and put the if condition to avoid uploading more than 1 image, and empty the array when I delete the image preview.
But I have some issue, when I pick some images let say image A and deleted it the preview box, it should be able to choose image A in the next step, but it can't, unless I choose another image with the different name, here is my code below :

var arrCover = [];
var arrIm = [];

function uploadBanner(arr, prefix) {
    var cover;
    if(arr === 'coverBanner'){
        cover = ($('.campaign-cover-image'))[0].files[0];
        arr = arrCover;
    }else {
        cover = ($('.campaign-im-image'))[0].files[0];
        arr = arrIm;
    }

    if (cover) {
        var reader = new FileReader();
        reader.onload = function (e) {
            const image = e.target.result;
            arr.push(image);
            if(arr.length < 2){
                var imgs = $(`
                    <div class="campaign-cover-image${prefix}">
                    <img class="image-cover${prefix}" 
                    src=${arr.slice(-1)}>
                    </div>`);
                var removeIcon = $(`<div class="delete-cover${prefix}">x</div>`);
                $('.campaign-cover' + prefix).append(imgs);
                $('.campaign-cover-image' + prefix).append(removeIcon);
            } else {
                alert('only 1 image');
            }
        };
        reader.readAsDataURL(cover);
    }

    $(document.body).on('click','.delete-cover' + prefix, function(){
        if(prefix === "-banner"){
            var prevImg = $('.image-cover' + prefix).attr('src');
            arrCover.filter(function(el){
                var prevArr =  el === prevImg;
                if(prevArr){
                    arrCover = [];
                    $('.campaign-cover-image'+ prefix).val('');
                }
            });
            $(this).closest('.campaign-cover-image' + prefix).remove();
        }
    });
}
$(document).ready(function(){
  uploadBanner();
});
#upload_button {
  display: inline-block;
}
#upload_button input[type=file] {
  display:none;
}
.btn {
  border: 1px solid black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <div class="campaign-cover-banner"></div>
  <div id="upload_button">
    <label>
      <input
        type="file"
        class="campaign-cover-image"
        onchange="uploadBanner('coverBanner','-banner');"
      /><br>
    <span class="btn btn-primary">Add image1</span>
    </label>
  </div>
  
  <div class="campaign-cover-im"></div>
  <div id="upload_button">
    <label>
      <input
        type="file"
        class="campaign-im-image"
        onchange="uploadBanner('imBanner','-im');"
      /><br>
      <span class="btn btn-primary">Add image2</span>
    </label>
</div>
</body>
</html>
Bipon Biswas
  • 11,397
  • 1
  • 26
  • 37
Riantori
  • 317
  • 1
  • 4
  • 14

1 Answers1

-1

It's a bit hacky but you could try to refresh your dom.

worker works great !

Force DOM refresh in JavaScript

Fabien Greard
  • 1,854
  • 1
  • 16
  • 26