我有一个选择菜单,启用了多个选择。我为提交按钮设置了一个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();
});
答案 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
这应该结束你的竞争条件。