我发现了许多类似于我的问题;但我看到的答案似乎都不适合我。所以这是我的问题。我正在使用jQuery JSONP来获取一些书籍上的相当多的信息(JSON是静态的,所以它有一个硬编码的功能)。我的工作很棒。我的问题是我需要多次引用JSON并且它是静态的我想我需要设置一个带有值的本地数组。所以这是我的代码:
function changeList(cat) {
getList(cat);
}
var bookArray = new Array();
function parseResponse(jsonData) {
$('#bookList').empty();
var items = [];
var p = '0';
$.each(jsonData, function(item, i) {
bookArray[p] = { 'bookId':i.bookId, 'category':i.category, 'publishedDate':i.publishedDate, 'title':i.title, 'description':i.description, 'images':i.images };
var allImages = i.images;
if(allImages.length > 1) {
var imageLoc = allImages.toString().split(",");
} else {
var imageLoc = new Array(allImages);
}
var theDate = new Date();
theDate.setTime(i.publishedDate * 1000);
var year = theDate.getUTCFullYear();
var month = theDate.getUTCMonth();
var day = theDate.getUTCDate();
var d = months[month] + " " + day + ", " + year;
items.push('<li><a href="/' + i.category + '/' + i.bookId + '/index.html"><img border="0" height="70" width="124" src="' + imageLoc[0] + '"><p>Published: <strong>' + d + '</strong><br /><span class="bookTitle">' + i.title + '</span> ' + i.description + '</p></a></li>');
p++;
});
$('<ul/>', {
html: items.join('')
}).appendTo('#bookList');
}
function getList(section) {
$.getJSON('http://www.otherdomain.com/book_'+ section +'.json?format=jsonp&callback=?', function(data) { });
}
上面代码片段的作用是从页面上的某个cateogry中吐出一系列书籍。左边有一个菜单,它有类别并触发changeList()函数(它会触发其他函数来绘制正确的json并在页面上吐出它们)。这部分完美无缺!
这让我想到了我的问题,正如你在parseResponse()函数中看到的那样,我正在填充我创建的'bookArray'数组。如果我在函数内引用该数组,我没有问题。但是,如果我尝试在外面引用它(例如alert(bookArray [0] ['title']),我知道它是未定义的。我做错了什么?我不是最技术的人,所以你有在我身上使用小字。感谢您的帮助!
修改 这是一个片段,可以让您了解JSON文件的外观:
parseResponse(
[{
"bookId":"1",
"category":"A",
"publishedDate":"1266870137",
"title":"Title to first story",
"description":"The first story.",
"images":["http://www.otherdomian.com/books/fff.jpg","http://www.otherdomian.com/books/aaa.jpg"]
},{
"bookId":"2",
"category":"A",
"publishedDate":"1366870142",
"title":"Title to second story",
"description":"The second story.",
"images":["http://www.otherdomian.com/books/fff.jpg","http://www.otherdomian.com/books/aaa.jpg"]
}
])
答案 0 :(得分:0)
也许因为p被定义为字符串p='0'
。试试p=0;
答案 1 :(得分:0)
这第一位不是你问题的答案,但你认为你的jQuery.each()参数是错误的,因为'i'应该是你的索引而'item'应该是值。我可能弄错了,但你应该能够使用i而不是p来索引你的数组
答案 2 :(得分:0)
我要在黑暗中刺伤。您的标题表明您使用的JSONP ajax请求始终是异步的。我猜你在JSONP请求响应之前试图访问全局变量的内容。在jQuery中,从“成功”回调中访问数据是合适的。
答案 3 :(得分:0)
function getList(section) {
$.getJSON('http://www.otherdomain.com/book_'+ section +'.json?format=jsonp&callback=?', parseResponse);
}
AJAX调用是异步的,因此您无法在请求完成之前开始处理数据。这将parseResponse
设置为回调,这意味着在请求完成后调用它。此时你将拥有你的json。
如果您想访问外部数据,您必须确保在回调完成后执行此操作,这意味着需要进一步使用它的任何其他代码需要从中调用回调。
var bookArray = []; //use this instead of new Array(). There are security issues with the former (Array can be overridden)
function parseResponse(jsonData) {
/*
... existing code ...
*/
otherFunctionThatNeedsBookArray(); //alternatively you can set bookArray as a local variable and call otherFunctionThatNeedsBookArray(bookArray);
}