问题描述
|
我有一个“ 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()
甚至在元数据插件中传递。另一种选择是使用闭包。