javascript错误:"data.getElementsByTagName 不是一个函数
我花了好几个小时在这个烦人的错误上,所以任何帮助都非常感谢!
我正在使用Jquery从一个托管在Google App Engine上的Python文件请求XML数据,然后尝试处理这个XML。
这是我从Firebug获得的POST请求的响应:
<?xml version="1.0" encoding="ISO-8859-1"?><building key='agdhcHRydXNochALEglCdWlsZGluZ3MY3x4M' bldname='test'></building>
Status: 200 OK
Cache-Control: no-cache
Content-Type: application/xml
Content-Length: 0
这是处理数据的JavaScript代码:
jQuery.post(toLoad,formInput,function(data){
alert(data.getElementsByTagName("building"));
})
这是我从Firebug得到的错误信息:
data.getElementsByTagName is not a function
anonymous("<?xml version="1.0" encoding="ISO-8859-1"?><building key='agdhcHRydXNochALEglCdWlsZGluZ3MY4B4M' bldname='test'></building>\nStatus: 200 OK\r\nCache-Control: no-cache\r\nContent-Type: application/xml\r\nContent-Length: 0\r\n\r\n")viewBuilding.js (line 120)
I()jquery.min.js (line 19)
anonymous(6)jquery.min.js (line 19)
[Break on this error] alert(data.getElementsByTagName("building"));\n
我在网站的其他部分也用过这段JavaScript来处理XML,所以我觉得这段代码应该没问题,也许是数据的格式有问题?我现在卡住了。:/
谢谢!
3 个回答
好吧,接下来我们来检查一下清单。
我假设你的数据已经正确分配,并且你确认里面有你需要的“数据”。现在,由于它给你报错说这个函数不存在,我们就知道它确实没有找到这个函数,原因可能是其他的,因为如果找不到这个名字的标签,函数应该会返回一个空节点。
我想知道你是否把XML和JavaScript放在同一个文件里,如果是这样的话,你是不是应该指定文档,而不是你的数据?我知道我说的这种情况是我在初步测试时会做的,所以我只是想确认一下。
如果你是引用一个外部的XML数据,那么实际上应该不会有问题。
看起来一切都围绕着变量数据。对我来说,似乎数据可能没有指向正确的元素,或者根本没有指向任何东西。
希望这能帮到你,
大卫。
从GAE服务器返回的响应是错误的。它把头信息放在了XML数据的下面,成了响应体的一部分。这样就不算一个有效的XML文档;因为头信息没有正确地出现在最上面,所以没有有效的Content-Type头来告诉jQuery这个传来的文档是XML格式。因此,服务器给你发送的是普通文本数据,而不是你想要的XML文档。出现这个错误是因为你不能在一个String
上调用getElementsByTagName
。
可能是GAE应用的作者忘记了怎么写WSGI应用,直接把XML文档输出到标准输出了:
print xml
...
start_response('200 OK', [('Content-Type', 'text/xml')])
return []
而不是正确地返回给服务器进行处理:
start_response('200 OK', [('Content-Type', 'text/xml')])
return [xml]
这也就解释了为什么服务器认为Content-Length
是0。
试着强制 jQuery 把返回的数据当作 xml 来识别,可以使用
jQuery.post(toLoad, formInput,
function(data, textStatus) {
// now check if data is set and what the status is
alert(data);
alert(textStatus);
//alert(data.getElementsByTagName("building"));
},
'xml'
);
顺便说一下,我觉得有点可疑的是 Content-Length: 0
这个头部信息。
根据你的评论,我得出的结论是,生成你那个 xml 的页面有问题。它先输出了 xml,然后才输出一些 http 头部信息,这样的数据当然不能算有效的 xml。因此 jQuery 正确地判断返回的数据是文本格式。
你必须在输出任何一行 xml 之前,先输出所有的头部信息。