javascript的问题。 求教
<divid="timer">0</div><script>vartimeout=10000;varsuntime=120;vartimer12=null;timedCo...
<div id="timer">0</div>
<script>
var timeout = 10000;
var suntime = 120;
var timer12 = null;
timedCount();
// 设计目的: 10秒后,让timer12暂停。
// 问题在这里,为何timeout秒后,timer12定时器无法被停止? IE不能停,但是Chrom可以
setTimeout(function(){clearTimeout(timer12)},timeout);
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
if (suntime <= 0)
{
clearTimeout(timer12);
document.getElementById('timer').innerHTML = "";
alert('ending');
}
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},1000);
}
</script> 展开
<script>
var timeout = 10000;
var suntime = 120;
var timer12 = null;
timedCount();
// 设计目的: 10秒后,让timer12暂停。
// 问题在这里,为何timeout秒后,timer12定时器无法被停止? IE不能停,但是Chrom可以
setTimeout(function(){clearTimeout(timer12)},timeout);
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
if (suntime <= 0)
{
clearTimeout(timer12);
document.getElementById('timer').innerHTML = "";
alert('ending');
}
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},1000);
}
</script> 展开
3个回答
展开全部
你的这套程序好像没什么问题吧?
在IE里也可以正确执行啊。
你的IE什么版本?
————————————————————
十秒后自动停止的那部分是没问题的,可却还有个问题,就是在递归里:
而且,这个程序是你程序的逻辑问题,不是浏览器问题:
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
if (suntime <= 0)
{
clearTimeout(timer12); //----------------------你在这里把时间停掉了对吧?
document.getElementById('timer').innerHTML = "";
alert('ending');
}
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},20); //-----------然后程序到这里又开始了一次新的定时,所以,你上面的判断,然后停止时间根本没用。
}
这个你应该写成下面的样子:
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
if (suntime <= 0)
{
clearTimeout(timer12);
document.getElementById('timer').innerHTML = "";
alert('ending');
}else{
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},20);
}
}
_____________________或者是:
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
if (suntime <= 0)
{
clearTimeout(timer12);
document.getElementById('timer').innerHTML = "";
alert('ending');
rerutn; //---------------在这里中止程序
}
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},20);
}
在IE里也可以正确执行啊。
你的IE什么版本?
————————————————————
十秒后自动停止的那部分是没问题的,可却还有个问题,就是在递归里:
而且,这个程序是你程序的逻辑问题,不是浏览器问题:
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
if (suntime <= 0)
{
clearTimeout(timer12); //----------------------你在这里把时间停掉了对吧?
document.getElementById('timer').innerHTML = "";
alert('ending');
}
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},20); //-----------然后程序到这里又开始了一次新的定时,所以,你上面的判断,然后停止时间根本没用。
}
这个你应该写成下面的样子:
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
if (suntime <= 0)
{
clearTimeout(timer12);
document.getElementById('timer').innerHTML = "";
alert('ending');
}else{
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},20);
}
}
_____________________或者是:
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
if (suntime <= 0)
{
clearTimeout(timer12);
document.getElementById('timer').innerHTML = "";
alert('ending');
rerutn; //---------------在这里中止程序
}
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},20);
}
追问
啊呀,不好意思
rerutn; //---------------在这里中止程序
这句话,我是加着的,贴上来的时候,不小心删除了。
不过程序还是不能按预期运行的,一直会从120倒数到0,然后ending一直弹出,关都关不完。
我是在IE6下测试的。 你的效果是对的吗? 测试环境是什么
追答
是我测试得片面了,另外有些孤陋寡闻了。
”没有响应m2“网友提醒过后,我在XP系统下的IE6浏览器中进行了测试,确实存在这样的问题!
但是在win7 旗舰 64位系统下的IE8中,绝对是正常执行的,这一点不用怀疑,我亲自做了许多浏览器的测试。
后来上网查找了几篇关于类似问题的文章,基本上没有能够通过什么有效手段解决的。
我自己也做了许多测试,另外,本身在JS里,JS就是纯单线程的,而像setTimeout、setInterval这些定时器,与windows对象就不可避免地产生了一个caller断层,或许就是这个断层,使得它无法停止已经设置的setTimeout指针,而高版本的IE和其它浏览器,就修正了这个BUG。
然而,像”没有响应m2“网友所讲,只要使用了事件,就不存在这样的问题,那就更能说明这个问题,事件是直接从window对象引用过来的,也就不存在这个断层。
虽然这个问题现在看来没有好的解决办法,但是,以我的观点来看,并不是不可解决,而是看你要实现的目的和程序结构,既然在IE6下有这类问题,那就从我们最初的要求出发,更改实现过程:
你的这段程序的目的,就是想要通过一个延时,来停止另一个延时,是吧?
那么我们设置一个时间基数,就按1秒来计算吧。
程序如下:
(这段程序仅仅是个编程思想的范例,实际应用时一定会比这复杂得多,但总体是大同小异的)
0
var timeout = 10;//以基数为准的中止时间
var timeBase = 1000; //以一秒为时间基数
var suntime = 120;
var tempTiem = suntime;
timedCount();
function timedCount(){
document.getElementById('timer').innerHTML = tempTiem;
if(suntime-tempTiem == timeout){
document.title = '中止计时';
return;
}else if(suntime
------
另外,我也写过许多类似的代码,但编程风格和楼主的不一样,和我刚刚表达的代码风格也不一样,我是设定一个全局的index,也就是索引,然后在延时调用的时候去判断这个index,如果index通过,就调用,否则何止,比我刚刚给你的程序灵活性更高(字数到限了,无法贴程序了)
展开全部
......1楼那个根本不靠谱
我是ie8 根本不行
setTimeout(function(){clearTimeout(timer12)},timeout);
在ie里不能自动在setTimeout里调用clearTimeout
只能通过onclick这样的手动方式调用
input type="button" value="Stop count!" onClick="setTimeout('clearTimeout(timer12)',10000)">
我是ie8 根本不行
setTimeout(function(){clearTimeout(timer12)},timeout);
在ie里不能自动在setTimeout里调用clearTimeout
只能通过onclick这样的手动方式调用
input type="button" value="Stop count!" onClick="setTimeout('clearTimeout(timer12)',10000)">
追问
真的吗? 你有资料根据吗? 效果的确如此,不过最好有资料根据,那样就太好了
追答
.这东西去那找资料啊 一个浏览器一个样..........
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
<div id="timer">0</div>
<script>
var timeout = 10000;
var suntime = 120;
var timer12 = null;
timedCount();
// 设计目的: 10秒后,让timer12暂停。
// 问题在这里,为何timeout秒后,timer12定时器无法被停止? IE不能停,但是Chrom可以
//下面这句话没有用
setTimeout(function(){clearTimeout(timer12)},timeout);
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},1000);
//alert(timer12);
if (suntime <= 110)
{
clearTimeout(timer12);
document.getElementById('timer').innerHTML = "";
alert('ending');
}
}
</script>
每执行一次timer12 = setTimeout(function(){timedCount();},1000);timer12的值都会改变,而定时器的值不会改变,它仍然会采用之前的值。所以clearTimeout必须在setTimeout的后面且在它执行前clear掉。等到suntime 小于0的时候,clear掉的是上一个定时器(也许上一个定时器早就执行完了,它什么都没做),所以每一次都会alert('ending')。如果你要定时跳出建议把它放在函数里面判断,不要单独拿出来:setTimeout(function(){clearTimeout(timer12)},timeout);总之,要保证顺序。
以上测试在IE8下
<script>
var timeout = 10000;
var suntime = 120;
var timer12 = null;
timedCount();
// 设计目的: 10秒后,让timer12暂停。
// 问题在这里,为何timeout秒后,timer12定时器无法被停止? IE不能停,但是Chrom可以
//下面这句话没有用
setTimeout(function(){clearTimeout(timer12)},timeout);
function timedCount()
{
document.getElementById('timer').innerHTML = suntime;
suntime = suntime - 1;
timer12 = setTimeout(function(){timedCount();},1000);
//alert(timer12);
if (suntime <= 110)
{
clearTimeout(timer12);
document.getElementById('timer').innerHTML = "";
alert('ending');
}
}
</script>
每执行一次timer12 = setTimeout(function(){timedCount();},1000);timer12的值都会改变,而定时器的值不会改变,它仍然会采用之前的值。所以clearTimeout必须在setTimeout的后面且在它执行前clear掉。等到suntime 小于0的时候,clear掉的是上一个定时器(也许上一个定时器早就执行完了,它什么都没做),所以每一次都会alert('ending')。如果你要定时跳出建议把它放在函数里面判断,不要单独拿出来:setTimeout(function(){clearTimeout(timer12)},timeout);总之,要保证顺序。
以上测试在IE8下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询