2011-07-26 77 views
0

我使用jQuery插件倒计时(http://keith-wood.name/countdownRef.html),并使用serverTime功能:jQuery的倒计时IE刷新问题

function serverTime() { 
    var time = null; 
    $.ajax({url: 'cgi/server-time.php', 
    async: false, dataType: 'text', 
    success: function(text) { 
     time = new Date(text); 
    }, error: function(http, message, exc) { 
     time = new Date(); 
    }}); 
    return time; 
} 

现在,当我点击刷新,火狐是正确的,但IE浏览器将时钟重置为完全不正确的设置时间,即Firefox说44分钟剩余时间,IE说1小时36分钟。

如果我将async设置为true,那么它使用的本地机器时间也可能不正确。

服务器time.php

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header("Expires: Fri, 1 Jan 2010 00:00:00 GMT"); // Date in the past 
$now = new DateTime(); 
echo $now->format("M j, Y H:i:s O")."\n"; 

回答

1

不能从该函数返回的时间,如果异步是真实的。 ajax调用是异步的。 serverTime函数返回时,它尚未完成ajax调用。如果你想使用返回的时间,你必须调用将从成功函数中使用它的函数。这是一个非常常见的错误 - 我可能在过去几周写了10-15次。

如果异步是错误的,那么这应该工作,除非浏览器缓存你的php文件,尽管你的页面在ajax调用期间会锁定,直到它返回。

如果你想100%确保您的AJAX调用永远不会返回一个缓存的结果,然后随机查询字符串追加到它像这样所以它总是一个唯一的URL:

cgi/server-time.php?random=83987569284 

您可以创建一个随机数是这样的:

var php = "cgi/server-time.php?random=" + Math.floor(Math.random() * 10000000000); 

我会建议使用异步Ajax调用,加上随机数生成的URL,然后使异步工作,你不能使用从serverTime的返回值,而是必须通过调用函数来继续控制流程成功处理程序。