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 相关文章推荐
基于PHP+Jquery制作的可编辑的表格的代码
Apr 10 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
JavaScript 事件对象介绍
Apr 13 Javascript
js兼容火狐显示上传图片预览效果的方法
May 21 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
Dec 13 Javascript
javascript构造函数以及原型对象的理解
Jan 13 Javascript
javascript实现秒表计时器的制作方法
Feb 16 Javascript
JavaScript登录记住密码操作(超简单代码)
Mar 22 Javascript
移动端手指放大缩小插件与js源码
May 22 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
Oct 26 Javascript
详解如何创建并发布一个 vue 组件
Nov 08 Javascript
JS开发常用工具函数(小结)
Jul 04 Javascript
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概述.
2006/10/09 PHP
PHP邮件专题
2006/10/09 PHP
十大使用PHP框架的理由
2015/09/26 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
基于jquery的模态div层弹出效果
2010/08/21 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
Python自动扫雷实现方法
2015/07/25 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
python利用opencv保存、播放视频
2020/11/02 Python
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
斯福泰克软件测试面试题
2015/02/16 面试题
应届生骨科医生求职信
2013/10/31 职场文书
网站开发实习生的自我评价
2013/12/11 职场文书
事业单位请假制度
2014/01/13 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
采购员岗位职责
2015/02/03 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
郭明义观后感
2015/06/08 职场文书
区域销售大会开幕词
2016/03/04 职场文书
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL