2010-09-16 53 views
2

我有许多网页需要每分钟自动刷新一次。使用META REFRESH或一些JavaScript轻松完成。 (是的,整个页面需要刷新 - 很多内容正在改变)。强大的自动刷新网页

但是,它需要尽可能健壮。如果网络服务器暂时关闭或存在网络呃逆,它将无法刷新,然后会出现404错误等,并永久停留在错误页面上。

我能想出的唯一选择是将整个页面托管在IFRAME中,并且在父页面上有一些脚本新建了框架页面。框架应该是不可见的,所以窗口的任何调整大小也需要调整IFRAME的大小。

有没有更简单,更优雅的解决方案? (由于时间限制,去Flash/AIR/Silverlight也不是一个选项)。

回答

5

您可以使用Ajax加载页面的新内容。如果您的页面是在服务器端生成的,那么您可以忽略身体周围的HTML并仅输出它的内容。然后,您可以使用Ajax接收新主体,并用body.innerHTML = request.responseText替换页面的现有主体。在Ajax回调中,您可以执行所有类型的错误处理,甚至忽略任何错误并重试Ajax请求。

<html> 
<head> 
<script type="text/javascript"> 
function doRequest() { 
    var request = new XMLHttpRequest(); 
    request.onreadystatechange = function() { 
     if (request.readyState == 4) { 
      if (request.status == 200) 
       body.innerHTML = request.responseText; 
      doRequest(); // restart the request 
     } 
    } 
    request.open("get", "", true); 
    request.send(null); 
} 
</script> 
<body onload="doRequest()"> 
Page content... 
</body> 
</html> 
+0

这是一个很酷的想法。我现在正在做,除了替换document.documentElement.innerHTML。这样页面可以继续正常返回头部和身体标签。就我所知,似乎它在所有主流浏览器中运行良好。 – DougN 2010-09-18 14:14:55

+0

我避免了这种情况,因为我不确定浏览器如何在标题中添加一个带有脚本和css标签的新文档来处理它。它可能会在每次更换页面时重新加载文件,这可能不是您想要的。另一个想法可能是使用response.responseXML并从中获取body标签并使用DOM方法将其克隆到您的文档中,但我认为您的页面必须是XHTML,否则XML解析可能会失败。 – Reboot 2010-09-18 15:55:51

+0

嗯,是的,经过更多测试后,它看起来像documentElement.innerHTML不起作用 - 它不会使用Chrome加载CSS,并且脚本不能与Chrome或Firefox一起运行。所以我回来寻找一个不需要重新编写每个页面的可靠解决方案。 Uggg,我希望iframes不是唯一的选择。 – DougN 2010-09-18 18:14:28

2

Google对ifmail使用iframe方法。 Google的解决方案不会出错。

-1

您还可以使用JQUERY加载方法。