一个简单的问题搞了一天,求助!!!! 本帖最后由 renboy20 于 2011-08-05 17:15:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 声明一个变量isTrue,进行判断的时候,在useridpdt 和 callbackidpd 给它赋值最后判断isTrue的值来决定是否可以提交 自相矛盾。这样的话,你就不应该用异步调用并设置回调函数了,而是应该采取同步读取方式,在useridpd内部读取处理后得到结果,useridpd自然就能知道它的结果了。根据需求,认真画出流程图,每一步按策略决定做法,设计好再编码,就能避免这样草率的现象了。 function checkForm(){ if(useridpd()&&callbackidpd(data)) {return true;} else {return false;}} 早上起来就看到你N个回复了终于明白你那些勋章怎么得来的了分就那么重要么?随时都摆出一副高高在上的姿态我们都是菜鸟但是也不一定就全部是错的LZ的方法完全没有问题只是少了一个步骤而已1L基本把问题的解决方法都说出来了你什么解决方案都没提出来连原因都找错了...最后还说别人如何如何... function useridpd(){ if (!Isuserid($('#userid').val())) //如果没有通过正则表达示的检查 { $('#useridzt').html("<div class='err'><b class='xx'></b>用户名含有非法字符</div><div class='errLast'></div>"); return false; } else{ // 通过了正则表达示 if ($('#userid').val()=="" || $('#userid').val().length <=3) // 文本框的值为空或少于4个字节 { $('#useridzt').html("<div class='err'><b class='xx'></b>用户名不能为空或少于4个字节</div><div class='errLast'></div>"); return false;} else //文本框里的值为正常 {var useridtxt= $('#userid').val(); var isUserExists; $.get("\\ajax\\useridpd.ashx?userid="+useridtxt,null,callbackidpd); //调用callbackidpd函数if (!isUserExists) //如果返回的值为false表示数据库中没查到相同的 { $('#useridzt').html("<div class='textbox_ok'><b></b></div>"); //输出OK图片 return true; } else{ $('#useridzt').html("<div class='err'><b class='xx'></b>用户名已被注册</div><div class='errLast'></div>"); //输出失败信息关返回false的值 return false; } } }} function callbackidpd(data){ if (data=="false") //如果返回的值为false表示数据库中没查到相同的 {isUserExists=false; } else{ isUserExists=true; }} 其实对数据库里是否存在验证后,返回的true和flase只是纯文本的,然后再用js判断的并不是bool值!在useridpd内部用return返回的值也没返回给父级函数! 你说的方法和6楼的是一样吧!!我目前按照6楼的办法,但出现了一个问题,在useridpd函数里面定义了一个变量,通过回调函数去赋值,但是在useridpd函数里查到那个变量并没有值呢! 我觉得是这样的 $.get("\\ajax\\useridpd.ashx?userid="+useridtxt,null,callbackidpd); //调用callbackidpd函数这是个异步操作所谓异步操作,就是useridpd这个函数走到以上那句话的时候不会等待你那个callback的返回,而是直接继续走下去了,由于你那个函数后面没有语句了,因此这个函数也就运行完毕了,也就是没有返回值。而当以上那个语句真的返回了的时候,原先的useridpd函数早已经走完了,因此不会发生返回值。我觉得单靠判断useridpd()返回的值去判断成功不成功是不行的如果确定就是要靠useridpd这个函数去判断 那就吧那个ajax改成同步的操作 这样的话函数走到那个ajax会等待那个访问返回才会继续走下去否则用异步的话 还是在callback里 做你如果成功或者失败的操作吧 其实LZ的需求是个很常见的问题,比如,现在有人要注册会员,那么会要求填写一个用户名,完成之后,首先检查用户名是否符合一定的规则(4-12的数字和字母...),如果合格则用ajax提交到服务器查询是否该用户名己存在,如果存在则不能用于注册,反之则可以。因为ajax验证用户名是异步的,所以可能在你还没有得到结果之前,用户就点击了提交按钮,结果...因此,交互过程可以如下: var isTrue = false; function checkUserName() { var 用户名 = 表单值; if(用户名是由4到12位的数字和字母组成的) { ajaxCheck(用户名); } } function ajaxCheck() { if(请求发生错误或请求超时) { isTrue = true; //以上情况,则把验证放到后台去完成(后台肯定还是要验证一次),前台直接放行 } if(该用户名可用) { isTrue = true; } } 提交表单的按钮的submit事件 = function() { if(isTrue) { form.submit(); } else { alert(正在验证用户名是否可用,请等一小会会) } } 不是改同步就行了,程序写法也得改, 给你一个检查用户名的例子function register(){ var exist=checkusername() }function checkusername(){ var ok=false; $.ajax({ url : "checkusername.php", cache : false, async : false, type : "post", success :function(r){ ok=(r=="true"); } }); return ok;} function register(){ var exist=checkusername() if(exist){ alert("用户名己存在,或检查失败"); return false; }}function checkusername(name){ var ok=false; $.ajax({ url : "checkusername.php?u="+name, cache : false, async : false, type : "post", success :function(r){ ok=(r=="true"); } }); return ok;} 新手jquery问题 关于事件绑定 JS从数据库里查不出数据库里正确的数据 .Net IE8 下 window.opener.location.reload()回刷父窗体问题 window.steTimeout与 Submit 下面这段JS看不懂,谁能帮忙看下 JS加密解密的问题,高手帮忙了谢谢!! (分享)动态添加cell控件时设置style的一点小经验 关于frame中调用javasript的问题 如何修改一个td的bgcolor属性? javascript处理字符串问题 Ext_JS3.0 formPanel xtype:'combo'不起作用,不知何故 Ajax一個問題
function checkForm()
{
if(useridpd()&&callbackidpd(data))
{return true;}
else
{return false;}
}
早上起来就看到你N个回复了
终于明白你那些勋章怎么得来的了
分就那么重要么?
随时都摆出一副高高在上的姿态
我们都是菜鸟
但是也不一定就全部是错的
LZ的方法完全没有问题
只是少了一个步骤而已
1L基本把问题的解决方法都说出来了
你什么解决方案都没提出来
连原因都找错了...
最后还说别人如何如何...
if (!Isuserid($('#userid').val())) //如果没有通过正则表达示的检查
{
$('#useridzt').html("<div class='err'><b class='xx'></b>用户名含有非法字符</div><div class='errLast'></div>");
return false;
}
else{ // 通过了正则表达示
if ($('#userid').val()=="" || $('#userid').val().length <=3) // 文本框的值为空或少于4个字节
{
$('#useridzt').html("<div class='err'><b class='xx'></b>用户名不能为空或少于4个字节</div><div class='errLast'></div>");
return false;}
else //文本框里的值为正常
{var useridtxt= $('#userid').val();
var isUserExists;
$.get("\\ajax\\useridpd.ashx?userid="+useridtxt,null,callbackidpd); //调用callbackidpd函数
if (!isUserExists) //如果返回的值为false表示数据库中没查到相同的
{
$('#useridzt').html("<div class='textbox_ok'><b></b></div>"); //输出OK图片
return true;
}
else{
$('#useridzt').html("<div class='err'><b class='xx'></b>用户名已被注册</div><div class='errLast'></div>"); //输出失败信息关返回false的值
return false;
}
}
}} function callbackidpd(data){
if (data=="false") //如果返回的值为false表示数据库中没查到相同的
{isUserExists=false;
}
else{
isUserExists=true;
}
}
其实对数据库里是否存在验证后,返回的true和flase只是纯文本的,然后再用js判断的并不是bool值!
在useridpd内部用return返回的值也没返回给父级函数!
你说的方法和6楼的是一样吧!!我目前按照6楼的办法,但出现了一个问题,在useridpd函数里面定义了一个变量,通过回调函数去赋值,但是在useridpd函数里查到那个变量并没有值呢!
$.get("\\ajax\\useridpd.ashx?userid="+useridtxt,null,callbackidpd); //调用callbackidpd函数
这是个异步操作
所谓异步操作,就是useridpd这个函数走到以上那句话的时候不会等待你那个callback的返回,而是直接继续走下去了,由于你那个函数后面没有语句了,因此这个函数也就运行完毕了,也就是没有返回值。
而当以上那个语句真的返回了的时候,原先的useridpd函数早已经走完了,因此不会发生返回值。
我觉得单靠判断useridpd()返回的值去判断成功不成功是不行的
如果确定就是要靠useridpd这个函数去判断 那就吧那个ajax改成同步的操作 这样的话函数走到那个ajax会等待那个访问返回才会继续走下去
否则用异步的话 还是在callback里 做你如果成功或者失败的操作吧
var isTrue = false;
function checkUserName() {
var 用户名 = 表单值;
if(用户名是由4到12位的数字和字母组成的) {
ajaxCheck(用户名);
}
}
function ajaxCheck() {
if(请求发生错误或请求超时) {
isTrue = true; //以上情况,则把验证放到后台去完成(后台肯定还是要验证一次),前台直接放行
}
if(该用户名可用) {
isTrue = true;
}
}
提交表单的按钮的submit事件 = function() {
if(isTrue) {
form.submit();
} else {
alert(正在验证用户名是否可用,请等一小会会)
}
}
不是改同步就行了,程序写法也得改, 给你一个检查用户名的例子function register(){
var exist=checkusername()
}function checkusername(){
var ok=false;
$.ajax({
url : "checkusername.php",
cache : false,
async : false,
type : "post",
success :function(r){
ok=(r=="true");
}
});
return ok;
}
function register(){
var exist=checkusername()
if(exist){
alert("用户名己存在,或检查失败");
return false;
}
}function checkusername(name){
var ok=false;
$.ajax({
url : "checkusername.php?u="+name,
cache : false,
async : false,
type : "post",
success :function(r){
ok=(r=="true");
}
});
return ok;
}