jquery的$.post问题

凭虚御风飘飘流风回雪 2010-10-11 04:49:30
我在表单提交时做了一个验证函数,函数中用jquery的$.post方法去查询了数据库,根据返回情况判断是否能够执行表单的action,
但是缺发现js函数执行时没等$.post查询结果赋值给返回变量就已经执行了最后一句,返回默认返回值了。这就使我的验证出现了误判。

经过调式我发现这个问题是js函数在执行时没有等$.post的返回结果就执行了下一句,我有些困惑,这中问题该如何解决,虽然不管能不能提交都在判断中都来个alert()倒是可以解决,但是由于互动友好性不太可取。

清剿大虾们有什么好的解决方法,这个查询不想放到action里面做,因为我想让他提交表单前就能得到结果,一边重新选择。
代码如下://当前人员=主联系人 本因能返回true执行表单提交,现在却不等post的结果出来就执行了最后一句return了初始值false,导致判断出错。

function checkIsMainContact(){
var tof = false;
var isMainContactObj = document.getElementsByName("staffSqlBean.mainContactSign");
var customerId = document.getElementById("customerId").value;
var beanStaffId = document.getElementById("beanStaffId").value;
var isMain =0;
for(var i=0;i<isMainContactObj.length;i++){
if(isMainContactObj[i].checked){
isMain = isMainContactObj[i].value;
}
}

if(isMain ==0){
//设置主联系人=否
tof = true;
}else{
$.post("isMainContact.action",{customerId:customerId},
function(data){
var v = eval(data);
if(v.isMainContactSign == 0){
tof = true;
}else{
//存在主联系人
if(v.isMainContactSign == -1){
alert("该客户的主联系人存在异常,暂无法再设置其他主联系人!");
}else{
if(v.staffId == beanStaffId){
tof = true; //当前人员=主联系人
}else{
alert("客户已存在主联系人的情况下无法再设置其他主联系人!");
}
}
}
}
);
}
return tof;
}


...全文
673 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zc_zhouchao 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

lz,我服了,你这样async: false当然可以,但他失去了ajax的意义了阿,
我那段代码应该是可行的,你再看看把!
[/Quote]

如果 async: false 失去了ajax的意义 ,那么为什么ajax还要有设置的接口呢?





便民养生网 http://www.yangsheng52.com
  • 打赏
  • 举报
回复
http://www.17ext.com/ask/q-44195.aspx
太挫了,昨天提的问题今天这网站就有了,好厉害的爬虫。。。。。。。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhangshaolongjj 的回复:]

lz,我服了,你这样async: false当然可以,但他失去了ajax的意义了阿,
我那段代码应该是可行的,你再看看把!
[/Quote]

想想是对的,但结果真的是不对的,我开始的时候也是这样做的,刚才又试了一把还是不对的。

我也觉得jquery里不应该有这种问题吧,我以前dwr框架下没遇到这种问题过,同样是异步操作的。

这里我没办法了,只好在这个js函数里设置成同步操作了。
zhangshaolongjj 2010-10-11
  • 打赏
  • 举报
回复
lz,我服了,你这样async: false当然可以,但他失去了ajax的意义了阿,
我那段代码应该是可行的,你再看看把!
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangshaolongjj 的回复:]
function checkIsMainContact(){
var isMainContactObj = document.getElementsByName("staffSqlBean.mainContactSign");
var customerId = document.getElementById("customerId").value;
……
[/Quote]

3楼的想法跟我一样,但事实上不行的哦,在会进入(//当前人员=主联系人)处的情况下,return的是true; 但结果返回值是false的。同样感谢你的热心解答O(∩_∩)O~
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kyzy_yy_pm 的回复:]

jquery的ajax和get都能设置async: false
false是同步,true是异步,或者用ajax手写源码也可以设置
[/Quote]
沙发一句话解决我的问题,我在函数里加了句设置,是可以了!thx
zhangshaolongjj 2010-10-11
  • 打赏
  • 举报
回复

function checkIsMainContact(){
var isMainContactObj = document.getElementsByName("staffSqlBean.mainContactSign");
var customerId = document.getElementById("customerId").value;
var beanStaffId = document.getElementById("beanStaffId").value;
var isMain =0;
for(var i=0;i<isMainContactObj.length;i++){
if(isMainContactObj[i].checked){
isMain = isMainContactObj[i].value;
}
}

if(isMain ==0){
//设置主联系人=否
return true;
}else{
$.post("isMainContact.action",{customerId:customerId},
function(data){
var v = eval(data);
if(v.isMainContactSign == 0){
return true;
}else{
//存在主联系人
if(v.isMainContactSign == -1){
alert("该客户的主联系人存在异常,暂无法再设置其他主联系人!");
return false;
}else{
if(v.staffId == beanStaffId){
return true; //当前人员=主联系人
}else{
alert("客户已存在主联系人的情况下无法再设置其他主联系人!");
return false;
}
}
}
}
);
}
}
kyzy_yy_pm 2010-10-11
  • 打赏
  • 举报
回复
jquery的ajax和get都能设置async: false
false是同步,true是异步,或者用ajax手写源码也可以设置
kyzy_yy_pm 2010-10-11
  • 打赏
  • 举报
回复
默认是异步的,你需要设置成同步就好了

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧