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

时间:2011-04-12 19:44:19

标签: jquery

我有一个$("").load调用来获取数据并将其转储到几个div中。每个div都有一个唯一的ID,我跟踪For循环中的索引变量。我在这个循环中做了几个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("");

           }
    );

}

5 个答案:

答案 0 :(得分:5)

您可以将entier循环体(或仅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));
}

但你不一定需要索引。您可以使用#eventX访问回调内的this元素,#dateX元素是下一个兄弟。所以你可以简单地做

for(var i=1;i<=daysNum;i++) {
    // other stuff
    $("#event"+index).load('...', function (){
        if($(this).html() === "") {
            $(this).next().empty();
        } 
    });
}

更可读的imo。

答案 1 :(得分:1)

我认为问题在于加载回调函数。

在事件和日期元素选择器之前,您没有错过“#”。

尝试使用此版本进行加载回调:

function (data){            
    if($("#event"+i).html()=="")               
        $("#date"+i).html("");           
} 

答案 2 :(得分:1)

for(var i=0; i<x; i++){
  Ajax(...,function(i) {
    // in callback !
    return function(data) {
      //Work with i:)
    };
  }(i));

答案 3 :(得分:0)

我找不到更好的方法,但您可以使用带有数据参数的ajax请求发送索引,然后将其与回调中的响应一起返回。

答案 4 :(得分:0)

您可以将div唯一索引作为div ID,div .data()或甚至metadata plugin传递。另一个选择是使用闭包。