我正在使用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,那么它使用的本地机器时间也可能不正确。
服务器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";
答案 0 :(得分:1)
如果async为true,则无法从该函数返回时间。 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);
我建议使用async ajax调用,将随机数生成添加到URL然后使异步工作,您不能使用serverTime的返回值,而是必须通过调用继续您的控制流成功处理程序中的函数。