问答详情
源自:5-1 JS链式动画

为什么这个运动框架调用不后调函数

function startMove(obj,json,func){
    clearInterval(obj.timer);
    var i = true;//假设所有运动都完成
    obj.timer = setInterval(function(){
        //1.取值
        for(var arrt in json){
        var ice = 0;
        //判断是否是透明度
        if(arrt == 'opacity'){
            ice = Math.round(parseFloat(getStyle(obj,arrt))*100);//当前透明度数值
            }else{
            ice = parseInt(getStyle(obj,arrt));//当前数值
                }
        //2.计算速度        
        var speed = (json[arrt]-ice)/5;
        //做缓冲运动的值的取整,如果大于0,向上取整;小于0,向下取整。
        speed = (speed>0)?Math.ceil(speed):Math.floor(speed);
        //3.检查停止
        if(ice != json[arrt]){                                
            i = false;//假如当前值不等于目标值,继续执行以下操作。
                }                                
              if(arrt == 'opacity'){
                  //针对IE浏览器
                  obj.style.filter = 'alpha(opacity:'+(ice+speed)+')';
                  //针对FireFox(火狐浏览器)/Chrom(谷歌浏览器)
                  obj.style.opacity = (ice+speed)/100; 
                  }else{
                  obj.style[arrt] = ice + speed + 'px';  
                      }                
            }
        if(i){//假如i成立(等于true),关闭计时器
            clearInterval(obj.timer);
            if(func){//判断是否还有后调函数    
                func();
            }                
          }
        },30);
    }



提问者:手刃情人 2016-04-20 15:14

个回答

  • csusun
    2016-04-20 17:50:18
    已采纳

    var i = true;这句话放在定时器里面 for循环前面 。

    因为flag如果定义在定期器外,flag只执行了一遍,当循环了一次后,flag变成了false就不会再改变了。

    flag一直都是false,就无法关闭定时器和执行下一个函数了。