2012-07-29 165 views
1

如果您通過單擊下面的鏈接查看我目前的內容,則會看到我遇到的問題。全局JSON變量

  • 我從Ricky.json中獲取包含遊戲數據的JSON數據。
  • 然後,我嘗試使用一段JSON數據在文本字段中設置皮卡丘的名稱,但實際上它是undefined

我在Chrome上的控制檯說對象「皮卡丘」存在,因爲當我在控制檯中提醒它時,它會返回「對象對象」。我也可以使用JSON.stringify()通過控制檯對其進行字符串化。

爲什麼它不是全球性的功能main()本身,但在其他地方它是?

Raise a Pikachu

function ChangeName(){ 
    var n=prompt("What would you like to rename your Pikachu?",""+pikachu.pikaname+""); 
    pikachu.pikaname=n; 
} 

function main(){ 
    try{ 
     ajaxObj=new XMLHttpRequest(); 
     pikaname=document.getElementById("pikaname"); 
     age=document.getElementById("age");pikachu=""; 
     ajaxObj.onreadystatechange=function(){ 
      if(ajaxObj.readyState>=4&&ajaxObj.status==200){ 
       pikachu=JSON.parse(ajaxObj.responseText); 
      } 
     } 
     ajaxObj.open("GET","players/Ricky.json",true); 
     ajaxObj.send(); 
     pikaname.value=pikachu.pikaname; 
    } 
    catch(e){ 
     alert(e); 
    } 
} 
+0

爲什麼不分配onreadystatechange函數中的值?我認爲問題是這個ajax是asynchroneus,你試圖在ajax返回json對象之前設置該值。 – 2012-07-29 00:15:45

+0

我是,這只是......在我看來,這是有點sl。。 我真的只是將所有的東西都分成了幾個函數,比如「SaveGame()」,「LoadGame()」,「ChangeName()」等。 有沒有什麼辦法可以做到這一點? – 2012-07-29 00:17:14

回答

3

AJAX調用異步運行。在線pikaname.value = pikachu.pikaname;執行時,JSON實際上還沒有可用。相反,你需要設置了onreadystatechange事件中:現在

ajaxObj.onreadystatechange=function(){ 
     if(ajaxObj.readyState>=4&&ajaxObj.status==200){ 
      pikachu=JSON.parse(ajaxObj.responseText); 
      // Set the value in the onreadystatechange... 
      pikaname.value = pikachu.pikaname; 
     } 
    } 

,我也會指出你可能不應該被視作爲pikaname沒有var定義的全局。相反,用var outisde函數來定義它,或者在使用它的函數內部檢索它並用var來定義它。

// Define at global scope 
var pikachu; 
function ChangeName(){ 
    var n=prompt("What would you like to rename your Pikachu?",""+pikachu.pikaname+""); 
    pikachu.pikaname=n; 
} 

function main(){ 
    try{ 
     // Define with var in this function 
     var ajaxObj=new XMLHttpRequest(); 
     var pikaname=document.getElementById("pikaname"); 
     var age=document.getElementById("age"); 
     pikachu=""; 

     ajaxObj.onreadystatechange=function(){ 
      if(ajaxObj.readyState>=4&&ajaxObj.status==200){ 
       pikachu=JSON.parse(ajaxObj.responseText); 
      } 
     } 
     ajaxObj.open("GET","players/Ricky.json",true); 
     ajaxObj.send(); 
     pikaname.value=pikachu.pikaname; 
    } 
    catch(e){ 
     alert(e); 
    } 
} 
0

您的問題似乎是在這裏:

age=document.getElementById("age");pikachu=""; 
    ajaxObj.onreadystatechange=function(){ 
     if(ajaxObj.readyState>=4&&ajaxObj.status==200){ 
      pikachu=JSON.parse(ajaxObj.responseText); 
     } 
    } 
    ajaxObj.open("GET","players/Ricky.json",true); 
    ajaxObj.send(); 
    pikaname.value=pikachu.pikaname; 

第一行指定一個空字符串pikachu。 (順便說一句,我不會把多個任務放在這樣的線上)。

幾行後,你通過異步調用再次分配pikachu值。但它是異步的。因此,當您到達期望pikachu屬於pikaname屬性的對象的最後一行時,不能保證分配將發生。

很可能在這一點上pikachu仍然是一個空字符串。