0

我有一个 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 中不存在任何错误

4

3 回答 3

5

您正在尝试覆盖documentfunction handleReq()以便它引用 XML 而不是 HTML。无论成功与否,它仍然无法正常工作。

首先,您尝试设置document为异步加载的 XML。正如评论中提到的,这可能会失败(在我的测试中,Chrome 和 IE 9 都不允许我以document这种方式覆盖)。

document = req.responseXML;
var states = document.getElementsByTagName("entry");

如果失败,则在您的 HTML 页面states中寻找<entry>标签(不是您想要的)。如果它成功了,那么你在两行之后就会遇到问题,因为你希望document再次神奇地成为 HTML 页面而不是 XML:

document.getElementById("LogArea").innerHTML = ...
  • 不要使用作为属性的变量名window——将您的 XML 响应称为其他名称,例如var xmldoc = ....

  • 不要使用全局变量。您应该使用var whatever = ...而不是whatever = ...定义函数变量。

  • 正如其他人所提到的,setTimeout(String, ...)这是不好的做法并且已被弃用。函数在 JavaScript 中是成熟的对象,所以只需传递函数本身(不带引号,不带括号)。

  • 的整个主体function handleReq()应该在if (req.readyState == 4)块内(不仅仅是第一行)。如果请求还没有完成,你不想做任何事情。

于 2013-03-23T19:15:30.093 回答
2

利用

setInterval(getEntries,1000)

不要传入将要eval编辑的字符串,而是直接传入函数名。

如本答案所述,您的handleReq方法中还有一个问题:

document = req.responseXML;

替换了文档,这意味着您接下来的几行指的是不再存在的东西。

于 2013-03-23T19:12:53.237 回答
2

将字符串作为第一个参数传递是不好的/折旧的。而是使用:

setInterval(getEntries, 1000);

或者如果您需要传递参数:

setInterval(function(){ getEntries('foo') }, 1000);

尽管这可能无法解决您的问题,但请务必牢记。

于 2013-03-23T19:13:35.590 回答