首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局JSON变量

全局JSON变量
EN

Stack Overflow用户
提问于 2012-07-29 00:09:02
回答 2查看 5.2K关注 0票数 1

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

  • 我从Ricky.json中获取JSON数据,其中包含游戏数据。
  • 然后,我尝试用JSON数据的一部分在文本字段中设置Pikachu的名称,但是它说它是undefined

我在Chrome上的控制台说,这个对象"pikachu“是存在的,因为当我在控制台中警告它时,它会返回”object object“。我还可以使用JSON.stringify()通过控制台对其进行字符串化。

为什么函数main()本身不是全局的,但在其他任何地方它都是?

养一只皮卡丘

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-29 00:17:42

AJAX调用异步运行。在执行行pikaname.value = pikachu.pikaname;时,JSON实际上还不可用。相反,您需要在onreadystatechange事件中设置它:

代码语言:javascript
复制
    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来定义它。

代码语言:javascript
复制
// 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);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-07-29 00:18:43

你的问题似乎就在这里:

代码语言:javascript
复制
   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仍然是一个空字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11705668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档