Javascript 清除以前拖动的文件条目?
我有下面的脚本,我想用来上传文件。它的工作很好,但我有困难试图找出为什么每次我上传一个新的文件,以前的文件被拖动也存在。由于程序的异步性,我在调试这个时遇到了麻烦 小提琴: 代码:Javascript 清除以前拖动的文件条目?,javascript,google-chrome,drag-and-drop,promise,Javascript,Google Chrome,Drag And Drop,Promise,我有下面的脚本,我想用来上传文件。它的工作很好,但我有困难试图找出为什么每次我上传一个新的文件,以前的文件被拖动也存在。由于程序的异步性,我在调试这个时遇到了麻烦 小提琴: 代码: var dndbox=$(“.dndbox”)[0]; dndbox.addEventListener(“dragenter”,函数(e){ e、 停止传播(); e、 预防默认值(); },假); dndbox.addEventListener(“dragover”,函数(e){ e、 停止传播(); e、 预防
var dndbox=$(“.dndbox”)[0];
dndbox.addEventListener(“dragenter”,函数(e){
e、 停止传播();
e、 预防默认值();
},假);
dndbox.addEventListener(“dragover”,函数(e){
e、 停止传播();
e、 预防默认值();
},假);
dndbox.addEventListener(“删除”,函数(e){
e、 停止传播();
e、 预防默认值();
var itemList=e.dataTransfer.items;
var fp=[];
变量遍历=函数(条目)
{
if(entry.isFile){
entry.file(函数(文件){
var filepromise=新承诺(函数(res,rej){
res(文件);
});
fp.push(文件承诺);
});
}else if(entry.isDirectory){
var dR=entry.createReader();
dR.readEntries(函数(条目){
对于(变量i=0;i
每次我上传一个新文件时,之前拖动的文件也会出现
这不是由于遍历的异步特性造成的,与承诺没有多大关系。这是由于这种结构:
// left away some irrelevant callbacks
dndbox.addEventListener("drop", function(e) {
var fp = [];
// add entries to fp
$(".prompt").on("click", function() {
console.log(fp);
});
}, false);
如您所见,每次删除某个内容时,您都会创建一个新列表,并将侦听器添加到(从现在开始的每次单击都会记录该列表的)元素中。要解决该问题,您可以:
- 仅使用一个全局列表,如果发生新的删除事件,该列表将被覆盖
- 为每个要记录的列表创建一个新的
.prompt
元素
- 在启动侦听器后卸载它,以便不再触发它。您可以使用jQuery来实现这一点
除此之外,你使用承诺的方式非常奇怪(更不用说是错误的)collection
是使用仍然为空的fp
数组立即解析的承诺列表。幸运的是,当触发单击
回调时,所有文件都被读入。尽管如此,每个pa
都会得到==fp
,因此您在fp
中记录每个项目的次数与itemList
的长度相同
请看一看并了解如何正确地执行此操作。在你的情况下,它会像
function traverse(entries)
var collection = [];
for (var i=0; i<entries.length; i++) {
var entry = entries[i];
if (entry.isFile) {
collection.push(new Promise(function(res, rej) {
entry.file(res);
}));
} else if (entry.isDirectory){
collection.push(new Promise(function(res, rej) {
var dR = entry.createReader();
dR.readEntries(res);
}).then(traverse));
}
}
return Promise.all(collection).then(function(results) { // flatten
return [].concat.apply([], results);
});
}
var entries = [];
for(var i = 0; i < itemList.length; i++)
entries[i] = itemList[i].webkitGetAsEntry();
traverse(entries).then(function(fp) {
$(".prompt").show().one("click", function() {
$(this).hide();
fp.forEach(console.log, console);
});
});
函数遍历(条目)
var集合=[];
对于(var i=0;我知道……谢谢。这看起来是一个很大的头痛问题。我理解,但我觉得我需要花很长时间才能弄明白。我想我只是需要习惯使用承诺。这是我第一次需要这么多承诺。我希望我能给你小费,喝点比特币/狗币之类的东西!再次感谢你!
function traverse(entries)
var collection = [];
for (var i=0; i<entries.length; i++) {
var entry = entries[i];
if (entry.isFile) {
collection.push(new Promise(function(res, rej) {
entry.file(res);
}));
} else if (entry.isDirectory){
collection.push(new Promise(function(res, rej) {
var dR = entry.createReader();
dR.readEntries(res);
}).then(traverse));
}
}
return Promise.all(collection).then(function(results) { // flatten
return [].concat.apply([], results);
});
}
var entries = [];
for(var i = 0; i < itemList.length; i++)
entries[i] = itemList[i].webkitGetAsEntry();
traverse(entries).then(function(fp) {
$(".prompt").show().one("click", function() {
$(this).hide();
fp.forEach(console.log, console);
});
});