javascript - 大家来看下这个定时器,为什么if必须放在里面才能清除掉这个定时器,外面就不行。
天蓬老师
天蓬老师 2017-04-10 16:10:02
[JavaScript讨论组]









Document






天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
黄舟

如一楼所说,if放在外面,它只执行一次,而且执行的时候op.offsetWidth应该还没>100,js是顺序执行下来的,也就是说,你setInterval执行一次的时候,就接下去执行if了,但当setInterval执行第二次的时候,并不会再执行if,而是重复得执行slide,就是酱紫。
当然,你原来那样写,直接在外面清除定时器,一点问题没有,只不过你需要加个

op.onmouseout=function(){
    //鼠标移出时,重新开启定时器
    timer=setInterval(slide,30);
}

还有一个问题很重要,在做条件判断的时候,要把if跟else写完整,true的时候才clearInterval,false才op.style.width=op.offsetWidth+2+"px";

function slide(){
     if(op.offsetWidth>100){
         clearInterval(timer);
     }else {
         op.style.width=op.offsetWidth+2+"px";
     }
}
ringa_lee

if放在外面的话,执行过一次就不会再执行啦,根本就不会重新获取opoffsetWidth,这样的话就永远不会清除定时器,但是放在里面的话,定时器每次调用slide的时候就会重新获取offsetWidth,这样当对应的值大于100的时候自然就会清除啦

ringa_lee

setInterval是一个异步操作。实际上当offsetWidth没大于100的时候就执行if了。

ps: 有个答案说if没执行的简直误人子弟!

巴扎黑

get*byId不是动态实时更新,并且setInterval相当于多开了一个线程,会顺序执行,执行到if的时候新开的线程还没有到达判断结果

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号