我已经蹦了啊,要么不能实现同时运动到目标值,要么不能实现链式运动,已经试了将判断句放到各种位置,还是不能完美解决,哎!

来源:6-2 完美运动框架

marshall_stan

2015-08-26 18:47

我已经蹦了啊,要么不能实现同时运动到目标值,要么不能实现链式运动,已经试了将判断句放到各种位置,还是不能完美解决,哎!

写回答 关注

3回答

  • Diseaon
    2015-11-10 18:29:44
    已采纳

    将“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';
    }


    木木380

    方案A中不加参数,只需要将flag=true放入计时器中好像就可以了

    2016-09-04 09:35:08

    共 2 条回复 >

  • is陈小黑
    2015-08-31 22:01:51

    不好意思写错了。只需要将定义的flag=true;放入计时器中即可以完美解决问题。记住重新在浏览器中打开。

    一布工程师

    牛人,研究很久 终于解决该问题了

    2015-09-14 07:09:34

    共 2 条回复 >

  • is陈小黑
    2015-08-31 21:34:28

    只需要将定义的flag=true;放入for循环即可以完美解决问题。记住重新在浏览器中打开。

JS动画效果

通过本课程JS动画的学习,从简单动画开始,逐步深入各种动画框架封装

113925 学习 · 1443 问题

查看课程

相似问题