Javascript setInterval在显示服务器时间内每秒减慢速度

Javascript setInterval在显示服务器时间内每秒减慢速度,javascript,internet-explorer,setinterval,Javascript,Internet Explorer,Setinterval,获取日期和时间服务器后,我将更新服务器日期和时间的时间增量1秒。 问题: 显示后,它将在浏览器中变慢。我想需要1004ms 增加1秒。在Chrome中它看起来不错,但在IE8中它会变慢 我的方法: var serverdate = null; var elapsedSecond = null; var startTime = "<%= getServerStartTime()%>"; window.onload=function(){ setServerDateAndTim

获取日期和时间服务器后,我将更新服务器日期和时间的时间增量1秒。
问题:
显示后,它将在浏览器中变慢。我想需要
1004ms
增加
1秒
。在
Chrome
中它看起来不错,但在
IE8中它会变慢
我的方法:

var serverdate = null;
var elapsedSecond = null;
var startTime = "<%= getServerStartTime()%>";
window.onload=function(){
     setServerDateAndTime();
 };
 function setServerDateAndTime() {
 var currenttime= 'July 06, 2013 13:10:20';
 serverdate = new Date(currenttime);

 elapsedSecond = callAjax(startTime); //It Gets actual Elapsed Second
 serverdate.setSeconds(serverdate.getSeconds() + parseInt(elapsedSecond, 10));
 setInterval(displaytime, 1000); 
 }

 function displaytime(){
    serverdate.setSeconds(serverdate.getSeconds()+1);
    var timestring = serverdate.getHours()+":"+serverdate.getMinutes()+":"+serverdate.getSeconds();
    var date = serverdate.getFullYear() + ""+(serverdate.getMonth() + 1) +""+ serverdate.getDate();
    document.getElementById("serverDateTime").innerHTML = date +"  " + timestring;
}
function callAjax(value1) {
    var result="";
    var dataObj = {serverStartTime : value1};
    $.ajax({
        type : "POST",
        url : '${pageContext.request.contextPath}/utility/frameredirect/elapsedTime.action',
        dataType : 'text',
        data : dataObj,
        cache : false, // guarantees jsp is always called
        async: false,
        success: function(data) {
            result = data;
        }
   });
    return result;
}
var serverdate=null;
var elapsedsond=null;
var startTime=“”;
window.onload=function(){
setServerDateAndTime();
};
函数setServerDateAndTime(){
var currenttime='2013年7月6日13:10:20';
serverdate=新日期(当前时间);
elapsedsond=callAjax(startTime);//它获取实际经过的秒数
setSeconds(serverdate.getSeconds()+parseInt(elapsedsond,10));
设置间隔(显示时间,1000);
}
函数displaytime(){
serverdate.setSeconds(serverdate.getSeconds()+1);
var timestring=serverdate.getHours()+“:”+serverdate.getMinutes()+“:”+serverdate.getSeconds();
var date=serverdate.getFullYear()+“”+(serverdate.getMonth()+1)+“”+serverdate.getDate();
document.getElementById(“serverDateTime”).innerHTML=date+“”+timestring;
}
函数callAjax(value1){
var结果=”;
var dataObj={serverStartTime:value1};
$.ajax({
类型:“POST”,
url:“${pageContext.request.contextPath}/utility/frameredirect/elapsedTime.action”,
数据类型:“文本”,
数据:dataObj,
cache:false,//保证始终调用jsp
async:false,
成功:功能(数据){
结果=数据;
}
});
返回结果;
}

我怎样才能解决这个问题?任何想法都将不胜感激

发生此问题是因为您正在找出秒数的差异,但设置间隔是基于毫秒设置的。因此,当它开始运行时,即使是毫秒也会继续,加起来就是秒差

因此,在守则中:

function setServerDateAndTime() {
    var currenttime= 'July 06, 2013 13:10:20';
    serverdate = new Date(currenttime);
    elapsedSecond = callAjax(); //It Gets actual Elapsed Second
    serverdate.setSeconds(serverdate.getSeconds() + parseInt(elapsedSecond, 10));
    setTimeout(displaytime, (60-parseInt(elapsedSecond, 10))*1000); 
}
假设callAjax()方法给出实际经过的秒数,然后用60减去elapsedSecond将得到秒数的差值。所以你可以试试这样的东西,60parseint(elapsedsond,10)

另外,在另一个方法中,可以使用setInterval重复调用displaytime()方法


您是否希望用户在您的页面停留半小时,然后在页面上的时钟显示错误7秒时感到压力;)?无论如何,计时器不能保证在给定的时间内准确地执行任务,而是延迟至少与给定的数量一样长。问题是速度变慢…如果站点处于空闲状态,那么时间将不正确…我恐怕没有解决方法。您可以尝试分割差异(
setInterval(displaytime,998)
)。或者每10分钟读取一次新的“服务器时间”。您也可以使用
setTimeout()
而不是
setInterval()
。请访问以了解更多有关计时器的信息。@Teemu..好的,谢谢您提供的链接和信息…否则只需每隔50秒打一次ajax电话以获取最新的服务器时间并进行更新…就这样…因为它是服务器time@AnubhavRanjan看起来更好,但可能与OP的原始代码有相同的问题。。。您需要根据调用之间经过的时间更改延迟。@Teemu这是第一个函数调用必须通过获得时间差来完成的。关于callAjax()方法返回什么,我没有足够的数据。基于此,如果您计算并找到差异,则第一个setTimeout()将与实际差异对齐,其余1秒更新将由displaytime()方法中的setTimeout()处理。@SJnawali实际如何处理?或者它根本不使用AJAX,尽管名称不同。当使用普通的异步AJAX调用时,
elapsedsond
将在
callAjax()
@SJnawali之后使用的下一行中未定义。这将对我们有帮助。
function displaytime(){
    setTimeout(function () { displaytime(); }, 1000);
    serverdate.setSeconds(serverdate.getSeconds()+1);
    var timestring = serverdate.getHours()+":"+serverdate.getMinutes()+":"+serverdate.getSeconds();
    var date = serverdate.getFullYear() + ""+(serverdate.getMonth() + 1) +""+ serverdate.getDate();

}