JavaScript中的XML文档“未定义”

时间:2011-07-19 23:23:24

标签: javascript xml html5

我正在研究我正在玩的游戏创意的HTML5实现。其中一部分当然是存储内容,其中包括游戏中不同能力的数据,以及角色等。

虽然动态内容(例如特定字符)稍后会被移动,但我可能会坚持使用XML来获取静态内容,例如能力和装备的统计数据,这意味着我更愿意解决我遇到的问题XML尽快。

现在,为了做到这一点,我在战斗阶段开始时加载XML文档,首先是角色,然后是与此角色相关的能力等。

为此,我有一个“loadXMLFile”函数,它接受一个文件名:

var loadXMLFile = function(filename) {
  req = new XMLHttpRequest();
  req.onreadystatechange = function() {
    return req.responseXML;
  }
  req.open("GET", filename, true);
  req.send();
}

加载和操作数据的示例:

function Character(id) {
  doc = loadXMLFile("characters.xml");
  characters = doc.getElementsByTagName("Character");

我的意图是在继续之前让函数调用等待返回值。正如您可以从问题的标题中看出来的那样,这不起作用。相反,只要我尝试操作数据,示例中的第三行,我就会收到以下运行时错误: Uncaught TypeError:无法调用未定义的方法'getElementsByTagName'

如示例所示,我在构造函数中加载这些XML文件,使用XML文件填充类。因此,在readystatechange事件处理程序内调用不同函数的结构不太可取。我是否被迫在每个地方重复XML加载代码,只是为了制作单独的事件处理程序?

3 个答案:

答案 0 :(得分:1)

我建议使用jQuery或其他javascript框架。处理这样的问题要容易得多,你会节省大量的时间和代码。另一个问题是代码中没有提供跨浏览器兼容性。

答案 1 :(得分:0)

你想改变:

req.open("GET", filename, true);

要:

req.open("GET", filename, false);

发出同步请求(这意味着在继续之前等待请求。)

你不能从onreadystatechange返回一些内容,那部分代码是错误的。

并且您没有检查该函数中的实际状态,所以这也是错误的。

所以基本上你的代码根本不正确。我建议为XMLHttpRequest找一个教程网站并复制他们的代码。

作为旁注,你为什么要为自己的生活而努力?安装jQuery并让它为你做所有这些。

最后一点,json比xml更容易使用,你可能想切换到那个。

答案 2 :(得分:0)

提到的代码段是浏览器特定的问题。理想情况下,您应该使用跨浏览器兼容的基于JavaScript的框架。您可以避免大多数与浏览器相关的问题。

要解决您的问题,getElementsByTagName函数在doc元素中不可用。因此,您可以按以下方式修改代码,

if(doc.getElementsByTagName){
     characters = doc.getElementsByTagName("Character");
}

但这只会避免错误,但不会解决获取Character元素的问题。

最好的选择是将XML转换为服务器中的JSON并将JSON发送到客户端。很容易遍历JSON,并且没有跨浏览器问题。

可以轻松遍历JSON,如下所示,

function traverseJSON (jsonObj){
    for(var value in jsonObj){
        if(typeof value == 'function'){//this is to avoid 'remove' function in case of Array, Array object will be available in case of repeating elements in XML. 
            continue;
        }else if(typeof value == 'object'){ //refers to element in XML 
            traverseJSON(value);
        }else if(typeof value== 'string'){   //refers to attribute in XML
        jsonObj[value]; //refers to the attribute value in XML
        }
    }
}

上面的函数可以用来遍历JSON,它以JSON对象作为输入。