2010-10-22 40 views
0

我有一个div,其内容基于服务器端进程不断变化。目前我使用jQuery load来每3秒轮询一次服务器以获取任何更新。jQuery:帮助更新div上的内容onchange

这是我有:

function poll() { 
    reloadPage(); 
    setTimeout("poll();", 3000); 
} 

function reloadPage() { 
     $("#mydiv").load(location.href + " #mydiv>*", ""); 
} 

这种运作良好,在firefox,但在IE中,负载不更新DIV,可能是由于缓存的问题。除了定期轮询外,还有更好的方式去做我想做的事吗?

+0

什么是'location.href +“#mydiv> *”'应该是? – Tomalak 2010-10-22 18:07:31

+0

它只是在部分刷新div – Prabhu 2010-10-22 18:08:58

+0

@Tomalak检查http://api.jquery.com/load/上的文档,我必须自己查看 – Znarkus 2010-10-22 18:13:11

回答

4

您需要更改每个请求的URL以防止IE缓存响应。

例如:

function poll() { 
    reloadPage(); 
    setTimeout(poll, 3000); 
} 

function reloadPage() { 
    $("#mydiv").load(location.href + "?Timestamp=" + new Date() + " #mydiv>*", ""); 
} 

此外,你应该不是一个字符串传递给setTimeout

+0

太好了,非常感谢,这样做了... – Prabhu 2010-10-22 18:13:35

+0

jQuery不会缓存没有缓存头的响应?只是好奇,例如PHP默认不发送这些头文件 – Znarkus 2010-10-22 18:15:07

+0

@Znarkus:这是一个IE问题; IE有非常积极的缓存。 – SLaks 2010-10-22 18:19:36

2

jQuery的ajax有一堆默认设置,其中一个控件缓存。如果您将其设置为false,它会在ajax调用中附加一个时间戳以防止缓存。

http://api.jquery.com/jQuery.ajax/

+0

+1用于提示$ .ajax。我从不使用短手,这只是更容易记住。 – Znarkus 2010-10-22 18:20:04

0

有没有更好的办法做我想要做的比其他轮询周期?

由于HTTP是无状态协议,您必须轮询以查看服务器上正在发生的事情。

但有实现轮询一个更好的办法:

setInterval(function() { 
    $("#mydiv").load(location.href + " #mydiv>*", {Timestamp: new Date()}); 
}, 3000); 

注:

  • 定义,而不是超时的时间间隔,
  • 通过实际的功能setInterval,而不是字符串
  • 使用data参数load()传递缓存断路器
+0

setInterval会在3秒后开始第一次通话还是立即开始?我需要第一个立即发生。 – Prabhu 2010-10-22 18:58:38

+0

@Prabhu:但“第一次加载”是浏览器页面加载本身。然后负载发生三秒钟。加载完成后不需要刷新页面。 – Tomalak 2010-10-22 19:04:51

+0

很酷,很有道理 – Prabhu 2010-10-23 18:57:47