我有一个xml文件,我想每秒将其内容加载到一个特定的html div中,这是解析xml文件的javascript部分:
function getEntries() {
if (window.XMLHttpRequest)
req = new XMLHttpRequest();
req.onreadystatechange = handleReq;
req.open("GET", "entries.xml", true);
req.send(null);
}
function handleReq() {
if (req.readyState == 4)
document = req.responseXML;
var states = document.getElementsByTagName("entry");
for (i = 0; i < states.length; i++) {
currentState = states[i];
document.getElementById("LogArea").innerHTML = "<table><tr><td><b>Name:</b></td><td>"
+ currentState.getAttribute("umessage");
+"</td></tr><tr><td><b>Message:</b></td><td>"
+ currentState.getAttribute("uname");
+"</td></tr></table>";
}
}
这是xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<entries>
<entry umessage="aaaaaaaa" uname="aaaaaaa" />
<entry umessage="Hello everybody" uname="John" />
<entry umessage="Hello everybody" uname="Smith" />
<entry umessage="Hello everybody" uname="Knuth" />
</entries>
那就是html部分:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body bgcolor="yellow" onload='setInterval("getEntries()",1000)'>
<div id="LogArea" align="left">
</div>
</body>
</html>
问题是指定的div中没有加载任何内容,并且firebug中没有错误
答案 0 :(得分:5)
您正试图覆盖document
中的function handleReq()
,以便它引用XML而不是HTML。无论是成功还是失败,它仍无法发挥作用。
首先,您尝试将document
设置为异步加载的XML。正如评论中所提到的,这可能会失败(在我的测试中,Chrome和IE 9都不允许我以这种方式覆盖document
。)
document = req.responseXML;
var states = document.getElementsByTagName("entry");
如果失败,则states
正在HTML页面中查找<entry>
个标签(而不是您的意图)。如果成功,那么你有两行问题,因为你希望document
神奇地再次成为HTML页面而不是XML:
document.getElementById("LogArea").innerHTML = ...
不要使用属于window
属性的变量名称 - 将您的XML响应称为其他内容,例如var xmldoc = ...
。
不要使用全局变量。您应该使用var whatever = ...
而不是whatever = ...
来定义函数变量。
正如其他人所提到的,setTimeout(String, ...)
是不好的做法并且已被弃用。函数是JavaScript中的完整对象,所以只需传递函数本身(没有引号,不是括号)。
function handleReq()
的整个主体应位于if (req.readyState == 4)
块内(而不仅仅是第一行)。如果请求尚未完成,您不想做任何事情。
答案 1 :(得分:2)
使用
setInterval(getEntries,1000)
不是传入一个eval
的字符串,而是直接传入函数名。
handleReq
方法中存在其他问题,如this answer中所述:
document = req.responseXML;
替换文档,意味着接下来的几行是指不再存在的内容。
答案 2 :(得分:2)
传递一个字符串作为第一个参数是坏/折旧。而是使用:
setInterval(getEntries, 1000);
或者如果你需要通过参数:
setInterval(function(){ getEntries('foo') }, 1000);
虽然这可能无法解决您的问题,但请务必牢记这一点。