jquery 中ajax执行的优先级


Posted in Javascript onJune 22, 2015

今天在做用户注册时:发现了一个奇怪的问题,请看代码:

$('input[name="username"]').blur(function(){
    //验证格式
    var pattern = /^[a-z][\w]{4,11}$/i;
    if(!pattern.test($(this).val())) {
      $(this).siblings('.desc').html('<font style="color:red;">5-12个字符,必须以字母开头,只能输入数字,字母和下划线</font>');
      return false;
    }
    //验证用户名是否被注册
    $.post('register.php?act=checkUser',{username:$(this).val()},function(data){
      if(data.status == 'error') {
        $('input[name="username"]').siblings('.desc').html('<font style="color:red;">'+data.info+'</font>');
        return false;
      }
    },'json');
    
    //成功
 alert('成功');
    //$(this).siblings('.desc').html('<img src="./public/images/ok.gif" />');
  });

按道理说,上面的格式是

1、验证用户名是否符合格式
2、格式正确再AJAX判断用户名是否被占用,
3、都成功则显示正确的图标,

但是问题是当我验证用户格式成功了之后,它就直接执行了,alert('成功'),然后再执行ajax,这是为什么呢?是ajax执行的时间问题吗?还是别的???

这是PHP代码:

if($_GET['act'] == 'checkUser') {
  if($_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') exit('非法操作!!!');

  $sql = "SELECT id FROM {$sys_vars['db_pre']}user WHERE username='{$_POST['username']}'";
  
  $result = mysql_query($sql);
  $data = mysql_fetch_assoc($result);
  if ($data) {
    exit(json_encode(array('status'=>'error','info'=>'该用户名已被注册!!!')));
  }else{
    exit(json_encode(array('status'=>'success')));
  }
}

分析如下

ajax是异步操作,当执行ajax相关功能函数时,系统先返回函数,再进行请求,当收到请求结果,会通过调用回调函数的方式返回给用户。

$('input[name="username"]').blur(function(){
    //验证格式
    var pattern = /^[a-z][\w]{4,11}$/i;
    if(!pattern.test($(this).val())) {
      $(this).siblings('.desc').html('<font style="color:red;">5-12个字符,必须以字母开头,只能输入数字,字母和下划线</font>');
      return false;
    }
    //验证用户名是否被注册
    $.post('register.php?act=checkUser',{username:$(this).val()},function(data){
      if(data.status == 'error') {
        $('input[name="username"]').siblings('.desc').html('<font style="color:red;">'+data.info+'</font>');
        return false;
      }
    },
    function(data){  //对于post函数,第三个参数为回调函数
      alert('成功');
    }
    ,'json');
    
    //成功
 //alert('成功');
    //$(this).siblings('.desc').html('<img src="./public/images/ok.gif" />');
  });

照这样修改一下,试试,体会一下不同之处。
不同的ajax函数 其回调函数的使用方法略有不同,可参考w3school的教程或jQuery官网。

这个其实是js的同步和异步的问题,异步的话你可以想象一下两条线路

--执行函数调用--正则验证--发起ajax--函数返回         ajax回调

                            |                        |

                            |                        |

                           浏览器请求--php处理--浏览器接到结果

如果想让函数返回在ajax回调之后,可以改变上边的模型,例如:

--执行函数调用--正则验证--发起ajax                  ajax回调--函数返回

                            |                        |

                            |                        |

                           浏览器请求--php处理--浏览器接到结果

这个可以通过修改jquery的发起ajax是异步还是同步方式来实现!

$('input[name="username"]').blur(function(){
  //验证格式
  var pattern = /^[a-z][\w]{4,11}$/i;
  if(!pattern.test($(this).val())) {
    $(this).siblings('.desc').html('<font style="color:red;">5-12个字符,必须以字母开头,只能输入数字,字母和下划线</font>');
    return false;
  }
  //验证用户名是否被注册
  var ajaxCheckUser = false;
  $.ajax({
    type: "POST",
    url: "register.php?act=checkUser",
    data: {username:$(this).val()},
    // 注意这里
    async:false
    success: function(data){
    if(data.status == 'error') {
      $('input[name="username"]').siblings('.desc').html('<font style="color:red;">'+data.info+'</font>');
      //return false;
    } else {
      ajaxCheckUser = true;
    }
  },'json');
  
  if(ajaxCheckUser) {
    //成功
    alert('成功');
    //$(this).siblings('.desc').html('<img src="./public/images/ok.gif" />');
  }
  
});

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
跨域请求之jQuery的ajax jsonp的使用解惑
Oct 09 Javascript
js中一个函数获取另一个函数返回值问题探讨
Nov 21 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
Dec 25 Javascript
js与C#进行时间戳转换
Nov 14 Javascript
javascript遇到html5的一些表单属性
Jul 05 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
Feb 16 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
Nov 05 Javascript
JavaScript Ajax实现异步通信
Dec 14 Javascript
JavaScript制作简单的框选图表
May 15 Javascript
vue深入解析之render function code详解
Jul 18 Javascript
微信小程序WebSocket实现聊天对话功能
Jul 06 Javascript
vue生命周期钩子函数以及触发时机
Apr 26 Vue.js
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 #Javascript
jquery中toggle函数交替使用问题
Jun 22 #Javascript
浅谈js 闭包引起的内存泄露问题
Jun 22 #Javascript
js闭包所用的场合以及优缺点分析
Jun 22 #Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
Jun 22 #Javascript
javascript中使用new与不使用实例化对象的区别
Jun 22 #Javascript
浅谈javascript构造函数与实例化对象
Jun 22 #Javascript
You might like
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
js算法中的排序、数组去重详细概述
2013/10/14 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
Python的randrange()方法使用教程
2015/05/15 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
python数据封装json格式数据
2018/03/04 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
python如何从文件读取数据及解析
2019/09/19 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
师范毕业生求职自荐信
2013/09/25 职场文书
金融行业务员的自我评价
2013/12/13 职场文书
购房协议书范本
2014/04/11 职场文书
教师一岗双责责任书
2014/04/16 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
2015入党自荐书范文
2015/03/05 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs