我循环遍历一系列网址。每个人从不同的域中获取一些jsonp数据。成功处理程序需要能够访问原始循环中的数据,但是当从回调调用时,它始终是最后一个值,而不是调用ajax函数时设置的值。如何访问或将此值传递给回调?
for(var site in data.sites){
var domain = data.sites[site].domain;
$('#site-logout').append('<div class="processing" id="' + domain.replace(".","-") + '"><strong>' + domain + '</strong> is logging out.');
$.getJSON(url, function(data){
if(data.success == true)
$("#" + domain.replace(".","-")).removeClass("processing").addClass("processed").html('<strong>' + domain + '</strong> has logged out.');
else
$("#" + site.domain.replace(".","-")).removeClass("processing").addClass("error").text('<strong><a href="http://' + domain + '">' + domain + '</a></strong> has failed to log out. Follow the link to try manually.');
});
}
答案 0 :(得分:5)
在JavaScript中,for
循环没有块范围,domain
变量是所有循环共享的,它的作用域是父函数,而不是严格在循环内部(例如,您可以访问它)在}
的结束for()
之后,它将是它在最后一个循环中的值。
要解决此问题,您需要使用自己的变量创建一个额外的范围;在这种情况下,使用$.each()
最简单:
$.each(data.sites, function(i, site){
var domain = site.domain;
$('#site-logout').append('<div class="processing" id="' + domain.replace(".","-") + '"><strong>' + domain + '</strong> is logging out.');
$.getJSON(url, function(data){
if(data.success == true)
$("#" + domain.replace(".","-")).removeClass("processing").addClass("processed").html('<strong>' + domain + '</strong> has logged out.');
else
$("#" + domain.replace(".","-")).removeClass("processing").addClass("error").text('<strong><a href="http://' + domain + '">' + domain + '</a></strong> has failed to log out. Follow the link to try manually.');
});
});
for
循环方式如下:
for(var site in data.sites){
(function(domain) {
$('#site-logout').append('<div class="processing" id="' + domain.replace(".","-") + '"><strong>' + domain + '</strong> is logging out.');
$.getJSON(url, function(data){
if(data.success == true)
$("#" + domain.replace(".","-")).removeClass("processing").addClass("processed").html('<strong>' + domain + '</strong> has logged out.');
else
$("#" + domain.replace(".","-")).removeClass("processing").addClass("error").text('<strong><a href="http://' + domain + '">' + domain + '</a></strong> has failed to log out. Follow the link to try manually.');
});
})(data.sites[site].domain);
}