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 相关文章推荐
javascript 设计模式之单体模式 面向对象学习基础
Apr 18 Javascript
修改jquery.lazyload.js实现页面延迟载入
Dec 22 Javascript
JS如何将UTC格式时间转本地格式
Sep 04 Javascript
JavaScript错误处理
Feb 03 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
Apr 19 Javascript
js实现微博发布小功能
Jan 12 Javascript
js禁止浏览器的回退事件
Apr 20 Javascript
JS判断非空至少输入两个字符的简单实现方法
Jun 23 Javascript
vue用addRoutes实现动态路由的示例
Sep 15 Javascript
JavaScript设计模式之观察者模式实例详解
Jan 16 Javascript
vue学习笔记之Vue中css动画原理简单示例
Feb 29 Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 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+DBM的同学录程序(2)
2006/10/09 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
为超链接加上disabled后的故事
2010/12/10 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
python中私有函数调用方法解密
2016/04/29 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
python+OpenCV实现图像拼接
2020/03/05 Python
python 等差数列末项计算方式
2020/05/03 Python
Django Form常用功能及代码示例
2020/10/13 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
PyCharm+Miniconda3安装配置教程详解
2021/02/16 Python
中国宠物用品商城:E宠商城
2016/08/27 全球购物
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
护理个人求职信范文
2014/01/08 职场文书
第一军规观后感
2015/06/12 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
HTTP中的Content-type详解
2022/01/18 HTML / CSS