Javascript 动态服务器时间

Javascript 动态服务器时间,javascript,dynamic,time,Javascript,Dynamic,Time,据我所知,使用脚本中的settimeout()无法在IE中获取动态服务器时间。。我发现这个例子: function timeExam(){ $.ajax({ url : "inc/clock.php", success : function (data) { $("#clock_time").html(data); } }); var func = function() {

据我所知,使用脚本中的settimeout()无法在IE中获取动态服务器时间。。我发现这个例子:

function  timeExam(){

    $.ajax({
    url : "inc/clock.php",
    success : function (data) {
    $("#clock_time").html(data);
    }
    });

           var func = function()
            {
                timeExam();
            }

            setTimeout(func, 1000);
    }


            <body onload="timeExam();">
                bla bla bla
            </body>
函数时间检查(){
$.ajax({
url:“inc/clock.php”,
成功:功能(数据){
$(“#时钟时间”).html(数据);
}
});
var func=函数()
{
时间考试();
}
设置超时(func,1000);
}
呜呜呜呜
也许有可能让它发挥作用


如果没有,你能给我建议一个在所有浏览器中都能工作的动态时钟和服务器时间吗?!我用prototype.js尝试了一个时钟,但它与IE8中的jquery UI冲突(selectmenu显示不正确)。我补充说脚本中没有冲突代码,但它是无用的。。由于使用jQuery,不得不删除prototype.js

$(function() {
  var updateSeconds = 60;
  function updateClock() {
    $.ajax({
      url : "inc/clock.php",
      success : function (data) {
        $("#clock_time").html(data);
        setTimeout(updateClock, updateSeconds * 1000);
      }
    });
  }
  setTimeout(updateClock, updateSeconds * 1000);
});
根据需要更改“updateSeconds”


我是用
setTimeout
而不是
setInterval
来实现的,因为这样更安全。如果服务器出现问题,此脚本不会一次又一次地堆积失败的HTTP请求,因为在当前更新成功之前,它不会设置新的更新。

脚本所做的是在inc/clock.php上轮询服务器上的脚本,并用脚本的输出(大约)每秒替换#clock_time元素的内容。 如果您在yoursite.tld/inc/clock.php中有一个id为clock_元素的元素和一个脚本,那么这应该是可行的

但是,我不同意经常轮询服务器的当前时间。只需将时间同步到Web服务器一次就足够了。除了一些细微的差别之外,这应该可以让你的时钟在很长一段时间内保持同步。如果你的webapp运行时间超过几个小时或几天,你应该定期重新同步你的时钟(每天或每周一次)

使用日期对象跟踪客户端上的servertime。只需从clock.php的输出创建一个日期对象(作为先决条件的有效日期输出),并根据时钟与远程服务器同步时的时间增量定期(像每秒一样)更新时钟元素

这里有一些未经测试的粗略代码,可能是一些语法错误,但简要说明了您应该做什么:

function setupServerClock( clock_element, remote_time_url, remote_update_interval, local_update_interval ) {
    var w = window;
    // client time on resync
    var ct = new Date();
    // server time on resync
    var st = new Date();
    // setup resync
    w.setInterval( function() {
        jQuery.ajax( {
            url: remote_time_url,
            success: function (data) {
                ct = new Date();
                st = new Date(data);
            }
        });
    }, remote_update_interval);
    // setup local clock display
    w.setInterval( function() {
        // the time passed on our local machine since the last resync
        var delta = new Date() - ct;
        // we assume the same time passed at the server
        // (yeah, I know, spacetime might not be the same at the servers 
        // place and off the shelve clocks are pretty inaccurate)
        var clock = st - 0 + delta; // - 0 to convert to microsecond timestamp
        jQuery(clock_element).html(new Date(clock));
    }, local_update_interval);
}
可以这样称呼它:

setupServerClock( jQuery('#clock_element'), 'inc/clock.php', 1000 * 60 * 60, 1000 );
这将使用yourdomain.tld/inc/clock.php返回的值设置要写入#clock_元素的时钟,每小时重新同步时钟,并每秒更新时钟的本地表示形式

哦,如果周期性的重新同步确实会引起时钟的“跳跃”,你可以考虑简单地给用户反馈,他的时钟是更新的,例如这样

    w.setInterval( function() {
        jQuery(clock_element).html('resyncing clock...');
        jQuery.ajax( {
            url: remote_time_url,
            success: function (data) {
                ct = new Date();
                st = new Date(data);
            }
        });
    }, remote_update_interval);

实际上,没有任何方法可以将客户端时钟与服务器“同步”;浏览器中的Javascript代码没有这种能力。如果客户机时钟漂移,那么客户机代码将不得不进行某种自适应调整,这将非常复杂。当然,我将他的时钟元素称为“客户机时钟”。是的,我理解这一点。我的意思是,如果他真的想准确显示服务器上的实际时间,最简单的方法就是他设置的。大约每分钟一次HTTP请求并不是那么糟糕。现在,如果希望时钟以秒为单位,那么,我想我会在客户端这样做,但是当实际服务器时间相差一两秒时,不可避免的“跳跃”可能会分散注意力。这取决于我猜的应用程序。由于网络延迟,javascript异步函数(包括$.ajax和setTimout)的工作方式,以及最终不准确的系统时钟,你无法排除一两秒钟的干扰。除此之外,他并没有“每分钟左右”查询服务器,而是在每一次时钟更新上进行查询,这几乎每秒钟都会发生一次。是的,这是真的-我当然不会每秒查询一次。缺少几个括号。。。但是smth不起作用。。根本不显示时间。你知道你的服务器实际返回什么吗?您可以使用Firebug(Firefox)或IE8调试器来检查XHR的响应。您是唯一可以直接诊断问题的人,@arturs说。将“alert()”调用放在timeout函数中,以确保正在调用它。检查浏览器“开发人员工具”和服务器日志,查看ajax请求是否未能执行某些错误。@arturs是否正确设置了clock.php服务器端脚本?@Pointy但如果出现单个失败的XHR,setTimeout也会终止时钟,例如由于服务器负载高,或者bittorrent混乱的客户端连接,或者任何其他你能想到的有效原因(列车上的UMTS网络断开,服务器关闭/重新启动以进行维护,你可以这么说)。根据应用程序的类型,这可能不是理想的行为。