2011-07-28 26 views
0

我發現了很多類似於我的問題;但我看到的所有答案似乎都不適合我。所以這是我的問題。我正在使用jQuery JSONP獲取有關某些書籍的很多信息(JSON是靜態的,因此它包含了一個硬編碼函數)。我有這個偉大的工作。我的問題是我需要多次引用JSON,並且它是靜態的,我想我需要使用這些值設置本地數組。因此,這裏是我下面的代碼:JSONP數組undefined功能之外undefined

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

你是否聲明var bookArray的某處?它在哪裏被使用,它是未定義的。我說得對,這是可擴展範圍的問題,而不是你的json? –

+0

bookArray在我上面的代碼片段的第4行中聲明。我還沒有用它來測試我試圖使用警報,它是未定義的。在頁面的HTML底部,我也嘗試了一個沒有運氣的document.write。 – Dusty

+0

來自我的一個更愚蠢的問題。在嘗試訪問bookArray的內容之前,您是否調用過parseResponse? –

回答

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); 
} 
+0

謝謝,這將不得不做。這不會很漂亮,但我想這就是我被困在HTML和JavaScript中的東西。 – Dusty

0

也許becouse p被定義爲a字符串p='0'。嘗試p=0;

+0

仍然沒有運氣,我曾試過。我也嘗試過使用bookArray [item]和bookArray ['item'],但沒有運氣。我讀過其他一些問題,你必須單獨做櫃檯,這就是爲什麼我在那裏做p。 – Dusty

+0

你在哪個時間使用parseResponse函數?是否有可能,你寫在http://jsbin.com/整個代碼? – czerasz

+0

parseResponse包裝在JSON中,以便JSONP正常工作。 – Dusty

0

這第一位不是你問題的答案但你有你的jQuery.each()參數錯誤的方式,我認爲,'我'應該是你的索引,'項目'應該是價值。我可能會誤會,但你應該可以用我代替p來索引你的陣列

+0

從我可以告訴他們是可以互換的,就好像我確實警覺(物品)它發出一個0,1,2,3等...... – Dusty

+0

我會認爲'我'會是索引和'物品'將成爲對象,但看起來儘管它們的命名方式是正確使用它們。 –

+0

好的 - 我認爲從jQuery文檔(http://api.jquery.com/jQuery.each/)第一個參數是索引,第二個項目。我同意你正確使用它們,我只是認爲這些名字是誤導性的。你有沒有嘗試過使用它們中的任何一個作爲bookArray中的索引而不是p? – tinyd

0

我要在黑暗中進行刺探。您的標題暗示您正在使用總是異步的JSONP ajax請求。我猜你在嘗試在JSONP請求響應之前訪問你的全局變量的內容。在jQuery中,從'成功'回調中訪問數據是合適的。

+0

好的,那麼我該如何去做呢? – Dusty

+0

你使用jQuery嗎? –

+0

最常見的解決方案是使用setInterval來輪詢腳本中的函數是否存在,以及何時執行,則認爲它已完成加載。這就是爲什麼JSONP響應是一個回調,通常有一個名稱與一個隨機數,以避免衝突。回調將返回一個包含數組的對象。 –