2012-10-03 80 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 
}); 
相关问题