使用jQuery处理AJAX请求的基础学习教程


Posted in Javascript onMay 10, 2016

$.ajax快捷方法

$.get(url,[data],[callback],[type])
$.post(url,[data],[callback],[type])

两种方法请求方式不同,其他方式相同.
参数:url[请求地址],data[请求的数据内容(obj对象)],callback[回调函数(只能处理请求成功事件)],
type[请求返回数据的编码格式(默认ContentType指定格式)]

$.get('/test?x=1');
$.get('/test',{z:2});
$.post('/test',{y:2});
$.get('/user',function(data,callbacktype,jqXHR){
  data//返回数据
  callbacktype//返回数据的状态信息(字符串)
  jqXHR//jQuery封装的XHR对象
});
$(selector).load(url,[data],[callback])

将页面片段载入到selector的容器里面

$("#content").load('/user');
$.getJSON(url,[data],[callback])

如果是JSON数据回调会成功,否则失败

$.getJSON('/test',{type:1},function(){
  console.log(argument)
});
$.getScript(url,[claaback])

动态加载脚本文件

$.gerScript('/js/test.js',function(){
  alert(test(1,2));
});

$.ajax详细使用方法

$.ajax(url,[settings]);

$.ajax({
  url:'/test',
  success:function(){
    alert('ok');
  }
});

处理响应结果的回调函数:
success[成功],error[请求失败],
statusCode[指明返回的状态码的回调函数],
complete[请求返回前的回调函数(处理返回不同状态码的请求)]

$.ajax('/test',{
  success:function(data){
    console.log(arguments);
  },
  error:function(jqXHR,textStatus,err){
    //jqXHR:jQuery增强的XHR
    //textStatus:请求完成状态
    //err:底层通过throw抛出的异常对象,类型与值与错误类型有关
    console.log(arguments);
  },
  complete:function(jqXHR,textStatus){
    //jqXHR:jQuery增强的XHR
    //textStatus:请求完成状态success | error
    console.log(arguments);
  },
  statusCode:function(){
    '403':function(jqXHR,textStatus,err){
      //jqXHR:jQuery增强的XHR
      //textStatus:请求完成状态
      //err:底层通过throw抛出的异常对象,类型与值与错误类型有关
      console.log(arguments);
      console.log(400);
    },
    '400':function(){
      console.log(400);
    }
  }   
});

请求的数据:data,processData,contentType,traditional

$.ajax('/test',{
  //请求的数据内容
  data:{
    a:1,
    b:2
  },
  //请求的方式
  type:'POST',
  //是否对请求的数据进行转码(用于传输数据为html节点内容)
  processData:true,
  //当前的数据是否使用传统方式进行url编码
  traditional:true,
  //请求数据编码格式
  contentType:'application/json'
});

响应数据:dataType,dataFilter

$.ajax('/test',{
  success:function(data){
    console.log(typeof data)
  },
  //定义的返回数据的类型
  dataType:'json | html | text | jsonp | script',
  //返回底层的原始数据进行预处理
  dataFilter:function(data,type){
    //data:原始数据
    //type:指定的数据类型
  }  
});

前置处理:beforeSend

$.ajax('/test',{
  beforeSend:function(jqXHR,settings){
    console.log(arguments);
    jqXHR.setRequestHeader('test','haha');
    jqXHR.testData = {a:1,b:2};
  },
  complete:function(jqXHR){
    console.log(jqXHR.testData)
  }
});

请求类型:GET(默认) | POST | PUT | DELETE
同步异步:async(默认true)
是否缓存:cache(默认true)
其他参数:
1.global[是否触发全局事件]
2.ifModifed[仅在服务器数据改变时候加载数据]
3.username,password[http需要验证时候]
4.timeout[设置请求超时时间,若请求超时触发error]
5.context[回调中this指向的对象]
其他相关的API

$.ajaxSetup(option)

设置全局默认参数

//默认为get请求
$.ajax('/test');

//修改全局请求方式为post
$.ajaxSetup({
  type:'post',
  headers:{
    test:new Date().getTime
  },
  cache:false
});

//请求方式改变为post
$.ajax('/test');
$.ajaxPrefilter([dataTypes],handler(option,originalOptions,jqXHR))

请求发起前的预处理,提供了一种AOP(面向切面)编程模式,常见用途:
1.根据option设定执行特定处理逻辑
2.修改option值改变请求默认行为
3.通过return修改默认dataType

例:通过return修改默认dataType

$.ajaxPrefilter('text html json',function(options,originalOptions,jqXHR){
  //options请求参数,含默认值
  //originalOptions请求时传入的参数,不含默认值
  //jqXHR:jQuery增强的XHR
  console.log(arguments);
  if(options.url == '/test'){
    return 'text';
  }
});

$.ajax('/test',{
  type:'post',
  dataType:'text',
  //自定义属性
  test:'haha'
});

例:多次请求仅最后一次有效,避免多次请求导致的数据混乱

var requests = {};
$.ajaxPrefilter(function(options,originalOptions,jqXHR){
  if(requests[options.url]){
    requests[options.url].abort();
  }
  requests[options.url] = jqXHR;
});

$.ajax('/test/');
$.ajax('/test/');

例:统一修改请求路径

$.ajaxPrefilter(function(options){
  if(options.url.substr(0,5) == '/usr'){
    options.url = options.url.replace('/usr/','/user/');
    options.header = {
      a:1
    }
  }
});

$.ajax('/usr/');

全局事件

jQuery-1.9以后,全局事件必须绑定在document上

$(document).ajaxSuccess(globalEventHander);
$(document).ajaxError(globalEventHander);
$(document).ajaxComplete(globalEventHander);
$(document).ajaxStart(globalEventHander);
$(document).ajaxStop(globalEventHander);
$(document).ajaxSend(globalEventHander);
function globalEventHander(event){
  console.log(arguments);
  console.log(event.type);
}
$.ajax('/test?err=y');//请求成功
$.ajax('/test?err=n');//请求失败
//请求顺序:
//ajaxStart >> ajaxSend >> ajaxSend >> ajaxSuccess >> ajaxComplete >> ajaxError >> ajaxComplete >> ajaxStop

序列化

1.param[序列化一个 key/value 对象]
2.serialize[通过序列化表单值,创建 URL 编码文本字符串]
3.serializeArray[通过序列化表单值来创建对象数组(名称和值)]

例:param()

var params = { a:1, b:2 };
var str = $.param(params);
console.log(str);
//a=1&b=2"

例:serialize()

<form>
  <div><input type="text" name="a" value="1"/></div>
  <div><input type="text" name="b" value="2"/></div>
  <div><input type="hidden" name="c" value="3"/></div>
</form>
<script type="text/javascript">
  $('form').submit(function() {
   console.log($(this).serialize());
   //a=1&b=2&c=3
   return false;
  });
</script>

例:serializeArray()

<form>
  First:<input type="text" name="First" value="1" /><br />
  Last :<input type="text" name="Last" value="2" /><br />
</form>
<script type="text/javascript">
  $('form').click(function(){
    x=$("form").serializeArray();
    console.log(x);
    //{[name:First,value:1],[name:Last,value:2]}
  });
</script>

ajax链式编程方法
在开发的过程,经常会遇到一些耗时间的操作,比如ajax读取服务器数据(异步操作),遍历一个很大的数组(同步操作)。不管是异步操作,还是同步操作,总之就是不能立即得到结果,JS是单线程语音,不能立即得到结果,便会一直等待(阻塞)。

一般的做法就是用回调函数(callback),即事先定义好一个函数,JS引擎不等待这些耗时的操作,而是继续执行下面的代码,等这些耗时操作结束后,回来执行事先定义好的那个函数。如下面的ajax代码:

$.ajax({
  url: "test.html",
  success: function(){
    console.log("success");
  },
  error: function(){
    console.log("error");
  }
});

但这样写不够强大灵活,也很??隆N?耍?Query1.5版本引入Deferred功能,为处理事件回调提供了更加强大而灵活的编程模式。

$.ajax("test.html")
.done(
  function(){
    console.log("success");
  }
)
.fail(
  function(){
    console.log("error");
  }
);

不就是链式调用嘛,有何优点?

优点一:可以清晰指定多个回调函数

function fnA(){...}
function fnB(){...}
$.ajax("test.html").done(fnA).done(fnB);

试想一下,如果用以前的编程模式,只能这么写:

function fnA(){...}
function fnB(){...}
$.ajax({
  url: "test.html",
  success: function(){
    fnA();
    fnB();
  }
});

优点二:为多个操作指定回调函数

$.when($.ajax("test1.html"), $.ajax("test2.html"))
.done(function(){console.log("success");})
.fail(function(){console.log("error");});

用传统的编程模式,只能重复写success,error等回调了。

Javascript 相关文章推荐
Cookie 注入是怎样产生的
Apr 08 Javascript
var与Javascript变量隐式声明
Sep 17 Javascript
javascript 必知必会之closure
Sep 21 Javascript
JS去除数组重复值的五种不同方法
Sep 06 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
Sep 02 Javascript
jQuery遍历对象、数组、集合实例
Nov 08 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
Apr 01 Javascript
javascript实现倒计时(精确到秒)
Jun 26 Javascript
js格式化时间的方法
Dec 18 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
Mar 29 Javascript
详解webpack引入第三方库的方式以及注意事项
Jan 15 Javascript
vue中的mescroll搜索运用及各种填坑处理
Oct 30 Javascript
javascript关于继承解析
May 10 #Javascript
JavaScript继承学习笔记【新手必看】
May 10 #Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 #Javascript
深入剖析JavaScript:Object类型
May 10 #Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 #Javascript
快速解决Canvas.toDataURL 图片跨域的问题
May 10 #Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 #Javascript
You might like
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
VBScript版代码高亮
2006/06/26 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
JS实现点星星消除小游戏
2020/03/24 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
对Python 内建函数和保留字详解
2018/10/15 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
python实现两个文件夹的同步
2019/08/29 Python
简单的Python调度器Schedule详解
2019/08/30 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
python计算无向图节点度的实例代码
2019/11/22 Python
python numpy 反转 reverse示例
2019/12/04 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
常用的10个Python实用小技巧
2020/08/10 Python
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
奥兰多迪士尼门票折扣:Undercover Tourist
2018/07/09 全球购物
创业计划书中包含的9个方面
2013/12/26 职场文书
成人继续教育实施方案
2014/03/01 职场文书
餐厅采购员岗位职责
2014/03/06 职场文书
农业开发项目建议书
2014/05/16 职场文书
教师节宣传方案
2014/05/23 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书