如果您通过点击下面的链接查看我到目前为止的来源,您将看到我遇到的问题。
undefined
。Chrome上的我的控制台说对象“皮卡丘”存在,因为当我在控制台中提醒它时,它返回“对象对象”。我也可以通过控制台使用JSON.stringify()进行字符串化。
为什么它在函数main()
本身不是全局的,而在其他任何地方它都是???
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 :(得分: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
定义任何函数,或者检索它并使用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);
}
}
答案 1 :(得分: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
仍为空字符串。