XML文档;“未定义”;在JavaScript中
我正在用HTML5实现一个我正在玩的游戏理念。当然,其中的一部分是存储内容,其中包括游戏中不同能力的数据以及角色等 虽然动态内容(如特定字符)将在以后移动,但我可能会坚持使用XML来处理静态内容,如能力和装备的统计数据,这意味着我更愿意尽快解决XML的问题 现在,为了做到这一点,我在战斗阶段的开始加载XML文档,首先是角色,然后是与角色相关的能力等 为此,我有一个“loadXMLFile”函数,它采用一个文件名:XML文档;“未定义”;在JavaScript中,javascript,xml,html,Javascript,Xml,Html,我正在用HTML5实现一个我正在玩的游戏理念。当然,其中的一部分是存储内容,其中包括游戏中不同能力的数据以及角色等 虽然动态内容(如特定字符)将在以后移动,但我可能会坚持使用XML来处理静态内容,如能力和装备的统计数据,这意味着我更愿意尽快解决XML的问题 现在,为了做到这一点,我在战斗阶段的开始加载XML文档,首先是角色,然后是与角色相关的能力等 为此,我有一个“loadXMLFile”函数,它采用一个文件名: var loadXMLFile = function(filename) {
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");
我这样做的目的是让函数调用在继续之前等待返回值。从问题的标题可以看出,这是行不通的。相反,只要我尝试操作数据,即示例中的第三行,我就会收到以下运行时错误:UncaughtTypeError:无法调用undefined的方法'getElementsByTagName'
如示例所示,我在构造函数中加载这些XML文件,使用XML文件填充类。因此,在readystatechange事件处理程序中调用不同函数的结构并不可取。我是否被迫在任何地方重复XML加载代码,只是为了创建单独的事件处理程序?我建议使用jQuery或其他javascript框架。处理这样的问题要容易得多,您将节省大量时间和代码行。另一个问题是代码中没有给出的跨浏览器兼容性。要更改:
req.open("GET", filename, true);
致:
发出同步请求(这意味着在继续之前等待请求)
您不能从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以JSON对象作为输入。对于真/假,这里的代码实际上是错误的,我在自己的代码中使用了false。事实证明,我应该仔细阅读XML和JS的示例为什么会这样做。我已经将返回值移动到send()之后,现在我得到了一个类似的错误,但是doc变量不是“undefined”,而是“null”。尽管jQuery似乎也是公司想要的东西,但它与实际构建游戏一样,也是一种学习体验。
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
}
}
}