将参数传递给FileReader onload事件
Pass a parameter to FileReader onload event
我需要读取一些csv文件,由用户给出。使用拖放div将文件传递到页面/脚本,该div处理文件拖放,如下所示:
function handleFileDrop(evt) {
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files; // FileList object.
...
}
我需要用csv库解析每个文件,该库将其转换为数组,但我还需要跟踪我当前正在解析的文件名。下面是我用来解析每个文件的代码:
for(var x = 0; x < files.length; x++){
var currFile = files[x];
var fileName = currFile.name;
var reader = new FileReader();
reader.onload = (function(theFile){
return function(e){
var csvArr = CSV.csvToArray( e.target.result, ";", true );
console.log(csvArr);
};
})(currFile);
reader.readAsText(currFile);
}
在此之前,一切都很顺利。我需要的是将文件名传递给reader.onload
事件,例如:
reader.onload = (function(theFile){
return function(e){
***** I need to have fileName value HERE *****
};
})(currFile);
是可能的吗?我该怎么做呢?提前感谢您的帮助,致以最诚挚的问候
尝试如下:
var reader = new FileReader();
reader.onload = (function(theFile){
var fileName = theFile.name;
return function(e){
console.log(fileName);
console.log(e.target.result);
};
})(currFile);
reader.readAsText(currFile);
在这里,每次将文件传递给外部方法时,都要创建一个新的fileName
变量。然后创建一个可以访问该变量(由于闭包)并返回它的函数。
使用Blob API
使用新的File/Blob API可以更容易地完成。
你的第二个代码块——也解决了你的问题——可以重写为:
for (let file of files){
(new Blob([file])).text().then(x=>console.log(file.name,x));
}
Blob API使用promise而不是像Filereader API那样使用Events,所以闭包的麻烦要少得多。此外,箭头函数(x=>)和迭代器for of,使代码更加简洁。
检查支持。
使用Fetch API
同样使用Fetch API响应对象可以更容易地完成。
for (let file of files){
(new Response(file)).text().then(x=>console.log(file.name,x));
}
构造函数中缺少Array []
说明
也检查支持。
相关文章:
- image.onload事件和浏览器缓存
- 无法将java脚本函数与Panel'绑定;s OnLoad事件
- Jquery:如何动态绑定带有onload事件的文本框
- 如何使用body onload事件操作HTML音频标记和JavaScript函数
- “;预加载“;<音频>影响window.onload事件时间
- 如何在动态插入的html文件中使用onload事件
- CRM 2013-引用子记录的Javascript表单警报(onload事件)
- 在Firefox for Android的onload事件中,window.innerWidth的值错误
- 如何在 iFrame 的 onload 事件中执行代码
- 如何使标头动画仅在javascript中显示onload事件(不允许jQuery)
- iframe 中的 onload 事件仅触发一次
- 在文档准备就绪之前,Javascript onload 事件和其他事件
- 使用 onLoad 事件提高前端性能
- 我应该使用window.onload事件吗?
- 尝试在 jquery .load(“myHTML.html”) 上触发正文 'onLoad' 事件
- JavaScript OnLoad 事件不会在 iPhone 上触发
- iframe上的onload事件在IE和Firefox / GoogleChrome中的工作方式不同
- window.onload 事件不会触发或“如何正确初始化 js 项目?”
- 如何使用 onload 事件从 HTML 网站在 Windows 2008 上的文件共享上运行批处理文件
- 为什么我对
“onload”事件处理程序的使用偶尔工作