【问题标题】:Undefined file in javascript array when grabbing files from an input type="file" tag从输入类型=“文件”标签中获取文件时,javascript数组中的未定义文件
【发布时间】:2015-07-01 14:15:04
【问题描述】:

我在从输入标签中抓取图像时遇到了这个非常奇怪的问题,我不知道为什么。代码如下:

var files,
    fileCounter = 0,
    fileArray = [];

$("#fc").on("change", function() {
    files = $("#fc")[0].files;
    console.log(files);
    for (var i = 0; i < files.length; i++) {
        fileArray[fileCounter] = files[fileCounter];
        fileCounter++;
        console.log(fileArray);
    }
});

html 很简单:

<input type="file" id="fc" multiple="multiple" />

fileArray 应该在我添加时抓取每个图像,但在将文件列为“未定义”之前它只会抓取 2 个。不知道为什么。

【问题讨论】:

  • alert.log是什么意思????
  • 尝试做文件 = $("#fc").get(0).files[0];
  • @JqueryKing 那是一个console.log,我什至不知道它是怎么改变的。
  • @man_luck 这行不通。 $('identifier')[0].files 是使用 jquery 获取文件的正确方法,就像我说的那样,它可以正常工作,直到它超过 2 个文件。它仍在抓取数据,只是不知道它是什么。

标签: javascript jquery html html5-filesystem


【解决方案1】:

您在后续添加 fileArray 时遇到的问题源于您在作业中的索引值:

fileArray[fileCounter] = files[fileCounter];

因为fileCounter 本质上是fileArray 的长度,所以在第一个循环之后任何后续添加都会导致fileCounter 从大于0 的值开始。因此,当您尝试将files[fileCounter] 分配给@987654327 @,您选择的索引大于 0,这对于单个文件数组意味着您正在引用未定义的元素。

也就是说,您实际上并不需要那些计数器,而只需要数组:

var fileArray = [];

$("#fc").on("change", function() {
  var files = $("#fc")[0].files;
  console.log(files);
  for (var i = 0, len = files.length; i < len; i++) {
    fileArray.push(files[i]);
    console.log(fileArray);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="fc" multiple="multiple" />

您甚至可以使用concatslice 进一步简化此过程:

var fileArray = [];

$("#fc").on("change", function() {
  var files = $("#fc")[0].files;
  console.log(files);
  // convert `files` to an array and concat it to `fileArray`
  fileArray = fileArray.concat(Array.prototype.slice.call(files));
  console.log(fileArray);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="fc" multiple="multiple" />

【讨论】:

  • 这个问题是我需要长期保存这些文件,而“i”将继续重置为 0,替换数组中那个位置的内容。我的代码在 fileCounter 达到 2 之前确实有效,也就是它开始说它正在提取未定义的数据。如果我最初的问题中没有明确这一点,我深表歉意。
  • @TylerSears 这个解决方案确实有效。 fileArray 将保留所有选定的文件,同时临时 files 仅在将新选定的文件推送到 fileArray 时使用。您可以通过单击“运行代码 sn-p”来尝试解决方案。
  • 你是对的,我只是看错了你的代码。我很抱歉。感谢您的解决方案!
猜你喜欢
  • 2016-12-11
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 2019-02-16
  • 2015-04-09
  • 1970-01-01
相关资源
最近更新 更多