JQuery .each()循环截断最后一个值

时间:2012-01-06 16:33:10

标签: jquery jquery-selectors

我有一个选择菜单,启用了多个选择。我为提交按钮设置了一个click事件处理程序,以便jQuery循环选择每个下拉值并进行ajax调用。它工作正常,除了最后一个值;列表中的最后一个值似乎永远不会进入ajax调用,如果只选择了一个项目,那么似乎没有任何操作。任何帮助将不胜感激。

这是我的代码:

$("#add_members").click(function () {
    var members = $("#project_members").val();

    jQuery.each(members, function () {
        var projectid = <? php echo $project_id; ?> ;
        var member = this[0];

        $.post([url], {
            project_id: projectid,
            user_id: member
        }, function (data) {
            alert(data);
        });
    });

    location.reload();
});

3 个答案:

答案 0 :(得分:2)

简短的回答:你有一场比赛的情况。

更长的答案:你得到的问题是因为尽管.each是同步的 - 意味着每个命令迭代的所有元素都是在调用location.reload()之前执行的。但是.post是异步的 - 这意味着你不能保证在退出每个循环之前所有帖子都已返回!

答案 1 :(得分:2)

以下是使用$ .each并选择:http://jsfiddle.net/7fhee/

的简单示例

问题很可能是你在调用location.reload()之前期望你的ajax调用完成,这可能不是那种情况。要解决此问题,您应该在ajax调用的成功回调中执行location.reload()。

答案 2 :(得分:1)

我同意其他人的观点,即你最有可能出现竞争状况。您的location.reload会在您上次发布后直接调用,并且最有可能取消您的ajax。

尝试使用$ .ajaxSetup

将ajax设置为不异步
    jQuery.ajaxSetup({async: false});   //set to false for this method

    $.post([url], {
        project_id: projectid,
            user_id: member
        }, function (data) {
            alert(data);
    });

    jQuery.ajaxSetup({async: true});   //Change it back when done if you so desire

这应该结束你的竞争条件。