亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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動畫效果
  • 參與學習       113918    人
  • 解答問題       1502    個

通過本課程JS動畫的學習,從簡單動畫開始,逐步深入各種動畫框架封裝

進入課程

flag的 問題?。。∏蟠笊窠忉?/h1> 我要回答 關注問題

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號