为了账号安全,请及时绑定邮箱和手机立即绑定

flag的 问题!!!求大神解释

我就纳闷了。按代码所示。flag放在定时器外面,最开始是true,执行第一次动画时,不是所有动画都到达,于是定时器的flag被设置为false,然后该干嘛就干嘛,接下来执行30毫秒后的第二次动画,于是乎,问题来了,作为startmove内的变量,定时器外的变量flag,已经被上一次的动画设置为了false,所以,接下来的判断语句flag永远是false,  等同于if(flag)这个是不可能实现的!!定时器内部也没有设置flag为true的语句,动画讲永远不停止!!真正的问题来了:屏幕中老师这样敲的代码,浏览器中居然能实现动画!!!求大神解释!!

正在回答

7 回答

你再看一看。

0 回复 有任何疑惑可以回复我~
#1

葛乌 提问者

我自己的理解是,flag要放在定时器里面,每执行一次,都会重置flag=true。这样才能运行。。放在外面,虽然老师的动画看起来能够执行。但是定时器永远是开着的,只是speed到后期为0,看起来就想是动画停止了一样··反复想应该是这样解释
2016-04-21 回复 有任何疑惑可以回复我~
#2

风_起 回复 葛乌 提问者

一个定时器改变多个属性,你可以看下我在你这条上面的方法(多个定时器改变对应的属性)。所以flag=true应该放在这唯一一个定时器中初始。还有,清除定时器,if(flag)你放在哪里?
2016-04-21 回复 有任何疑惑可以回复我~
#3

哈喽姑娘 回复 葛乌 提问者

你是对的,若用老师的方法,定时器都没关过,只是后面达到目标值后,speed等于0了,这样是无法再用回调函数完成链式运动的。要将flag放在定时器里面。
2016-04-29 回复 有任何疑惑可以回复我~
#4

葛乌 提问者 回复 哈喽姑娘

恩谢谢你的回复
2016-04-30 回复 有任何疑惑可以回复我~
查看1条回复

NeoWu222同学的方法,我试了,发现好像flag一直是处于为1,并没有加到3,也就是定时器还一直是开着的

0 回复 有任何疑惑可以回复我~
#1

qq_过去_3

是我自己看错。。。
2016-05-10 回复 有任何疑惑可以回复我~

我觉得不要加flag也可以吧,定时器一直开着应该没关系吧,所有的运动也能同时实现(个人想法,不知道行不行)

0 回复 有任何疑惑可以回复我~

这个问题和回答给力!给你们点个赞!

0 回复 有任何疑惑可以回复我~

不好意思json没有获取长度的属性或方法,所以要自己定义一个方法来获取

把最后一个if(flag == json.length)改为if(flag == getLength(json))

方法定义代码:

function getLength(json){

    var length = 0;

    for(var attr in json){

        length++;

    }

    return length;

}


1 回复 有任何疑惑可以回复我~
#1

葛乌 提问者

GET,感觉你这种计算flag的思路比视频里的更令人清晰!
2016-04-23 回复 有任何疑惑可以回复我~
#2

lzlbu2

太感谢了,看了这么多的回答,只有你的这个方法最好用,还解决了老师的bug
2016-05-14 回复 有任何疑惑可以回复我~

把flag初始为0;当有一个属性达到目标值时,flag自增1;当flag 等于 json的长度时再清楚定时器;

代码如下:

function startMove(obj,json,fn){

    clearInterval(obj.timer);

    obj.timer = setInterval(function(){

        var flag = 0;

        for(var attr in json){

            //1.取当前值

            var icur = 0;

            if(attr == 'opacity'){

                icur = Math.round(parseFloat(getStyle(obj,attr))*100);

            //是不是不需要parseFloat

            }else{

                icur = parseInt(getStyle(obj,attr));

            }


            //2.算速度

            var speed = (json[attr] - icur)/8;

            speed = speed>0?Math.ceil(speed):Math.floor(speed);


            //3.检测停止

            if(icur == json[attr]){

                flag++;

            }

            if(attr == 'opacity'){

                obj.style.filter = 'alpha(opacity:' + (icur + speed) + ')';//针对IE

                obj.style.opacity =  (icur + speed)/100;

                //针对chrome、FF

            }else{

                obj.style[attr] = icur + speed + 'px'; 

            }

            

            if(flag == json.length){

                    clearInterval(obj.timer);

                    if(fn){

                        fn();

                    }

                }

            }; 

    },20)

    

}


1 回复 有任何疑惑可以回复我~
#1

qq_过去_3

这样可以吗?我试了,flag好像一直都是为1,就往加到3的时候?
2016-05-09 回复 有任何疑惑可以回复我~
#2

protry

flag需要做全局变量吧
2016-05-17 回复 有任何疑惑可以回复我~
#3

jinleli 回复 protry

写在定时器里面是一样的虽然每次flag都会初始为0,但是只要本次定时执行时for循环每个属性都等于目标值,flag就会变为3定时就取消了
2016-05-29 回复 有任何疑惑可以回复我~
#4

jinleli 回复 protry

另外放在全局变量只要定时器执行一次for执行一次,每次定时执行都有一个属性满足目标值,那么很快flag就等于3了。所以要放在定时器里面,把上次定时得到的清0重新计数
2016-05-29 回复 有任何疑惑可以回复我~
查看1条回复

你试一下不就知道老师写的代码是对是错了。加个fn,做链式运动。看链式运动有木有?我个人估计应该是没有。flag设置成false之后,就再也没有变回true了。。。老师代码是有bug

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JS动画效果
  • 参与学习       113931    人
  • 解答问题       1443    个

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

进入课程

flag的 问题!!!求大神解释

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信