2012-01-06 171 views
0

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

这里是我的代码:

$("#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(); 
}); 
+1

由于'location.reload()',更可能没有发布任何数据。当文档被卸载时,每个(AJAX)请求都被取消。 – 2012-01-06 16:40:35

回答

1

我同意其他人的看法,你很有可能出现种族问题。您的位置.reload会在您上次发布后直接调用,并且很可能会取消您的ajax。

尝试设置你的Ajax为不使用$ .ajaxSetup

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 

这应该结束你的竞争状态是异步的。

+0

谢谢。我试过了,它解决了我的问题。 – 2012-01-09 15:34:51

2

简短的回答:你已经有了一个比赛情况。

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

+0

谢谢你解释这个。 – 2012-01-09 15:35:13

2

这里是$。每工作一个简单的例子,并选择:http://jsfiddle.net/7fhee/

问题是最有可能的,你是期待您的Ajax调用来完成你打电话location.reload(前),这可能不是将成为案例。要解决这个问题,你应该在你的ajax调用的成功回调中执行location.reload()。

+0

感谢您的示例。 – 2012-01-09 15:35:24