我想将用户上传的INI文件内容传输到一个对象,并将该对象数据与现有对象进行比较。 INI文件的示例内容如下所示:
Name: Aesthetic
Author: Redon
CursorCentre: 1
CursorExpand: 0
SliderBallFlip: 0
Combo1: 145,229,103
Combo2: 255,213,128
但是,当我尝试获取对象本身时,它正在工作。但是,当我尝试通过键来获取价值时,它是行不通的。在此示例中,如何通过键获得价值?
$(document).on('change','input[name=import]',function(e){
var settings = {};
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = function(){
var myText = reader.result;
var myText = myText.split(/\r?\n/);
$.each(myText, function(index, val) {
var item = val.split(":");
var itemkey = item[0];
var itemval = $.trim(item[1]);
settings[itemkey] = itemval;
});
}
reader.readAsText(file);
console.log(settings); // Works
console.log(settings['Author']); // undefined
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="file" name="import" accept=".ini">
答案 0 :(得分:1)
就像@connexo建议的那样:这是一个计时问题。在我稍作更改的版本中,我将两个console.log
放在了reader.onload
函数中,并且可以正常工作!
$(document).on('change','input[name=import]',function(e){
var settings = {};
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = function(){
var myText = reader.result;
var myText = myText.split(/\r?\n/);
$.each(myText, function(index, val) {
var item = val.split(":");
var itemkey = item[0];
var itemval = $.trim(item[1]);
settings[itemkey] = itemval;
});
console.log(settings); // really works
console.log(settings['Author']); // works too!
}
reader.readAsText(file);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="file" name="import" accept=".ini">
注意
当我说:“时间问题”时,严格来说这并不是全部事实。对象settings
仅在$('document').on('change'...)
函数内部可用,并且仅在{em>之后{em> reader.onload()
完成其工作。如果要将内容存储在全局变量中(以供以后参考,也许可以通过另一个函数...),则需要将var settings={};
外部您的$('document').on('change'...)
功能,或使用类似window['settings']={};
或window.settings={};
的功能。