JSON对象未定义

时间:2012-11-19 23:00:57

标签: javascript xml json

我是一名学生正在为我大学的图书馆网站制作电影浏览器项目。我有一些Javascript经验,但除了对这个项目的研究,我没有XML或JSON的经验。

我必须使用隐藏的API密钥查询WorldCat Search API以获取我们馆藏中的所有DVD,并将MARCXML结果转换为JSON。库服务器不支持服务器端脚本,因此我选择使用Yahoo Pipes,它允许我在私有字符串中“隐藏”API密钥,并将结果返回为JSON。

我的问题是有时(但肯定不总是)我收到错误消息:

TypeError: root is undefined

我假设与此错误的不一致是由于加载时间(可能Javascript试图在JSON对象完全加载之前执行?我如何提高代码的效率以避免此错误?谢谢你任何建议。

下面您将找到我的代码的缩写示例,有时会重新创建此错误:

<!DOCTYPE html>
<html>
<head>
<script>
var my_JSON_object = {};
var movieArray = new Array();
var subject = 'Science+Fiction';
var recordSet = 1;

loadJSON(0);

function loadJSON(set) 
{
    if (set == 0)
        var yahooPipe = 'http://pipes.yahoo.com/pipes/pipe.run?_id=b54472aff1548e93022d07fddfd6aa38&_render=json&maximumRecords=20&startRecord=1&subject='+subject+'&_callback=getData';
    else
        var yahooPipe = 'http://pipes.yahoo.com/pipes/pipe.run?_id=b54472aff1548e93022d07fddfd6aa38&_render=json&maximumRecords=20&startRecord='+((set*20)+1)+'&subject='+subject+'&_callback=getNextData';
    var head = document.getElementsByTagName('head')[0];         
    var newJS = document.createElement('script');

    newJS.type = 'text/javascript';
    newJS.src = yahooPipe;
    head.appendChild(newJS);
}

function getData(json)
{
    my_JSON_object = json;
    if (my_JSON_object.value.items[0].numberOfRecords>0)
        prepData(0);
    else
        alert("No results...");
}

function getNextData(json)
{
    my_JSON_object = json;
    prepData(recordSet);
}

function loadData()
{   
    loadJSON(recordSet);
    recordSet++;
}

function prepData(set)
{
    var root = my_JSON_object.value.items[0];   

    if (set == 0 && root.numberOfRecords == 1)
    {
        root.records.record[0] = root.records.record;
    }

    for (var i=0; i<20; i++)
    {
        if (root.records.record[i]==undefined)  
        {
            document.getElementById('A1').innerHTML=root.numberOfRecords;
            document.getElementById('A2').innerHTML=movieArray[set*20+i-1];
            break;
        }

        for (var j=0; j<root.records.record[i].recordData.record.datafield.length; j++)
        {
            if (root.records.record[i].recordData.record.datafield[j].tag == 245)
            {               
                for (var k=0; k<root.records.record[i].recordData.record.datafield[j].subfield.length; k++)
                {
                    if (root.records.record[i].recordData.record.datafield[j].subfield[k].code == "a")
                    {
                        movieArray[i+(set*20)] = root.records.record[i].recordData.record.datafield[j].subfield[k].content; 
                        break;
                    }
                }
            }
        }
    }

    if (set*20<root.numberOfRecords)
        loadData();
}

</script>
</head>
<body>

<p><b>Results:</b><span id="A1"></span></p>
<p><b>Title(last record):</b><span id="A2"></span></p>

</body>
</html>

0 个答案:

没有答案