js获取服务器时间,但用了setInterVal后,就回到1970-1-1

var oDiv = document.createElement('div'); 
oDiv.id = 'div1'; 
document.body.appendChild(oDiv);
document.getElementById('div1').style.position="fixed";
document.getElementById('div1').style.left="0";
document.getElementById('div1').style.top="180px";
document.getElementById('div1').style['z-index']="200";
document.getElementById('div1').style.background="#38f";
document.getElementById('div1').style.color="#fff";


var time,nt,add1s;

ajax();
function ajax(){
      var xhr = null;
            if(window.XMLHttpRequest){
            xhr = new window.XMLHttpRequest();
            }else{ // ie
            xhr = new ActiveObject("Microsoft")
            }
      // 通过get的方式请求当前文件
      xhr.open("get","/");
      xhr.send(null);
      // 监听请求状态变化
            xhr.onreadystatechange = function(){
                  time = null,
                  curDate = null;
                if(xhr.readyState===2){
                      // 获取响应头里的时间戳
                      time = xhr.getResponseHeader("Date");
                      aa(time)//第一次执行的时候正常
setInterval("aa(time)",1000)//执行setInterval,就变成1970-1-1 8:00:00


                }
                
            }
}

function aa(time){
add1s=new Date(time).getTime()+1000;
nt=new Date();
nt.setTime(add1s);//设置新时间比旧时间多一秒
time=nt.setTime(add1s);//把新设置的时间赋给变量time,目的是在下次调用时,在多一秒的基础上继续加1秒
 document.getElementById('div1').innerHTML="服务器时间:"+nt.getFullYear()+"-"+(nt.getMonth()+1)+"-"+nt.getDate()+" "+nt.getHours()+":"+nt.getMinutes()+":"+nt.getSeconds();
 console.log("时间"+new Date(time))
}

图片描述

执行setInterval("aa(time)",1000)的时候就不正常了,是为什么呢?

阅读 3.9k
2 个回答

setInterval("aa(time)",1000)
改成

setInterval(function () {
  aa(time)
},1000)
time=null

去掉,或者移到 onreadystatechange 外


教你如何查错

  • 从第一次正常的现象可知: aa 没错。但后续都错了,只能说明: aa 的环境出了问题,在此为参数 time

  • 搜索所有有可能更改全局 time 的地方,你会发现: 当 readystate 不为 2时,time 会被置 null

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题