Javascript setInterval在显示服务器时间内每秒减慢速度
获取日期和时间服务器后,我将更新服务器日期和时间的时间增量1秒。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
问题:
显示后,它将在浏览器中变慢。我想需要
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();
}