我正在尝试从一个简单地包含以下内容的json文件中读取: [3000,2500,6000,2200,5000,1300。它保存为data.txt。在我的代码中,我创建了一个空数组作为第一步。然后我将一个函数传递给$ .getJSON函数,该函数读取data.txt文件的内容。然后我读取JSON数组中的每个项目并将其推送到我之前创建的空数组。当我尝试打印数组的第一个元素arr [0]时,我得到了未定义。如果我放置document.write(arr [0]);在最后一个括号之前的表达式,它给了我正确的答案,3000,但我需要它在外面。为什么会这样?
arr=[];
$.getJSON('data.txt',function(data) {
for (var i in data){
arr.push(data[i]);
}
});
document.write(arr[0]);
答案 0 :(得分:0)
getJSON
是异步的。任何依赖于它获取的数据的东西必须放在成功回调中(或者在所述回调调用的函数中)。
因此,您将无法使用document.write()
,因为该文档已经加载。
相反,请将arr.push(data[i])
替换为一些代码,以便将data[i]
正确添加到文档中,例如将其放在文本节点中并将其附加到正文中。
var x = new XMLHttpRequest();
x.open("GET","data.txt",true);
x.onreadystatechange = function() {
if( this.readyState == 4 && this.status == 200) {
var r = window.JSON ? JSON.parse(this.responseText) : eval("("+this.responseText+")"),
node, i;
for( i in data) {
node = document.createTextNode(data[i]);
document.body.appendChild(node);
}
}
};
x.send();
答案 1 :(得分:0)
不要使用for...in
语法迭代数组。这是迭代对象属性的语法,这不是你想要的。
只需使用for
循环:
for (var i = 0; i < data.length; i++) {
}
AJAX是异步的,因此在arr
被调用后定义document.write()
。如果您想使用该值,请在getJSON
回调中执行此操作。