2011-03-24 47 views
0

可能重複我的頭:
Javascript closure inside loops - simple practical exampleJavaScript進行環閉合......似乎無法環繞此

我怎樣才能使這項工作?

// Phrases 

var phrases = new Array(); 
phrases[0] = 'Phrase 1'; 
phrases[1] = 'Phrase 2'; 
phrases[2] = 'Phrase 3'; 

for (var i = 0; i < phrases.length; i++) { 
    var content = phrases[i];   
    $('#phrase').html(content).slideDown('slow').delay(1000).fadeOut('slow');  
}; 

這裏的HTML:

<p id="phrase"></p> 

薪火內容可變進HTML()功能我注意到,內容總是等於陣列中的最後一句,和循環運行幻燈片/延遲/淡入淡出功能3次。

我知道這是關於for循環中的閉包,我已經看過無數的例子,但我無法繞開它。有人可以向我解釋和解釋這一個嗎?編輯:

編輯:道歉,因爲之前不清楚,我編輯了這個問題,包括HTML和有問題的陣列。

功能性:不同短語在短語保持[]陣列,我想短語插入<p>元件,然後向下滑動該元素,離開它在屏幕上的第二,然後褪色它出。然後我想轉到短語[]數組中的下一個短語並執行相同的功能。

+0

循環實際上在做什麼是選擇具有該id的元素並在循環的每次迭代中寫入它,因此它每次都覆蓋它直到最後一次迭代。解釋你想做什麼 – 2011-03-24 02:54:12

+0

謝謝蠟筆小新,我已經更新了這個問題以反映我正在嘗試做什麼。 – FrediDoo 2011-03-24 03:18:06

+0

現在不延遲(1000)實際返回控制並插入一個任務,從現在開始1秒,或者從現在開始1000秒(原型需要幾秒鐘)?如果是這樣,循環將執行得非常快,然後在1秒鐘後,所有排隊的屏幕變化將很快發生。另外,我不確定delay()的語句在語法上是否有效,至少在與prototype.js一起使用時是如此。雖然我沒有嘗試過。 – Paul 2011-03-24 04:32:07

回答

1

您實際上並沒有關閉的問題,它只是在每次迭代時將innerHTML設置爲content,而沒有考慮到需要先完成的效果。

var showPhrase = function(phrases, start) { 
    start = start || 0; 
    var showNext = function() { 
     $('#phrase') 
     .html(phrases[start]) 
     .slideDown('slow') 
     .delay(1000) 
     .fadeOut('slow', function() { 
      start++; 
      if (start < phrases.length) { 
       showNext(); 
      } 
     }); 
    } 
    showNext(); 
} 

showPhrase(['a', 'b', 'c']); 

jsFiddle

+0

嗨,亞歷克斯,謝謝你的迴應。這當然是有效的,但我希望能夠顯示短語數組中所包含的短語,與字母a,b和c相對應。 – FrediDoo 2011-03-24 03:21:34

+0

對不起,鍵盤問題 - 我怎麼修改你的腳本,以便它可以讀取數組本身的短語? – FrediDoo 2011-03-24 03:22:23

+0

@FrediDoo:check out ** [this](http://jsfiddle.net/G9RvQ/2/)** – qwertymk 2011-03-24 03:37:00