$.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()
例:serializearray()
first:
last :
ajax链式编程方法
在开发的过程,经常会遇到一些耗时间的操作,比如ajax读取服务器数据(异步操作),遍历一个很大的数组(同步操作)。不管是异步操作,还是同步操作,总之就是不能立即得到结果,js是单线程语音,不能立即得到结果,便会一直等待(阻塞)。
一般的做法就是用回调函数(callback),即事先定义好一个函数,js引擎不等待这些耗时的操作,而是继续执行下面的代码,等这些耗时操作结束后,回来执行事先定义好的那个函数。如下面的ajax代码:
$.ajax({ url: test.html, success: function(){ console.log(success); }, error: function(){ console.log(error); }});
但这样写不够强大灵活,也很啰嗦。为此,jquery1.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等回调了。