2011-12-15 97 views
0

抱歉的措辭不好,我還想提前道歉,如果我的解釋是平淡無奇。我對JavaScript和Ajax的知識並不是那麼棒。我似乎無法正確接收我的JSON對象

無論如何,所以,我想要做的是顯示使用PHP的項目列表,然後當一個項目被點擊時,一個彈出窗口將基本上顯示詢問用戶是否想要添加項目到數據庫(它本質上是從一個數據庫導入到另一個數據庫)。部分彈出窗口是一個下拉列表,其中包含導入項目的可能父項。 (所以,如果你正在導入一個名爲Vista的項目,你可能會把它放在父類別'OS'中)。

爲了實現下拉,必須創建一個ajax請求,並且後端PHP使用一個JSON對象進行回覆,該對象包含需要包含在下拉列表中的所有元素。

所以,作爲一個測試,看看是否AJAX連接工作,我只是隨意放置一個按鈕,在窗口上,像這樣:

<div align="center" onclick="test()">TEST BUTTON </div> 

,並有一個JS函數調用test

function test(){ 
    var url = "index.php?module=getlist"; 
    //Code to send post request with a callback to function test2(); 
} 

和函數test2():

function test2(data){ 
    if (data){ 
     alert(data.Project[0].id); 
    } 
    else { 
     alert("ERROR"); 
    } 
} 

注意:PHP代碼返回一個JSON對象a nd其中一個子對象thingies被稱爲Project,它是一個包含id和name字段的關聯數組。

以上作品。警告框顯示一個與項目ID相對應的數字。

但是,我們想要一個包含列表的彈出窗口!所以,我們得到這樣的一些html:

<td align="center" onclick="collection('Random_Name', 'Random_Description')">Project 1</td> 

注:我將項目名稱和描述的值傳遞給一個名爲集合的JS函數。

function collection(name, description){ 
    test(); 
    //Stuff that creates the popup, creates a form in the popup, and populates the form with default values(name and description). 
    // Following Stuff is used to make the drop down. 
    var tempdata = new Array(new Array()); 
    tempdata[0]['name'] = json.Project[0].name; 
    tempdata[0]['value'] = json.Project[0].id; 
    //This function creates the Select list, it requires a name, default value, and 
    //a multi-dimensional array like the one defined above. 
    var pacolist = createSelect("collection_list",'',tempdata) 
    //Append the elements together and add a save button. 
} 

爲了讓這個工作,我在頁面頂部聲明瞭一個名爲json的全局變量。我將test2()中的alert(data.Project[0].id);更改爲json = data; 但是,它不起作用。

我點擊打開彈出窗口時出現Uncaught TypeError: Cannot read property 'Project' of undefined錯誤。

我改變了test2的()方法是這樣的,而不是:

function test2(data){ 
     if(data){ 
      return data 
     } 
     else{ 
      //Code from the original test() function to send post request to PHP with 
      //a callback to test2. 
     } 

,並在collection()功能,我添加了這個:var json = test2,(無全球JSON),但也不能工作。

對不起,我打開一個函數,函數需要調用另一個函數發送一個post請求,並且請求接收到的數據需要被原函數使用。我該怎麼做呢?

我認爲這只是一個時間問題。在請求中需要一段時間,同時,原來的功能已經開始了。

編輯:找到一個解決方案。我認爲這是一個時間問題。爲了解決它。我將頁面html調用作爲一個函數,將名稱和描述存儲爲全局變量。這個函數然後用一個不同的函數回調來發布post請求。這個不同的函數然後使用它接收到的數據(JSON對象),並將它與全局名稱和描述一起傳遞給前面提到的collection()函數。

回答

1

你必須在使用它之前解析數據。

//For IE6/IE7 
var data = eval('(' + json + ')'); 

//For IE8+/Chrome/Firefox... 
var data = JSON.parse(json); 
+0

感謝您的評論,但問題很可能只是時機。我想出了一個解決方案。我會更新原來的問題。再次感謝,我很感激。 :P – zermy 2011-12-15 18:17:35