Javascript onload=';setInterval(“function()”,1000)';不';行不通

Javascript onload=';setInterval(“function()”,1000)';不';行不通,javascript,xml,ajax,html,Javascript,Xml,Ajax,Html,我有一个xml文件,我想每隔一秒钟将其内容加载到一个特定的html div中,下面是解析xml文件的javascript部分: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <entries> <entry umessage="aaaaaaaa" uname="aaaaaaa" /> <entry umessage="Hello everybody" uname="John" /> &

我有一个xml文件,我想每隔一秒钟将其内容加载到一个特定的html div中,下面是解析xml文件的javascript部分:

<?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>
函数getEntries(){
if(window.XMLHttpRequest)
req=新的XMLHttpRequest();
req.onreadystatechange=handleReq;
请求打开(“GET”,“entries.xml”,true);
请求发送(空);
}
函数handleReq(){
如果(req.readyState==4)
document=req.responseXML;
var states=document.getElementsByTagName(“条目”);
对于(i=0;i
下面是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内部也没有错误

setInterval(getEntries,1000)
直接传入函数名,而不是传入一个
eval
ed的字符串

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


这将替换文档,这意味着您接下来的几行引用的是不再存在的内容。

将字符串作为第一个参数传递是错误的/已折旧的。相反,请使用以下任一选项:

setInterval(getEntries, 1000);
或者,如果需要传递参数:

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

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

您正试图覆盖
函数handleReq()
中的
文档
,以便它引用XML而不是HTML。不管这是成功还是失败,它仍然不起作用

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

如果失败,则说明
正在HTML页面中查找
标记(不是您想要的)。如果成功,那么两行之后就会出现问题,因为您希望
document
神奇地再次成为HTML页面而不是XML:

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

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

  • 正如其他人提到的,
    setTimeout(String,…)
    是一种不好的做法,不推荐使用。函数在JavaScript中是完全成熟的对象,因此只需传递函数本身(没有引号,没有括号)

  • 函数handleReq()
    的整个主体应该位于
    if(req.readyState==4)
    块(而不仅仅是第一行)的内部。如果请求尚未完成,您不想做任何事情


JavaScript是否加载了标记?能否扩展到“不工作”?发生了什么你没有预料到的事情?你现在还没有发生什么?例外情况?错误?代码适用于我这里,什么浏览器,您是否尝试过使用console.log输出任何数据?在我看来,JQuery会使这一点变得简单一些,但是除了函数调用应该是“getEntries”而不是“getEntries()”之外,一切都应该正常,在单个文件中发布完整的代码这与实际问题无关,但是您的
getEntries
函数看起来有点奇怪。检查是否定义了
XMLHttpRequest
,如果定义了,则设置
rec
,但不管怎样,都要继续并使用
rec
,这意味着初始检查有点毫无意义,因为如果没有定义
XMLHttpRequest
,它仍然会中断。在任何情况下,
XMLHttpRequest
将始终被定义,除非您需要支持IE7或更早版本。如果您需要支持IE7,那么您需要调整ajax代码以使用它。如果没有,您可以完全删除
If()
检查,因为它对您没有任何帮助。+1我认为您无法覆盖文档,因此当
document.getElementsByTagName(“条目”)时
实际上是在页面中查找
条目
标记,而不是xml。@Musa谢谢,这似乎是正确的。我已经更新了我的答案。
document.getElementById("LogArea").innerHTML = ...