变量不在每个循环中更新--JQuery

时间:2014-06-13 14:42:50

标签: jquery ajax

$(".room").each(function () {
    i = i + 1;
    alert(i);
    roomid = $(this).attr("id");
    alert(roomid);

    $.get("QueryRoom.aspx?ID=" + roomid, function (data) {
        $("#" + roomid).html(data);
    });
});

});

似乎我的获取查询中间的宽限期不会更新并且停留在#22(最后一个房间ID)。 get请求执行正常,因为我可以看到div更改内容。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

您需要的是一个闭包,用于在异步调用完成之前保留roomid的值。创建闭包的一种方法是使用立即函数,将roomid的值作为参数传递给它。

有十亿篇文章详细解释了闭包,但简单地说:闭包是从外部作用域访问变量的任何函数。在这种情况下,会创建一个特殊对象调用闭包,以便保留内部函数中引用的所有对象/变量的内存位置,从而创建各种上下文。

在我的示例中,一旦进行了此闭包,您实际上将roomid隐藏在外部作用域中,因为您具有一个具有完全相同名称的变量的立即函数。因此,您只能访问immediate函数中的值,并且在ajax调用完成时它将具有正确的id。

$(".room").each(function () {
        i = i + 1;
        alert(i);
        roomid = $(this).attr("id");
        alert(roomid);
        (function(roomid) {
            $.get("QueryRoom.aspx?ID=" + roomid, function (data) {
                $("#" + roomid).html(data);
            });
        })(roomid);
    });
});

答案 1 :(得分:1)

roomid$.get的所有回调函数之间共享。循环执行得足够快,在任何回调完成之前完全递增,因此它们都获得最大值。您可以通过各种方式更正此问题,但最简单的方法是将roomid的当前值传递给进行ajax调用的闭包:

(function (roomid) {
    $.get("QueryRoom.aspx?ID=" + roomid, function (data) {
        $("#" + roomid).html(data);
    });
}(roomid))

事实上,由于您没有使用varroomid是全球性的。这可能不受欢迎。相反,你应该这样做:

var roomid = $(this).attr("id");

这将为roomid函数的每次迭代创建一个新的.each,这将不会被共享 - 这使得闭包不必要。