Javascript onload=';setInterval(“function()”,1000)';不';行不通
我有一个xml文件,我想每隔一秒钟将其内容加载到一个特定的html div中,下面是解析xml文件的javascript部分: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 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 = ...