我正在使用jQuery倒计时插件(http://keith-wood.name/countdownRef.html)和使用serverTime功能:
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;
}
现在当我点击刷新时,Firefox是正确的,但是IE重置时钟为一个设定的时间,这是完全不正确的,即Firefox显示44分钟,IE显示1小时,36分钟剩余。
如果我设置async为true,那么它使用的是本地机器时间,这也可能是不正确的。
server-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";
如果async为true,则无法从该函数返回time。ajax调用是异步的。当serverTime函数返回时,它还没有完成ajax调用。如果你想使用返回的时间,你必须从成功函数中调用将要使用它的函数。这是一个很常见的错误——在过去的几周里,我可能已经写了10-15次了。
如果async是false,那么这应该工作,除非浏览器正在缓存您的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的返回值,而是必须通过调用来自成功处理程序的函数来继续您的控制流。