2012-07-29 168 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仍然是一个空字符串。