JavaScript';输入多个';文件复制

JavaScript';输入多个';文件复制,javascript,arrays,file,input,Javascript,Arrays,File,Input,这是我的代码: var rowData = []; var showFiles = function () { var input = document.getElementById('doc-upload'); if (input.files.length > 0) { for (var i = 0; i < input.files.length; i += 1) {

这是我的代码:

        var rowData = [];

        var showFiles = function () {
            var input = document.getElementById('doc-upload');
            if (input.files.length > 0) {
                for (var i = 0; i < input.files.length; i += 1) {
                    rowData.push([input.files[i].name]);
                };
                console.log(rowData);
            };
        };
        document.getElementById('doc-upload').addEventListener('change', showFiles, this);
var rowData=[];
var showFiles=函数(){
var input=document.getElementById('doc-upload');
如果(input.files.length>0){
对于(变量i=0;i
“rowData”在我第一次上传一些东西时收到一个正常值。 在第二次尝试时,它开始复制传入值

如果我先上传了一个文件,试试看就可以了。 第二次我会得到两个相同的文件。 第三个是4个文件,exetera

为什么会这样

UPD:

更多解释: 发生的事情是:我上传x.doc我的数组是[x.doc],现在我想上传y.doc。我选择y.doc,我的数组变成[x.doc,y.doc,y.doc],然后我上传z.doc,Aray看起来像[x.doc,y.doc,y.doc,z.doc,z.doc]。等等它必须用长度属性做一些事情,我把它搞砸了

UPD2:

现在,代码的完整版本为:

    //file upload
    var rowData = [];
    docAddButton.addListener('click', function () {
        var showFiles = function () {
            var input = document.getElementById('doc-upload');
            if (input.files.length > 0) {
                for (var i = 0; i < input.files.length; i += 1) {
                    if (rowData.indexOf(true, input.files[i].name, Math.round(input.files[i].size * 0.001) + ' кб') === -1) {
                        rowData.push([
                            true,
                            input.files[i].name, 
                            Math.round(input.files[i].size * 0.001) + ' кб'
                        ]);
                    }
                }
                console.log(rowData);
                tableModel.setData(rowData);
            };
        };
        document.getElementById('doc-upload').addEventListener('change', showFiles, this);
    });
//文件上传
var rowData=[];
docAddButton.addListener('单击',函数(){
var showFiles=函数(){
var input=document.getElementById('doc-upload');
如果(input.files.length>0){
对于(变量i=0;i
谢谢每一个帮忙的人

解决方案: 您可以从UPD2中看到,我的函数在eventListener“click”中。发生的事情是,每次我按下输入按钮,它都会收到额外的“更改”侦听器


我将.addListener的输入更改为.addListenerOnce。

可能您没有重新加载页面,也没有清除
行数据。您尚未显示如何/在何处定义
rowData
,但似乎在调用
showFiles
之间重用了相同的实例。(如果你在任何地方都没有申报,那你就是受害者。)


从下面的评论中,听起来您想保留
rowData
中的条目,但只想添加新条目。如果是这样,您需要进行明确检查:

var showFiles = function () {
    var input, i, file;

    input = document.getElementById('doc-upload');
    for (i = 0; i < input.files.length; i += 1) {
        file = input.files[i].name;
        if (indexOfFile(rowData, file) === -1) {
            rowData.push([file]);
        }
    };
    console.log(rowData);
};

function indexOfFile(data, file) {
    var index;

    for (index = 0; index < data.length; ++index) {
        // Note that the 0 may need to be changed if the
        // `rowData.push([file])` line above doesn't put
        // the filename at index 0
        if (data[index][0] === file) {
            return index;
        }
    }
    return -1;
}
…然后在
索引办公室中

if (data[index].file === file) {
这样,如果你改变你所推动的内容的结构,代码就不那么容易被破坏。

基本上

rowData.push()
将继续将元素追加到变量的末尾。您需要检查这些输入是否已经存在

(编辑-)

试试这个:-

        rowData=[];
        var showFiles = function () {
        var input = document.getElementById('doc-upload');
        if (input.files.length > 0) {
            for (var i = 0; i < input.files.length; i += 1) {
              var f=[];
              for(var j=0;j<rowData.length;j++)
                 f.push(rowData[j][0]);
              if(f.indexOf(input.files[i].name) == -1)
                  rowData.push([input.files[i].name]);
            }
            console.log(rowData);
        };
    };
    document.getElementById('doc-upload').addEventListener('change', showFiles, this);
rowData=[];
var showFiles=函数(){
var input=document.getElementById('doc-upload');
如果(input.files.length>0){
对于(变量i=0;i对于(var j=0;j“
rowData.push([input.files[i].name]);
“为什么要将文件名作为数组来推呢?我只希望
rowData.push(input.files[i].name);
(no
[
]
围绕
input.files[i].name
)。这是因为我使用的是数组结构。rowData用于设置表的模型,数组是表的一行。我推送的每个下一个数组都将是表中的下一行。[input.files[i].name]中的每个元素都将是下一列。例如[input.files[i].name,input.files[i].size].I jusy删掉了这些内容以在这里显示代码。不,不是这样。在我将它们推到“rowData”后,我会将其显示给用户。用户可能不希望有几个相似的文件。发生的是:我上传x.doc我的数组是[x.doc],现在我想上传y.doc。我选择y.doc,我的数组会转到[x.doc,y.doc,y.doc],然后我上传z.doc,Aray看起来像[x.doc,y.doc,y.doc,z.doc,z.doc,z.doc,z.doc]。等等。它必须对length属性做一些事情,我是如何搞砸的。您是否尝试过我提供的代码?这实际上检查了数组中的多个文件名。您之前的评论表明您多次重复使用推送API。我做了。它的行为相同。如果您不确定从何处开始,请看一下接口的快照在代码中附加了额外的元素,您可以为推送rowData创建一个常规函数,并从所有其他位置调用它将确保只添加一次。我注意到您正在将数组推送到变量而不是普通的文件名字符串。希望您确实相应地修改了检查条件。我在“var rowData=[];”上方声明了它,我使用layer-in代码为我的表模型设置数据。(qooxdoo)@user1869429:那就是问题所在,每次调用
showFiles
时都会重用一个实例。可以在
showFiles
中声明它,也可以将
rowData=[]
showFiles
的开头,在添加新信息之前清除旧信息。Crowde:我真的不能这样做。如果我每次都清除它,我的用户只会看到上次“更改”时上载的文件。但用户可能希望将几个文件上载到同一数组中。你是对的。如果我清除ar在每次改变之前,我想这会很好。只是我不想要
        rowData=[];
        var showFiles = function () {
        var input = document.getElementById('doc-upload');
        if (input.files.length > 0) {
            for (var i = 0; i < input.files.length; i += 1) {
              var f=[];
              for(var j=0;j<rowData.length;j++)
                 f.push(rowData[j][0]);
              if(f.indexOf(input.files[i].name) == -1)
                  rowData.push([input.files[i].name]);
            }
            console.log(rowData);
        };
    };
    document.getElementById('doc-upload').addEventListener('change', showFiles, this);