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 相关文章推荐
js中的eventType事件及其浏览器支持性介绍
Nov 29 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
js判断游览器类型及版本号的代码
May 11 Javascript
jquery对象和javascript对象即DOM对象相互转换
Aug 07 Javascript
JS实现控制表格行内容垂直对齐的方法
Mar 30 Javascript
JavaScript DOM进阶方法
Apr 13 Javascript
jQuery中animate的几种用法与注意事项
Dec 12 Javascript
100多个基础常用JS函数和语法集合大全
Feb 16 Javascript
详解vue+vueRouter+webpack的简单实例
Jun 17 Javascript
探秘vue-rx 2.0(推荐)
Sep 21 Javascript
解决vue中的无限循环问题
Jul 27 Javascript
JavaScript最完整的深浅拷贝实现方式详解
Feb 28 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中获取文件扩展名的N种方法小结
2012/02/27 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
laravel 5.5 关闭token的3种实现方式
2019/10/24 PHP
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
node中使用es6/7/8(支持性与性能)
2019/03/28 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python-基础-入门 简介
2014/08/09 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
理解Python中的类与实例
2015/04/27 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
渗透攻击的测试步骤
2014/06/07 面试题
新学期国旗下演讲稿
2014/05/08 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS