javascript错误:"data.getElementsByTagName 不是一个函数

0 投票
3 回答
4407 浏览
提问于 2025-04-15 15:55

我花了好几个小时在这个烦人的错误上,所以任何帮助都非常感谢!

我正在使用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 个回答

0

好吧,接下来我们来检查一下清单。

我假设你的数据已经正确分配,并且你确认里面有你需要的“数据”。现在,由于它给你报错说这个函数不存在,我们就知道它确实没有找到这个函数,原因可能是其他的,因为如果找不到这个名字的标签,函数应该会返回一个空节点。

我想知道你是否把XML和JavaScript放在同一个文件里,如果是这样的话,你是不是应该指定文档,而不是你的数据?我知道我说的这种情况是我在初步测试时会做的,所以我只是想确认一下。

如果你是引用一个外部的XML数据,那么实际上应该不会有问题。

看起来一切都围绕着变量数据。对我来说,似乎数据可能没有指向正确的元素,或者根本没有指向任何东西。

希望这能帮到你,
大卫。

0

从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。

1

试着强制 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 之前,先输出所有的头部信息。

撰写回答