2013-10-03 78 views
0

我試圖創建一個循環我的單詞動畫的回調函數。我創建了一個jQuery的函數,使用某種顏色淡入淡出每個單詞。我希望這個小動畫能夠正確循環。問題是,一旦我回調函數它不會從頭開始,它會重複最後一個代碼。所以在這個例子中,你會看到關鍵詞多用途兩次。jQuery的回調函數觸發循環前的最後一行

點擊here查看我的意思的時間樣本。

這是我的jQuery代碼:

function wordfade(){ 
     $('#msg').fadeIn(2000, function() { 
      $('#msg').html("Sustainable").css("color", "#3AE44E").delay(800).fadeOut(2000, function() { 
       $('#msg').fadeIn(2000).html("Eye Catching").css("color", "#F18D0B").delay(800).fadeOut(2000, function(){ 
        $('#msg').fadeIn(2000).html("Modern Design").css("color", "#0B8DF1").delay(800).fadeOut(2000, function(){ 
         $('#msg').fadeIn(2000).html("Energy Efficient").css("color", "#AD0BF1").delay(800).fadeOut(2000, function(){ 
          $('#msg').fadeIn(2000).html("Restaurant").css("color", "#F10B0B").delay(800).fadeOut(2000, function(){ 
           $('#msg').fadeIn(2000).html("Retail & Pop-Up").css("color", "#C39813").delay(800).fadeOut(2000, function(){ 
            $('#msg').fadeIn(2000).html("Event Space").css("color", "#4FB186").delay(800).fadeOut(2000, function(){ 
             $('#msg').fadeIn(2000).html("Bar & Lounge").css("color", "#F10BA3").delay(800).fadeOut(2000, function(){ 
              $('#msg').fadeIn(2000).html("Residential").css("color", "#C7C7C7").delay(800).fadeOut(2000, function(){ 
               $('#msg').fadeIn(2000).html("Hotel & Lodging").css("color", "#565457").delay(800).fadeOut(2000, function(){ 
                $('#msg').fadeIn(2000).html("Multi-Purpose").css("color", "#F1880B").delay(800).fadeOut(2000, wordfade); 
               }) 
              }) 
             }) 
            }) 
           }) 
          }) 
         }) 
        }) 
       }) 
      }) 
     }); 
    } 
    wordfade(); 
+0

這在某種程度上使我想起了ASCII藝術.. :-) – techfoobar

+2

我試圖進入'OMG'但我的意見是太短了。 – Andy

+0

http://jsfiddle.net/2WG4J/ < - 將你的確切代碼複製到小提琴中,縮短了時間,它似乎工作得很好 – Fenixp

回答

6

函數的第一行執行.fadeIn(),並在下一行設置.html()之前等待它完成。所以第二次它淡入,而html的內容仍然是最後的話。只是結合前兩行看起來更像其他線路,也將努力:

function wordfade() { 
    $('#msg').fadeIn(2000).html("Sustainable").css("color", "#3AE44E").delay(800).fadeOut(2000, function() { 
     $('#msg').fadeIn(2000).html("Eye Catching").css("color", "#F18D0B").delay(800).fadeOut(2000, function() { 
     // etc. 

演示:http://jsfiddle.net/PNDg4/

再考慮重寫了整個事情,以避免很多嵌套回調:

var words = [ 
    { word : "Sustainable", color : "#3AE44E" }, 
    { word : "Eye Catching", color : "#F18D0B" }, 
    { word : "Modern Design", color : "#0B8DF1" }, 
    { word : "Energy Efficient", color : "#AD0BF1" }, 
    /* etc */], 
    current = -1; 

function wordfade() { 
    current = (current + 1) % words.length; 
    $("#msg").html(words[current].word) 
      .css("color", words[current].color) 
      .fadeIn(2000) 
      .delay(800) 
      .fadeOut(2000, wordfade); 
} 
wordfade(); 

演示:http://jsfiddle.net/PNDg4/1/

+0

我剛剛使用你的代碼,它完美的作品。這顯然比我的清晰得多。我想了解它,因爲它可能對學習有用。我不明白的部分代碼是當前的和它的編號。所以我沒有得到電流= -1;和current =(current + 1)%words.length;你能解釋一下嗎? –

+0

打在帖子:) – Archer

+0

Daniel,數組下標(在JS中)從第一個元素開始,數組長度減1到最後一個元素。所以我將_current_變量初始化爲-1,然後在函數的第一行增加它。 _%_是模運算符:它在將第一個操作數除以第二個操作數時返回餘數,因此最終當_current_遞增到數組長度時,它將被設置回零,以便保持循環遍歷陣列沒有跑過最後。 – nnnnnn

1

這是因爲它與$( '#味精')開始淡入(2000,()的函數,所以它在過去的內容變淡您應該結合$。 (「#msg」)。淡入(2000,()函數與第二行(還沒有測試它)

1

問題是與你的函數的#msg

的最後一個動作的內容衰落的開始的功能是將#msg設置爲「多用途」,並且你的功能的開始是淡入內容。 e開始你的函數集#msg,然後淡入。

+0

我剛分手你的小提琴,以顯示我在說什麼。 http://jsfiddle.net/5ubj4/1/ – jhnlsn

3

我感覺大方......

var index = 0; 
var words = [ 
    { text: "Sustainable", color: "#3AE44E" }, 
    { text: "Eye Catching", color: "#F18D0B" }, 
    { text: "Modern Design", color: "#0B8DF1" }, 
    { text: "Energy Efficient", color: "#AD0BF1" }, 
    { text: "Restaurant", color: "#F10B0B" }, 
    { text: "Retail & Pop-Up", color: "#C39813" }, 
    { text: "Event Space", color: "#4FB186" }, 
    { text: "Bar & Lounge", color: "#F10BA3" }, 
    { text: "Residential", color: "#C7C7C7" }, 
    { text: "Hotel & Lodging", color: "#565457" }, 
    { text: "Multi-Purpose", color: "#F1880B" }]; 

function wordfade() { 
    $("#msg") 
     .html(words[index].text) 
     .css("color", words[index].color) 
     .fadeIn(2000).delay(800).fadeOut(2000, function() { 
      index = ++index % words.length; 
      wordfade(); 
     }); 
} 

wordfade(); 

Working jsFiddle...

+1

+1只是帶你到7777代表。 (因爲如果你輸入的更快一些,你可能已經接受了答案 - 我想我們正在同時寫我們的答案。) – nnnnnn

+0

@nnnnnn哈哈 - 謝謝:) – Archer

相關問題