全局JSON变量

时间:2012-07-29 00:09:02

标签: javascript variables dom global-variables

如果您通过点击下面的链接查看我到目前为止的来源,您将看到我遇到的问题。

  • 我从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);
    }
}

2 个答案:

答案 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仍为空字符串。