我正在研究我正在玩的游戏创意的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加载代码,只是为了制作单独的事件处理程序?
答案 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对象作为输入。