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 相关文章推荐
如何判断元素是否为HTMLElement元素
Dec 06 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
Oct 28 Javascript
微信小程序 解决swiper不显示图片的方法
Jan 04 Javascript
jquery与ajax获取特殊字符实例详解
Jan 08 Javascript
JS实现AES加密并与PHP互通的方法分析
Apr 19 Javascript
微信小程序图片宽100%显示并且不变形
Jun 21 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
Jan 07 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
Apr 24 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
Aug 27 jQuery
bootstrap实现嵌套模态框的实例代码
Jan 10 Javascript
JavaScript中的类型检查
Feb 03 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
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
python切换hosts文件代码示例
2013/12/31 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
用python制作游戏外挂
2018/01/04 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
python实现泊松图像融合
2018/07/26 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
某公司Java工程师面试题笔试题
2016/03/27 面试题
银行员工辞职信范文
2014/01/20 职场文书
小学新教师培训方案
2014/02/03 职场文书
中职生自荐信范文
2014/06/15 职场文书
道路施工安全责任书
2014/07/24 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS
python基础之模块的导入
2021/10/24 Python
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS