2012-10-03 101 views
2

我沒有什麼問題。我正在與一家公司的API合作。我要求參加活動,他們回報我一系列的活動。這是代碼的一部分。Javascript onclick顯示數組的最後一個元素與for循環

client.requestActivities(function(activities) { 
     if (activities.length > 0) { 
      for(i=0; i < activities.length; i++) { 
       var activity = activities[i]; 
       activity.onStart(function() { alert(i+ " started"); }); 
       activity.onCredit(function() { alert(i+ " credit"); }); 
       activity.onClose(function() { alert(i+ " close"); }); 
       activity.onFinish(function() { alert(i+ " finish"); }); 
          $('.Game-Screen-Footer').append('<div class="Game-Screen-Footer-Adv" id="foota'+i+'"><a href="javascript:;" ><img src="'+activity.image_url+'" alt="'+activity.display_text+'" width="190" height="110"></a></div>'); 
       document.getElementById('foota'+i+'').onclick = function() { 
       ARNO.box.show({html:'<div id="socialVibeFancyBox0"></div>', close: false, width:activity.window_width, height:activity.window_height, openjs: 
          function(){ 
           client.loadActivityIntoContainer(activity, 'socialVibeFancyBox0'); 
          } 
         }); 
      } 
     } 

}

晴,該功能給回陣列3層的元件。但是當我點擊第一個活動時,onStart它應該提醒我(0開始),但是它會提醒(4開始),這意味着它提醒我最後一個元素。我應該如何解決這個問題?我嘗試了很多東西,但我沒有找到解決方案,也許你可以幫助我?

回答

4

這是關閉問題的另一種情況。試試這個:在for

for(i=0; i<activities.length; i++) { 
    (function(i) { 
     // your code here 
    })(i); 
} 
+0

@Kolnik:聽起來很有意思。你需要一個參考問答來詳細解釋這個*封閉問題*嗎? – hakre

0

移動的膽量了一個函數,並傳入需要單獨範圍的值。

for(i=0; i < activities.length; i++) { 
    setUpActivity(i, activities[i]); 
} 

function setUpActivity(i, activity) { 

    activity.onStart(function() { alert(i+ " started"); }); 
    activity.onCredit(function() { alert(i+ " credit"); }); 
    activity.onClose(function() { alert(i+ " close"); }); 
    activity.onFinish(function() { alert(i+ " finish"); }); 
    ARNO.box.show({ 
     html:'<div id="socialVibeFancyBox0"></div>', 
     close: false, width:activity.window_width, 
     height:activity.window_height, 
     openjs:function(){ 
        client.loadActivityIntoContainer(activity, 'socialVibeFancyBox0'); 
       } 
      }); 
} 

甲功能調用創建一個新的變量範圍。在函數中創建的任何變量或參數都將處於其自己的範圍內,並且在同一範圍內創建的函數將具有對這些變量的永久引用。

0

如果你不關心IE8-然後ES5已經解決了這一問題forEach

activities.forEach(function(v, i){ 
    // now 'i' will work anywhere within this scope 
}); 
相關問題