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>
展开
 我来答
cmoooo
2012-04-22 · TA获得超过3587个赞
知道小有建树答主
回答量:741
采纳率:0%
帮助的人:670万
展开全部
你的这套程序好像没什么问题吧?

在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通过,就调用,否则何止,比我刚刚给你的程序灵活性更高(字数到限了,无法贴程序了)
没有响应m2
2012-04-23 · TA获得超过8387个赞
知道大有可为答主
回答量:7579
采纳率:33%
帮助的人:3494万
展开全部
......1楼那个根本不靠谱
我是ie8 根本不行
setTimeout(function(){clearTimeout(timer12)},timeout);
在ie里不能自动在setTimeout里调用clearTimeout
只能通过onclick这样的手动方式调用
input type="button" value="Stop count!" onClick="setTimeout('clearTimeout(timer12)',10000)">
追问
真的吗? 你有资料根据吗?  效果的确如此,不过最好有资料根据,那样就太好了
追答
.这东西去那找资料啊 一个浏览器一个样..........
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
左手编码
2012-04-23 · TA获得超过756个赞
知道小有建树答主
回答量:421
采纳率:0%
帮助的人:350万
展开全部
<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下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式