Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 全局JSON变量_Javascript_Variables_Dom_Global Variables - Fatal编程技术网

Javascript 全局JSON变量

Javascript 全局JSON变量,javascript,variables,dom,global-variables,Javascript,Variables,Dom,Global Variables,如果你通过点击下面的链接来查看我目前所拥有的资源,你会看到我遇到的问题 我从Ricky.JSON获取JSON数据,它包含游戏数据 然后,我尝试在文本字段中用一段JSON数据设置Pikachu的名称,但它表示它是未定义的 我在Chrome上的控制台显示对象“pikachu”存在,因为当我在控制台中提醒它时,它返回“object object”。我还可以使用JSON.stringify()通过控制台将其字符串化 为什么它在函数main()本身中不是全局的,但在其他地方却是全局的呢 AJAX调用

如果你通过点击下面的链接来查看我目前所拥有的资源,你会看到我遇到的问题

  • 我从Ricky.JSON获取JSON数据,它包含游戏数据
  • 然后,我尝试在文本字段中用一段JSON数据设置Pikachu的名称,但它表示它是未定义的
我在Chrome上的控制台显示对象“pikachu”存在,因为当我在控制台中提醒它时,它返回“object object”。我还可以使用JSON.stringify()通过控制台将其字符串化

为什么它在函数
main()
本身中不是全局的,但在其他地方却是全局的呢


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);
    }
}

你的问题似乎在这里:

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

为什么不在onreadystatechange函数中赋值?我认为问题在于ajax是异步的,您试图在ajax返回json对象之前设置值。我是,只是…我认为这有点草率。我真的想把所有东西都分解成函数,比如“SaveGame()”、“LoadGame()”、“ChangeName()”,等等。有什么方法可以做到这一点吗???
   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;