2012-01-28 71 views
0

我有jPlayer(jQuery音頻播放器)的實例:jPlayer1,jPlayer2,jPlayer3,jPlayer4,每個都初始化並預加載了音頻文件。如何增加jQuery元素ID

下面的調用函數將遍歷現有的數組並添加播放預加載音頻的方法。

function addPlayAudioMethodToExerciseArray(){ 
    for (i in qaArray){ 
     qaArray[i].playAnswer = function(){ $('#jPlayer'+i).jPlayer('play',0);} 
    } 
} 

它創建除了一部分( '#jPlayer' + I)好嗎的方法並不評估,以成爲( '#jPlayer1'),( '#jPlayer2')等

許多提前致謝。 注:我是一個noob。

+0

這是爲這些新的JavaScript一種極爲常見的陷阱。 – Pointy 2012-01-28 14:19:18

+0

你能告訴我們什麼包含qaArray? - 在你(我在qaArray)你的我開始爲0,所以第一個'#jPlayer'+我會'#jPlayer0'...這不存在。我也認爲你必須添加一些閉包,否則我將永遠是最後一個(qaArray.length-1)。 – dievardump 2012-01-28 14:21:27

+0

我簡化了發佈過程。原始代碼有if(i> 0){//開始遍歷}。所以是的,該方法是從qaArray [1]開始添加的。它在'#jsPlayer1'是硬編碼時有效。當然,所有的方法只是觸發相同的jsPlayer1;沒有打算。 – 10davvid 2012-01-28 14:56:14

回答

2

問題是,所有那些「playAnswer」函數都包裹在同一個「i」變量中。也就是說,只有一個「我」(在這種情況下,因爲你沒有用var來聲明它,這是全球性的!)。

您需要做的是使用另一個函數爲每個回調提供一個單獨的「i」。

function addPlayAudioMethodToExerciseArray(){ 
    function makePlayerCallback(i) { 
     return function() { 
     $('#jPlayer' + i).jPlayer('play', 0); 
     }; 
    } 

    for (var i = 0; i < qaArray.length; ++i){ 
     qaArray[i].playAnswer = makePlayerCallback(i); 
    } 
} 

的「makePlayerCallback」功能都有自己的參數「I」,其中,作爲有效的本地功能,將導致有自己的「我」單獨的回調函數。對該函數的每次調用都會在返回的回調函數週圍創建所謂的「閉包」。 (請注意,我的循環從零開始;如果HTML中的標識符從1開始,那麼您需要在某處添加1來解釋該標識。感謝@DieVarDump註釋。)

請注意,我聲明瞭「i」在循環中使用var使其成爲「addPlayAudioMethodToExerciseArray」的本地(這是一個很長的函數名;我希望你不必經常輸入它:-)。此外,我使用它作爲數字索引,假設「qaArray」實際上是一個誠實的天才數組,而不僅僅是n個對象。對數組使用數字索引是一種很好的做法。

+1

如果ID確實從1開始(jPlayer1,jPlayer2,jPlayer3,jPlayer4),則必須調用makePlayerCallback(i + 1);因爲數組索引從0開始 – dievardump 2012-01-28 14:33:26

+0

@DieVarDump確實 - 我會更新答案。 – Pointy 2012-01-28 14:34:03

+0

console.debug仍然顯示: playAnswer:function(){$('#jPlayer'+ i).jPlayer('play',0);} – 10davvid 2012-01-28 14:40:10

0

使用colsures

試試這個:

for(i in qaArray) 
    { 
     qaArray[i].playAnswer = function (num) 
     { 
      return function() 
      { 
       $('#jPlayer' + num).jPlayer('play', 0); 
      } ; 
     }(i) 
    };