【发布时间】:2016-06-15 18:04:48
【问题描述】:
我找到了许多关于从本地文件读取纯文本并将该文本显示到网页元素上的 JavaScript 教程,但我似乎无法找到如何将数据保存到可以从我的其他部分访问的数组中脚本。
如果我尝试将文件中的文本分配给 FileReader.onload() 方法内的全局变量,我无法在方法外访问它。有什么建议吗?
以下代码适用于我正在与学生一起使用课程、学生和教师的本地文件的学校时间表项目。我有一个文件输入元素定义为:
<input type="file" id="courseFile" onchange="School.addCourses(event);">
那么我的 School 构造函数包括以下数组和方法:
function School (name) {
this.courses = [];
this.students = [];
this.teachers = [];
this.addCourses = function (event) {
var fileInput = event.target;
var r = new FileReader();
r.readAsText(fileInput.files[0]);
r.onload = function (e) {
var text = r.result;
var array = text.split("\n");
document.getElementById("courseList").innerHTML = text;
this.courses = array;
}
}
}
文本被加载到text,然后拆分为array,甚至会显示在页面上courseList元素中,但它不会将数据复制到this.courses中。
【问题讨论】:
-
this里面的函数和外面的this不一样。您要么必须使用全局引用,要么使用bindstackoverflow.com/questions/2236747/… -
对不起,我缺乏理解。通过全局引用,您是指下面 MISJHA 提供的解决方案——使用文字对象名称,如
School.course?而且我不明白在这种情况下如何使用bind()方法。你能给我多一点指导吗? -
非常感谢!!我仍然不知道我是否真的了解
bind()方法的工作原理,但是您解决了我的问题!知道你让别人很开心,请休息一天! -
Derek,bind 所做的是为函数内部的
this变量设置一个新值。通常,事件处理程序会将this设置为触发事件的对象。因此,在您的情况下,当您在处理程序中设置this.courses时,您实际上是在创建一个与this关联的新对象,即input对象。使用bind(),外部函数中的this被保留。
标签: javascript file bind local filereader