1

如果您通过单击下面的链接查看到目前为止我所拥有的内容的来源,您会看到我遇到的问题。

  • 我从包含游戏数据的 Ricky.json 获取 JSON 数据。
  • 然后我尝试用一​​段 JSON 数据在文本字段中设置皮卡丘的名字,但它却说它是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);
    }
}
4

2 回答 2

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. 相反,使用varoutisde 任何函数定义它,或者检索它并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);
    }
}
于 2012-07-29T00:17:42.997 回答
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仍然是一个空字符串。

于 2012-07-29T00:18:43.137 回答