JSONP数组在函数外部未定义

时间:2011-07-28 16:05:04

标签: javascript jquery arrays function jsonp

我发现了许多类似于我的问题;但我看到的答案似乎都不适合我。所以这是我的问题。我正在使用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"]
    }
])

4 个答案:

答案 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);
}