Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从多个文件输入预加载图像_Javascript_Input_Preload - Fatal编程技术网

Javascript 从多个文件输入预加载图像

Javascript 从多个文件输入预加载图像,javascript,input,preload,Javascript,Input,Preload,我找到了一种在上传前预加载图像的方法,但我有不止一个文件输入。我想为每个输入文件预加载图像。一般来说,这不是一个大问题,但网站上使用的文件输入量并不稳定。一个用户可以添加一个上传图像块,这样他可以添加2或3个,我想为每个他广告的可能性预加载图像。 但是我的经验没有达到它所需要的水平。 那么我的问题是,有可能实现它吗? 我为一个特定文件输入预加载图像的代码如下: function readURL(input) { if (input.files && i

我找到了一种在上传前预加载图像的方法,但我有不止一个文件输入。我想为每个输入文件预加载图像。一般来说,这不是一个大问题,但网站上使用的文件输入量并不稳定。一个用户可以添加一个上传图像块,这样他可以添加2或3个,我想为每个他广告的可能性预加载图像。 但是我的经验没有达到它所需要的水平。 那么我的问题是,有可能实现它吗? 我为一个特定文件输入预加载图像的代码如下:

    function readURL(input) {
          if (input.files && input.files[0]) {
                    var reader = new FileReader();
                    reader.onload = function (e) {
                              $('#blah')
                                        .attr('src', e.target.result)
                                        .height(50);
                    };
                    reader.readAsDataURL(input.files[0]);
          }
}
如果用户添加一个图像块,则其外观如下所示:

<div id="divImage-1" class="form-group form-file-upload">
<label id="labelImage-1" for="labelImage2-1">New Picture</label>
<div></div>
<label id="labelImage2-1" for="inputImage-1" class="form-file-upload1">Upload Image</label>
<input id="inputImage-1" type="file" onchange="readURL(this);">
<img id="blah" height="50" alt="Image preview">
</div>

新图片
上传图像

如果用户创建第二个ID,则所有ID ae计数为2(divImage-2)。

让我们在HTML中假设这一点

<button class="btn btn-primary" id="addBtn">Add Image Block</button>

<div class="container"></div>
现在,对于添加的每个文件输入,您需要附加一个on change侦听器:

   let currentBlockCount = imageBlockCount;
    $("#photos-" + imageBlockCount).on("change", function () {
      let input = this;

      if (!input.files) {
        return;
      }

      //for every image that has been read by FileReader we show it
      //in its own card inside its button gallery
      let onFileLoaded = function (event) {
        $(
          $.parseHTML(
            `<div class="col-sm-3">
                <div class="card">
                  <img 
                    class="card-img-top" 
                    src="${event.target.result}">
                </div>
              </div`
          )
        ).appendTo("#gallery-" + currentBlockCount);
      };

      //input.files is an array like object, so we convert it to array
      Array.from(input.files)
        .filter(
          //first we filter images which are already in use
          (file) => !addedPicSet.has(file.name)
        )
        .forEach((file) => {
          let reader = new FileReader();
          //we attach an onLoad listener for each reader
          reader.onload = onFileLoaded;

          //then we tell the reader object which file to read
          reader.readAsDataURL(file);

          //add the image name in the set of used image names
          addedPicSet.add(file.name);
        });
    });
让currentBlockCount=imageBlockCount;
$(“#照片-”+imageBlockCount)。打开(“更改”,函数(){
让输入=这个;
如果(!input.files){
返回;
}
//对于FileReader读取的每个图像,我们都会显示它
//在其按钮库中的自己的卡中
设onFileLoaded=函数(事件){
$(
$.parseHTML(
`
!addedPicSet.has(文件名)
)
.forEach((文件)=>{
let reader=new FileReader();
//我们为每个读卡器附加一个onLoad侦听器
reader.onload=未加载;
//然后我们告诉阅读器对象要读取哪个文件
reader.readAsDataURL(文件);
//在已使用的图像名称集中添加图像名称
addedPicSet.add(文件名);
});
});

我还为您制作了一支笔:

是的,您所做的很好,我在发布之前就发现了。但问题是,我可以为一个输入上载两个图像,但我有两个输入,每个图像都应该预渲染。这是我要实现的问题。所以,您是说可以有多个输入按钮来添加图片?a我说的对吗?你需要检查他们中是否有人再次上传相同的图片并跳过该图片吗?是的,我希望用户单击“+图片”和包含上面显示的图像块的块将被创建。因此,如果用户创建2个块,那么它们是2个文件类型的输入。脚本应该为图像的每一个输入量预加载。因此,如果用户单击/添加5个图像块,则有5个输入,并且所有这些输入都应该预加载用户尝试上载的图像。好吗非常感谢你,如果它能帮助你,你可以看到上面的类或ID是如何被称为数字1将为用户添加的每个输入块计数,请检查,如果这是你正在寻找的。
   let currentBlockCount = imageBlockCount;
    $("#photos-" + imageBlockCount).on("change", function () {
      let input = this;

      if (!input.files) {
        return;
      }

      //for every image that has been read by FileReader we show it
      //in its own card inside its button gallery
      let onFileLoaded = function (event) {
        $(
          $.parseHTML(
            `<div class="col-sm-3">
                <div class="card">
                  <img 
                    class="card-img-top" 
                    src="${event.target.result}">
                </div>
              </div`
          )
        ).appendTo("#gallery-" + currentBlockCount);
      };

      //input.files is an array like object, so we convert it to array
      Array.from(input.files)
        .filter(
          //first we filter images which are already in use
          (file) => !addedPicSet.has(file.name)
        )
        .forEach((file) => {
          let reader = new FileReader();
          //we attach an onLoad listener for each reader
          reader.onload = onFileLoaded;

          //then we tell the reader object which file to read
          reader.readAsDataURL(file);

          //add the image name in the set of used image names
          addedPicSet.add(file.name);
        });
    });