JavaScript'输入倍数'文件复制

JavaScript 'input multiple' file duplication

本文关键字:文件 复制 输入 JavaScript      更新时间:2023-09-26

这是我的代码:

        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);

"rowData"在我第一次上传东西时收到一个正常值。在第二次尝试时,它开始复制传入的值。

如果我先上传了一个文件,那没关系。第二次我会得到两个相同的文件。第三个4个文件,exetera。

为什么会发生这种情况?

UPD:

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

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);
    });

感谢每一位帮助过我们的人!

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

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

假设您没有重新加载页面,也没有清除rowData。您还没有展示如何/在哪里定义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;
}

旁注:你说过,你之所以推送一个数组,而不仅仅是文件名,是因为你在这个数组中还包括其他信息,但你没有考虑。这很好,但可能很微妙,请参阅我上面关于索引0的注释。您可以考虑使用对象数组:

rowData.push({
    file: file,
    other: "info",
    goes: "here"
});

然后在indexOfFile:中

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);