这是个有问题的定时程序,希望大家能帮忙解释一下为什么错误,不需要给出其它解决方案,简洁且通用的方法我已经找到,只是不明白这个效果产生的原因,希望大侠能给出合理的解释,小生感激不尽。出现的问题是:
ie下:当点击“点击发送短信随机码”后,开始倒计时(button不可编辑,出现倒计时),如果此时点击中断,等几秒钟后,点击“确定”,倒计时将继续,然后过一会儿button可编辑,button的value变成“点击发送短信随机码”,然后弹出了个“a”,点击“确定”后,button上的value又变成了“n秒后可重新发送”。setTimeout中明明把setInterval已经清除了,为什么setInterval又执行了一次呢?<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
<script type="text/javascript" src="jquery.js"></script>
<style type="text/css">
.main{
border:solid 1px black;width:300px;height:50px;padding-top:20px;
}
.title{
margin-top:-27px;margin-left:20px;position:relative;z-index:2;background:white;width:80px;font:12px bold;text-align:center;
}
.body{
width:100%;text-align:center;padding-top:5px;
}
.zs{
font-size:12px;
}
</style>
</head>
<body>
<span class="zs">注:这是个错误的例子</span><br/><br/>
<div class="main">
<div class="title">测试用例1</div>
<div class="body">
<input type="button" value="点击发送短信随机码" id="msg1" onclick="sms1()"/>
<input type="button" value="点击" onclick="alert('中止');"/>
</div>
</div>
  
<script type="text/javascript">
//测试用例1
function sms1(){
var time=5;
$("#msg1").val(time+"秒后可重新发送");
$("#msg1").attr("disabled","disabled");
var itv=setInterval(function(){
time--;
$("#msg1").val(time+"秒后可重新发送");
},1000);
setTimeout(function(){
clearInterval(itv);
$("#msg1").removeAttr("disabled");
$("#msg1").val("点击发送短信随机码");
alert("a");
},time*1000);
}
</script>
 </BODY>
</HTML>

解决方案 »

  1.   

    setInterval自动结束了,并没有调用setTimeout中的clearInterval,可以把setTimeout的时间设置长一点试试。
      

  2.   

    setInterval怎么会自动结束呢?setTimeout的时间设置长一点的话,如果点击“中断”后,不点击确定,搁时间长一点再点击确定,一样会出现之前出现的情况。
      

  3.   

    哪位大侠能从线程角度帮忙分析下,我的理解是:
    setInterval和setTimeout分别开启了新的线程,当到达定时时间时,将任务(定时器中的方法)放入单线程的javascript引擎队列中,等待执行。当alert时,javascript引擎挂起,但计时器继续运行,setInterval每隔一段时间将任务往任务队列中添加一个任务,setTimeout在到达指定时间后往队列中添加一个任务,这样的话,当点击“确定”后,应该是先执行队列中的interval,无间断的执行n个,然后执行timeout,然后继续是无间断的n个interval,可是结果却不是,不明白!希望大侠指教
      

  4.   

    对,在setTimeout的函数中被clearInterval了以后又执行了一次(IE下)
      

  5.   

    两次定时器之间一定会有一点时间的间隙。所以不是那么准。很有可能clear的时候,线程正好走到setInterval那个函数的第一句。那他最后一次一定会执行完的。
      

  6.   

    这就是正确解释啊。。并不是你一clear就会马上停止,而是会从下一次开始停止。