全局JSON变量



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

  • 我从Ricky.JSON中获取JSON数据,其中包含游戏数据
  • 然后,我尝试用一段JSON数据在文本字段中设置皮卡丘的名称,但它显示它是undefined

我在Chrome上的控制台显示对象"pikachu"存在,因为当我在控制台中提醒它时,它会返回"object object"。我也可以使用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);
    }
}
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);
    }
}

您的问题似乎在这里:

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

最新更新