JavaScript 中的 XML 文档"undefined"



我正在制作一款基于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: Cannot call method 'getElementsByTagName' of undefined

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

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

您想更改:

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

:

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

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

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

你没有检查函数的实际状态,所以这也是错误的。

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

顺便说一句,你为什么要让自己的生活很艰难?安装jQuery,让它为你做所有这些事情。

最后一个注意事项,json比xml更容易使用,你可能想要切换到那个

上面提到的代码段是浏览器特有的问题。理想情况下,您应该使用跨浏览器兼容的基于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对象作为输入。

最新更新