的onload ='的setInterval("()的函数" 1000)'不起作用

时间:2013-03-23 19:10:56

标签: javascript xml ajax html5

我有一个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中没有错误

3 个答案:

答案 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);

虽然这可能无法解决您的问题,但请务必牢记这一点。