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中为元素加上name属性的方法
May 09 Javascript
JS中call/apply、arguments、undefined/null方法详解
Feb 15 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
Dec 18 Javascript
利用node.js制作命令行工具方法教程(一)
Jun 22 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
Nov 15 Javascript
Vue封装的组件全局注册并引用
Jul 24 Javascript
利用JavaScript的Map提升性能的方法详解
Aug 14 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
Nov 01 Javascript
微信小程序实现上拉加载功能
Nov 20 Javascript
JS实现容器模块左右拖动效果
Jan 14 Javascript
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 Javascript
vue请求数据的三种方式
Mar 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
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
Python实现全排列的打印
2018/08/18 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
python中的列表和元组区别分析
2020/12/30 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
中英文自我评价常用句型
2013/12/19 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
颁奖晚会主持词
2014/03/25 职场文书
法律专业自荐信
2014/06/03 职场文书
党员目标管理责任书
2014/07/25 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python
欧元符号 €
2022/02/17 杂记
Nginx配置根据url参数重定向
2022/04/11 Servers