将附加计数器作为参数传递给回调

问题描述

| 我有一个“ 0”调用获取数据并将其转储到几个div中。每个div都有一个唯一的ID,我可以使用For循环中的index变量对其进行跟踪。我在此循环内进行了几次ajax调用。在回调函数中,我想再次使用此索引的值。但是,在执行回调时,for循环已经完成,索引变量始终具有循环的最高限值。 如何将值传递给该索引到回调函数? 编辑:
for (var i=1;i<=daysNum;i++)
{


    var tomorrow = new Date();
    tomorrow.setDate(tomorrow.getDate() + i); 


    var tmd=(tomorrow.getMonth()+1)+\'/\'+(tomorrow.getDate())+\'/\'+tomorrow.getFullYear();
    var tmdurl=(tomorrow.getMonth()+1)+\'%2F\'+(tomorrow.getDate())+\'%2F\'+tomorrow.getFullYear();

    $(\"#events\").append(\"<div><div id=\'event\"+i+\"\'></div><div id=\'date\"+i+\"\'>\"+tmd+\"</div></div>\");
    $(\"#event\"+i).load(seicalendarurl+\"/calendar.aspx?CalendarDate=\"+tmdurl+\"&CalendarPeriod=Day .ms-cal-tdayitem,.ms-cal-alldayevent\",function (data){
             if($(\"event\"+i).html()==\"\")
                $(\"date\"+i).html(\"\");

           }
    );

}
    

解决方法

您可以将整个循环体(或仅Ajax部分)包装到立即函数中,并将索引作为参数传递:
for(var i=1;i<=daysNum;i++) {
    // other stuff
    (function(index) {
        $(\"#event\"+index).load(\'...\',function (){
            if($(\"#event\"+index).html() === \"\") // you need `#` here too!
                $(\"#date\"+index).empty();       // you need `#` here too!
        });
    }(i));
}
但是您不一定需要索引。您可以使用
this
访问回调中的
#eventX
元素,而
#dateX
元素是下一个兄弟姐妹。所以你可以简单地做
for(var i=1;i<=daysNum;i++) {
    // other stuff
    $(\"#event\"+index).load(\'...\',function (){
        if($(this).html() === \"\") {
            $(this).next().empty();
        } 
    });
}
这是更易读的imo。     ,我认为问题在于加载回调函数。 在事件和日期元素选择器之前,您不会缺少\“#\”。 尝试使用此版本进行加载回调:
function (data){            
    if($(\"#event\"+i).html()==\"\")               
        $(\"#date\"+i).html(\"\");           
} 
    ,
for(var i=0; i<x; i++){
  Ajax(...,function(i) {
    // in callback !
    return function(data) {
      //Work with i:)
    };
  }(i));
    ,我找不到更好的方法,但是您可以通过带有data参数的ajax请求发送索引,然后在回调中返回响应。     ,您可以将div唯一索引作为div ID,div \'s
.data()
甚至在元数据插件中传递。另一种选择是使用闭包。