jquery ajax async:true

bennman 2011-05-16 06:36:35

<form action="1.jsp">
<input type="text" id="tel" flag="0"/>
<input type="text" id="email" flag="0"/>
<input type="submit" value="提交" />
</form>
<script>
$('#tel,#email').blur(function(){
var _this=this;
$.ajax({
type:'POST',
url:'',
//async:false,
dataType:'text',
//data:'',
success:function(data){
if(data==true){
$(_this).attr('flag',1)
}
}
});
});

$('form').submit(function(){
var isSubmit=true;
var input=$('input:text');
for(var i=0; i<input.length;i++){
input.eq(i).blur(); //点击提交 重新做一次验证
if(input.eq(i).attr('flag')==0){
isSubmit=false;
}
}
alert(isSubmit);
return isSubmit;
});
</script>


代码如上,点击“提交”,所有输入框做一次ajax验证,如果都返回true,则提交表单;
如果不注释掉:async:false 没问题,但注释掉后,因为是异步传输,submit的时flag值还没来得及返回,所以都为false
表单提交不了
求:如果选择默认的async:true 该怎么判断,然后提交
...全文
960 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
阳明 to life 2011-05-18
  • 打赏
  • 举报
回复
没经验证,希望高手指出错误
阳明 to life 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bennman 的回复:]

引用 15 楼 zhouyuqwert 的回复:

引用 11 楼 bennman 的回复:

引用 9 楼 zhouyuqwert 的回复:

设全局变量,提交的时候while等待
每个success+1直到等于你需要验证的数目跳出while提交

这样要点两次submit 还是异步传输 submit比ajax的success 先执行的问题

你点两次submit不还是一……
[/Quote]
大致写下吧,我并没测试过
var sucNum = 0;//已成功返回的ajax个数,初始为0
function(){
....... //你的其他代码
success:function(){
sucNum++;//每成功返回一个ajax就加次
}
}
function submit(){
var n=5;///这个是你的所有ajax个数,假设你有5个ajax需要返回值才能提交
while(sucNum!=n){
//等着吧,ajax还有没返回的呢
}
//都返回了,可以提交了
}
阳明 to life 2011-05-17
  • 打赏
  • 举报
回复
设全局变量,提交的时候while等待
每个success+1直到等于你需要验证的数目跳出while提交
toury 2011-05-17
  • 打赏
  • 举报
回复
此时,牛刀就由30斤减小为3斤了,哈哈
toury 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bennman 的回复:]

引用 5 楼 toury 的回复:

登录以后有session的呀。session不为空你就不让提交好了

不太懂,这个能够让他在点击“提交”按钮的时候 就能提示诸如:“该邮箱已被注册,请直接登录”吗?
[/Quote]
一般网站管理一个用户,通常是采用在其成功登陆后,立即给他赋值一个session()。例如,ASP中:
username="zhangsan"
if 他是合法用户 then
session("username")=username
response.cookies("username")=username
'..............
else
'.............
end if
所以,在他后退以后再次提交的时候,你只要判断session("username")不为空,就不让他提交表单就OK了;
----------------
至于email的可用性的问题,你不应该放在表单提交的时候进行,应该在下面红字处进行验证
<input type="text" id="email" flag="0" onblur="myajax()" />
bennman 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 toury 的回复:]

登录以后有session的呀。session不为空你就不让提交好了
[/Quote]
不太懂,这个能够让他在点击“提交”按钮的时候 就能提示诸如:“该邮箱已被注册,请直接登录”吗?
toury 2011-05-17
  • 打赏
  • 举报
回复
登录以后有session的呀。session不为空你就不让提交好了
bennman 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 toury 的回复:]

兄弟,杀鸡也要牛刀?牛刀30斤,杀鸡刀3两,你宁愿用牛刀?看看,砸到自己了不是?呵呵。
--------------
<form action="1.jsp" onsubmit="validCheck(this);">
你到validCheck里把文本框遍历一遍不就ok?何必要AJAX呢?
[/Quote]
有个情况是,第一次我所有的填写正确---提交---通过!
然后我点浏览器的“后退”按钮,返回到刚才的页面,除了password其他的输入框内容都会保留上次填写的
这个时候我输入个密码 如果不ajax,又可以提交了!
现在不要这样...
toury 2011-05-17
  • 打赏
  • 举报
回复
兄弟,杀鸡也要牛刀?牛刀30斤,杀鸡刀3两,你宁愿用牛刀?看看,砸到自己了不是?呵呵。
--------------
<form action="1.jsp" onsubmit="validCheck(this);">
你到validCheck里把文本框遍历一遍不就ok?何必要AJAX呢?
bennman 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 showenxxx 的回复:]

如果要用async:true采用异步的话,在jQuery 1.5+下面可以用.deferred这个新的概念。

其基本思想是让几个不同的操作全部完成后再执行另外的一些操作。

具体实现看例子了
http://jqapi.com/#p=deferred.done
[/Quote]

我去看看 ,谢了先!
其实主要是用同步的话,如果服务器返回的速度慢,会卡住页面,造成很不好的用户体验;
不知道其他网站是怎么处理这个的,或是换什么方式来判断的
showenxxx 2011-05-17
  • 打赏
  • 举报
回复
这里有篇blog对Deferred object解释得比较好

http://blog.darkthread.net/post-2011-02-12-jquery-1-5-notes1.aspx
bennman 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhouyuqwert 的回复:]

引用 11 楼 bennman 的回复:

引用 9 楼 zhouyuqwert 的回复:

设全局变量,提交的时候while等待
每个success+1直到等于你需要验证的数目跳出while提交

这样要点两次submit 还是异步传输 submit比ajax的success 先执行的问题

你点两次submit不还是一样等在while么,只要ajax没执行success,全……
[/Quote]
求代码......
阳明 to life 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bennman 的回复:]

引用 9 楼 zhouyuqwert 的回复:

设全局变量,提交的时候while等待
每个success+1直到等于你需要验证的数目跳出while提交

这样要点两次submit 还是异步传输 submit比ajax的success 先执行的问题
[/Quote]
你点两次submit不还是一样等在while么,只要ajax没执行success,全局变量没达到要求不都一直等在while?
kyzy_yy_pm 2011-05-17
  • 打赏
  • 举报
回复
将ajax返回值赋值给一个标签,在你alert那块用setTimeout每个1s获取一次,如果值有了,就说明返回了,当然了,方法多多
bennman 2011-05-17
  • 打赏
  • 举报
回复
谢了,看来只能这样了
要么用同步 要么后退清空
toury 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bennman 的回复:]

引用 9 楼 zhouyuqwert 的回复:

设全局变量,提交的时候while等待
每个success+1直到等于你需要验证的数目跳出while提交

这样要点两次submit 还是异步传输 submit比ajax的success 先执行的问题
[/Quote]
哦,你一直没转过弯来:
1、不要在提交页面的时候才去做AJAX的事情,这个时候当然有异步问题出现。比如email验证,你应该在该文本框失去焦点的时候就去AJAX到后台,验证输入的email是不是可用;
<input type="text" id="email" flag="0" onblur="emailChk(this.value)" />
2、类似email可用性验证这些外围的东东处理掉以后,才可点提交按钮提交表单。此时的
<form action="1.jsp" onsubmit="return validCheck(this);">只是常规检查,看看是否为空等。

3、关于history.back()返回的问题,你可以在提交后的页面用location的replace(好像是这个,记不清了;你自己查查)来清除前页的记忆;但最可靠的还是在validCheck()里用session("username")是否为空来判断:
<script>
function validCheck(f){
if('<%=session("username")%>'!=""){
alert('别乱搞,你已经登录了')
return false;
}
//这里是常规检查.................
}

function emailChk(s){
//ajax......
}
</script>
bennman 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhouyuqwert 的回复:]

设全局变量,提交的时候while等待
每个success+1直到等于你需要验证的数目跳出while提交
[/Quote]
这样要点两次submit 还是异步传输 submit比ajax的success 先执行的问题
bennman 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 toury 的回复:]

引用 6 楼 bennman 的回复:

引用 5 楼 toury 的回复:

登录以后有session的呀。session不为空你就不让提交好了

不太懂,这个能够让他在点击“提交”按钮的时候 就能提示诸如:“该邮箱已被注册,请直接登录”吗?

一般网站管理一个用户,通常是采用在其成功登陆后,立即给他赋值一个session()。例如,ASP中:
username="zhang……
[/Quote]
谢谢!
不过这样Email又回到上面那个问题了:用户注册成功后 点击浏览器“后退”,回到注册页,这时,除了Password
其他的输入框还都保留刚才填过的信息, 这个时候输入个密码,点submit 就无法验证了
或者怎么能让,用户点“后退”时 清空所有输入框的内容
showenxxx 2011-05-16
  • 打赏
  • 举报
回复
如果要用async:true采用异步的话,在jQuery 1.5+下面可以用.deferred这个新的概念。

其基本思想是让几个不同的操作全部完成后再执行另外的一些操作。

具体实现看例子了
http://jqapi.com/#p=deferred.done

87,910

社区成员

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

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