javascript - 如何防止多次拖放图像文件重复

标签 javascript jquery html css

我的拖放图像文件中有 3 个 div,文件名是数组,我使用类调用它,然后循环它。我的问题是当我尝试将图像文件放在特定的 div 中时,这 3 个 div 之一,它会将图像复制到所有剩余的 div。我如何防止这种情况并允许我只将图像放在我选择的 div 中?

这是我的代码 https://jsfiddle.net/qm9nkco7/2/

HTML

<div class="sideBar_paddIT">
<input type="file" name="file_name[]" class="file_class" id="file_id0">
<div class="drag_here">
   <div class="drag_me" id="drag_me_id">
    <img class="img_here" src="" width="100%" >

    <center class="center_html">
      Click or Drag image here
    </center>

  </div>
 </div>
</div>

<div class="sideBar_paddIT">
<input type="file" name="file_name[]" class="file_class" id="file_id0">
<div class="drag_here">
<div class="drag_me" id="drag_me_id">
  <img class="img_here" src="" width="100%" >

  <center class="center_html">
    Click or Drag image here
  </center>

</div>
</div>
</div>

<div class="sideBar_paddIT">
<input type="file" name="file_name[]" class="file_class" id="file_id0">
<div class="drag_here">
<div class="drag_me" id="drag_me_id">
  <img class="img_here" src="" width="100%" >

  <center class="center_html">
    Click or Drag image here
  </center>

</div>
</div>
</div>

JS

$(document).on('click','.drag_me', function(){
    $('.file_class').trigger('click');
});


var imageLoader = document.getElementsByName('file_name[]');
for(var i= 0; i < imageLoader.length; i++){
    imageLoader[i].addEventListener('change', handleImage, false);
}


function handleImage(e) {
    e.stopPropagation();
    e.preventDefault();


    if(e.target.files.length === 0){
        return false;
    }
    var reader = new FileReader();
    reader.onload = function (event) {
        $('.drag_me .img_here').attr('src',event.target.result);
    }

    var taste_it = e.target.files[0];

    var file_name = taste_it.name;
    var file_size = taste_it.size;
    var file_type = taste_it.type;
    if(!check(file_type)){
        $('.trigger_danger_alert_changable').show().delay(5000).fadeOut();
        $('#palitan_ng_text').html('Invalid file format');
        return false;
    }
    if(file_size > 1500000){
        $('.trigger_danger_alert_changable').show().delay(5000).fadeOut();
        $('#palitan_ng_text').html('File size too large');
        $('.file_class').val(''); // <-- kaya d nag aalert dahil may laman,
        return false;
    }else{

             reader.readAsDataURL(e.target.files[0]);
                 $('.center_html').hide();
                 $('.image_name').html(file_name).css({'font-size' : '14px', 'color' : 'black'});

    }
 }

var obj = $('.drag_me');

obj.on('dragover', function(e){
    e.stopPropagation();
    e.preventDefault();
    $(this).css('border', '2px solid #39ADCD');

});



obj.on('drop', function(e){
   e.stopPropagation();
   e.preventDefault();
   $(this).css('border', '2px dotted #39ADCD');

   var files = e.originalEvent.dataTransfer.files;
   var file = files[0];

   var file_name = file.name;
   var file_size = file.size;
   var file_type = file.type;
if(!check(file_type)){
    $('.trigger_danger_alert_changable').show().delay(5000).fadeOut();
    $('#palitan_ng_text').html('Ivalid file format');
    return false;
}

if(file_size > 1500000){
    $('.trigger_danger_alert_changable').show().delay(5000).fadeOut();
    $('#palitan_ng_text').html('File size too large');
    return false;
}else{


            for(var i = 0; i<imageLoader.length; i++){
                imageLoader[i].files = files;
            }   
            $('.center_html').html(file_name).css({'font-size' : '14px', 'color' : 'black'});




}

});
function check(image){
    switch(image){
       case 'image/jpeg':
       return 1;
        case 'image/jpg':
       return 1;
       case 'image/png':
        return 1;
        case 'image/gif':
        return 1;
       default:
       return 0;
  }
 }

任何人都可以帮助我

最佳答案

  1. 不要使用相同的 id s 用于多个元素
  2. <center>标签已弃用。使用 style="text-align: center;" ,最好是在类里面。

现在进入您的实际问题,它由两部分组成:


$('.drag_me .img_here').attr('src', event.target.result);

这一行分配 event.target.resultsrc每个 .drag_me .img_here 的属性元素。


$(document).on('click','.drag_me', function(){
    $('.file_class').trigger('click');
});

这会导致点击任何 .drag_me触发对每个 .file_class 的点击的元素元素。


这两个问题都可以通过不使用相同的 id 来解决。 s 用于不同的元素,然后引用那些 id s 指定要定位的单个元素:

HTML:注意新的 id .drag_me 的小号和 .file_class元素

<div class="sideBar_paddIT">
  <input type="file" name="file_name[]" class="file_class" id="file_id_0">
  <div class="drag_here">
    <div class="drag_me" id="drag_me_id_0">
      <img class="img_here" src="" width="100%">

      <center class="center_html">
        Click or Drag image here
      </center>

    </div>
  </div>
</div>

<div class="sideBar_paddIT">
  <input type="file" name="file_name[]" class="file_class" id="file_id_1">
  <div class="drag_here">
    <div class="drag_me" id="drag_me_id_1">
      <img class="img_here" src="" width="100%">

      <center class="center_html">
        Click or Drag image here
      </center>

    </div>
  </div>
</div>

<div class="sideBar_paddIT">
  <input type="file" name="file_name[]" class="file_class" id="file_id_2">
  <div class="drag_here">
    <div class="drag_me" id="drag_me_id_2">
      <img class="img_here" src="" width="100%">

      <center class="center_html">
        Click or Drag image here
      </center>

    </div>
  </div>
</div>

JavaScript:见评论 /**** ... ****/

$(document).on('click', '.drag_me', function(ev) {
  /**** Get the specific element using the number in the id attribute ****/
  var idNum = $(this).attr('id').split('_')[3];
  $('.file_class').eq(idNum).trigger('click');
});


var imageLoader = document.getElementsByName('file_name[]');
for (var i = 0; i < imageLoader.length; i++) {
  imageLoader[i].addEventListener('change', handleImage, false);
}


function handleImage(e) {
  e.stopPropagation();
  e.preventDefault();

  /**** Get the current input field by using the number in the id attribute ****/
  var currentInput = e.target.id.split('_')[2];

  if (e.target.files.length === 0) {
    return false;
  }
  var reader = new FileReader();
  reader.onload = function(event) {
    /**** Use the current input field instead of all the input fields ****/
    $('#drag_me_id_' + currentInput + ' .img_here').attr('src', event.target.result);
  }

  var taste_it = e.target.files[0];

  var file_name = taste_it.name;
  var file_size = taste_it.size;
  var file_type = taste_it.type;
  if (!check(file_type)) {
    $('.trigger_danger_alert_changable').show().delay(5000).fadeOut();
    $('#palitan_ng_text').html('Invalid file format');
    return false;
  }
  if (file_size > 1500000) {
    $('.trigger_danger_alert_changable').show().delay(5000).fadeOut();
    $('#palitan_ng_text').html('File size too large');
    $('.file_class').val(''); // <-- kaya d nag aalert dahil may laman,
    return false;
  } else {

    reader.readAsDataURL(e.target.files[0]);
    $('.center_html').hide();
    $('.image_name').html(file_name).css({
      'font-size': '14px',
      'color': 'black'
    });

  }
}

/** Rest of the code is unchanged **/

See New Fiddle Here

关于javascript - 如何防止多次拖放图像文件重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39184378/

相关文章:

html - 使用 Bootstrap 将两列居中

javascript - 选择器链

javascript - 为什么这个私有(private)方法在构造函数中?

javascript - 数组字符串在 child_process.exec 的循环中返回为未定义

javascript - 如何为 id 验证编写正则表达式(JavaScript)?

javascript - 通过多次使用 switchClass 使类相互淡化

javascript - 将元素属性传递给 JQuery 事件

html - 如何阻止文本框解释以 HTML 形式输入的信息

html - 如何在DIV中获取按钮而不调用<div>点击事件

java - 服务器错误消息的正确正则表达式