marshall_stan
2015-08-26 18:47
我已经蹦了啊,要么不能实现同时运动到目标值,要么不能实现链式运动,已经试了将判断句放到各种位置,还是不能完美解决,哎!
将“var flag=true;”放入定时器内部,for in 循环的外部,解决定时器不能停止的问题。部分代码:
obj.timer=setInterval(function (){//定时器 var flag = true;//放在这里 for(var attr in json)//for in 循环 { //for in 内部 }
具体解释就是:第一次进入定时器,flag被定义,赋值为true,接着进入for in循环,for in中会判断各个属性是否达成目的,只要有一项未达成,将flag置为false,此时flag=false;跳出 for in循环后,判断,flag是否为true,部分代码:
if(flag)//判断 { clearInterval(obj.timer);//清空定时器
因为flag=false,所以if(flag)不成立,不清空定时器;燃火
第二次进入定时器,定时器内第一行,flag被置为true,接着进入for in循环,for in中继续判断,若有一项未达成,flag又被置为false;跳出for in循环后,判断是否清楚定时器;。。。。第三次进入、第四次进入,如此反复,当for in中全部达成时,flag不会被置为false,此时flag=true;跳出 for in循环,判断if(flag)成立,清除定时器,over。
链式运动问题:不能进行链式运动的最大阻碍是回调函数的参数传递问题;
方案A:
这是替换定时器中判断是否停止定时器那部分代码:
if(flag) { clearInterval(obj.timer); if(fn) { fn(obj);//将本次对象作为参数传入回调函数 //fn.call(obj);//对象替换 }
添加方法时的代码:
window.onload=function(){ var oLi = document.getElementById('li1'); oLi.onmouseover=function(){ startMove(oLi,{width:400,height:200,opacity:100},function(obj){//有参数 startMove(obj,{width:200,height:100,opacity:30},function(obj){//有参数 //startMove(obj,{width:400,height:200,opacity:100});//传递参数 }); }); } }
方案B:
定时器中:
if(flag) { clearInterval(obj.timer); if(fn) { //fn(obj);//将本次对象作为参数传入回调函数 fn.call(obj);//对象替换 }
添加方法时的代码:
window.onload=function(){ var oLi = document.getElementById('li1'); oLi.onmouseover=function(){ startMove(oLi,{width:400,height:200,opacity:100},function(){//无参数 startMove(this,{width:200,height:100,opacity:30},function(){//无参数 //startMove(this,{width:400,height:200,opacity:100});//传递this }); }); } }
其余代码,参考老师写的,这里是将对应的部位进行替换。如果运行有问题,稍微调试下,看看变量名、参数顺序是否对应。我自己测试,没有问题。
最后:下面这段代码紧跟flag=false;后面较为合理
if(attr=='opacity') { obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')'; obj.style.opacity=(iCur+iSpeed)/100; } else { obj.style[attr]=iCur+iSpeed+'px'; }
不好意思写错了。只需要将定义的flag=true;放入计时器中即可以完美解决问题。记住重新在浏览器中打开。
只需要将定义的flag=true;放入for循环即可以完美解决问题。记住重新在浏览器中打开。
JS动画效果
113925 学习 · 1443 问题
相似问题
回答 8
回答 1