文章目录
  1. 1. url
  2. 2. settings
    1. 2.1. request 的方法
      1. 2.1.1. method
      2. 2.1.2. type
    2. 2.2. 发送的数据
      1. 2.2.1. data
      2. 2.2.2. processData
      3. 2.2.3. contentType
      4. 2.2.4. traditional
    3. 2.3. 响应的数据类型
      1. 2.3.1. accepts
      2. 2.3.2. dataType
      3. 2.3.3. converters
      4. 2.3.4. contents
      5. 2.3.5. scriptCharset
    4. 2.4. 回调及相关
      1. 2.4.1. success
      2. 2.4.2. dataFilter
      3. 2.4.3. error
      4. 2.4.4. complete
      5. 2.4.5. timeout
      6. 2.4.6. beforeSend
      7. 2.4.7. context
      8. 2.4.8. statusCode
    5. 2.5. 跨域及 jsonp
      1. 2.5.1. crossDomain
      2. 2.5.2. jsonp
      3. 2.5.3. jsonpCallback
    6. 2.6. 缓存
      1. 2.6.1. cache
      2. 2.6.2. ifModified
    7. 2.7. xhr
      1. 2.7.1. xhr
      2. 2.7.2. xhrFields
      3. 2.7.3. mimeType
    8. 2.8. 常用-默认值
      1. 2.8.1. async
      2. 2.8.2. global
    9. 2.9. 其他
      1. 2.9.1. url
      2. 2.9.2. username
      3. 2.9.3. password
      4. 2.9.4. headers
      5. 2.9.5. isLocal
  3. 3. 小结
    1. 3.1. 最常用 14个
    2. 3.2. 请求&响应的数据 8个
    3. 3.3. 有一定B格的 5个
    4. 3.4. 其他 8个
  4. 4. setting 选项索引
  5. 5. 参考

jQuery.ajax(url [,settings])
执行异步 HTTP(Ajax)请求

url

类型:String
一个字符串,包含请求发送到的 URL

settings

类型:PlainObject
一组配置 Ajax 请求的 键/值 对,所有的设置都是可选的。任何选项的默认值都可以通过 $.ajaxSetup() 来设置。

API 中一共提到了 34 个设置选项,为了方便理解,这里将它们归类介绍。

request 的方法

method

类型:String
默认值:’GET’
请求使用的 HTTP 方法(比如 “POST” “GET” “PUT”) [v1.9.0 中新增]

type

类型:String
默认值 ‘GET’
method 的别名。如果你使用 jQuery 1.9.0 之前的版本,那应该使用 type

? 实际接口中,不区分大小写吧~ get Get GET [感觉英文中之所以大写,是因为英文本身都是小写,为了突出其是个param 或者 关键字,要么大写 要么斜体。但中英搭配就不存在这样的问题啦]

发送的数据

data

类型:PlainObject 或 String 或 Array
发送到服务器的数据。当是 GET 请求时,它会被追加到 url 后面。如果不是字符串类型,它会被转化成查询字符串,processData 选项可以防止这种自动处理。对象必须是 键/值 对,如果值是 Array,jQuery 会用相同的 key 去序列化多个值,基于 traditional 选项设置的值。

?测试-自动字符串处理、数组的序列化。平时几乎都是json…

processData

类型:Boolean
默认值:true
默认情况,在 data 中放的数据会被处理成一个对象(从技术上来讲,除了 String),并转换成查询字符串以适应默认的内容类型(content type) “application/x-www-form-urlencoded”。如果你想发送一个 DOM 文档,或者其他非加工的数据,设置这个选项为 false。

?content-type “application/x-www-form-urlencoded”
?原理:对象 字符串…反正最后传的是字符串

contentType

类型:Boolean 或 String
默认值:’application/x-www-form-urlencoded; charset=UTF-8’
当向服务器发送数据时,使用这个内容类型,默认是 “application/x-www-form-urlencoded; charset=UTF-8”,大多数时候都能满足。
如果明确给 $.ajax() 传递内容类型,那么它总会发送一个请求到服务器(即使没有数据要发送)。在 jQuery 1.6 中,可以设置成 false 告诉 jQuery 不设置任何内容类型头。
Note:W3C XMLHttpRequest 规范规定编码总是 UTF-8,指定其他的字符集并不会强制浏览器去改变编码。
Note:对于跨域请求,把内容类型设置成 application/x-www-form-urlencoded, multipart/form-data, 和 text/plain 以外的任何值,将会触发浏览器发送一个 preflight OPTIONS 请求给服务器。

?只要明确指定了 contentType,就会发送一个请求?是为了问服务器支持某种类型吗…
?contentType 都有啥?
?false也不能避免用户自己传值-导致没有数据的请求啊? 难道jquery背后还会默默的搞些地下动作?
?规范规定了UTF-8,那jquery真正实现的时候是-对于非utf-8的编码 就忽略了-依然用utf-8 还是就当它不存在?-那要它干啥? 改版编码是把数据再重新编下吗 还是 直接把传的非utf-8的编码方式透传给服务器-让服务器去解码吧?…哎,废话真多 脑洞真大 想的真多 只因为目前不知道它怎么工作的…
?跨域的那个 preflight OPTIONS 请求又是干啥的?它和前面提到的“只要明确地传了值就会总发送一个请求”是一回事么?

traditional

类型:Boolean
如果你想使用传统风格的 参数序列化,那就把它设置成 true。

?何为“传统风格”的参数序列化?除了传统的,还是其他什么序列化的方式
?默认值是?

响应的数据类型

accepts

类型:PlainObject
默认值:取决于 DataType
在请求头中的内容类型,告诉服务器它将会接收什么类型的响应。

?它有什么实际的意义么?还是仅仅是为了方便通信

dataType

类型:String
默认值:智能推测(xml, json, script, 或者 html)
你期望从服务器返回的数据类型。如果没有指定它,jQuery 将尝试推断它,基于响应中的 MIME 类型(一个 XML MIME 类型将产生 XML,在 1.4 JSON 将会产生一个 JS 对象,在 1.4 script 将会执行脚本,其他的都会返回一个字符串)。可选的类型(结果会作为第一个参数传给 success 的回调函数)都有:

  1. “xml”: 返回一个可以通过 jQuery 处理的 XML 文档
  2. “html”: 返回纯文本 HTML,包含的 script 标签当插入到 DOM 中时会被执行
  3. “script”: 以 JavaScript 的形式执行响应,并将结果以纯文本的形式返回
    可以通过给 URL 添加一个查询字符串参数 “_=[TIMESTAMP]” 来禁用缓存,除非 cache 选项被设置成了 true。注意:这将会把 POSTs 变成 GETs 为了远程域的请求
  4. “json”: 以 JSON 的形式执行响应,并返回一个 JS 对象。跨域的 “json” 请求会被转化成 “jsonp”,除非在它的请求选项中有 jsonp:false。JSON 数据会以严格方式被解析,任何畸形的 JSON 都会被拒绝,并抛出一个解析错误。在 jQuery 1.9 中,一个空响应也会被拒绝,服务器应该返回 null 或者 {}。(点击 json.org 查看关于适当 JSON 格式的更多信息)
  5. “jsonp”: 使用 JSONP 加载 JSON 块,添加额外的 “?callback=?” 到你的 URL 末尾,以指定回调。可以通过给 URL 添加一个查询字符串参数 “_=[TIMESTAMP]” 来禁用缓存,除非 cache 选项被设置成了 true
  6. “text”: 一个纯文本字符串
  7. 多个空格分隔的值:在 jQuery 1.5 中,jQuery 可以把 dataType 从它在内容类型头中接收到的转换成你所要求的。比如:如果你想把 text 响应当成 XML 来处理,就可以给 dataType 赋 “text xml”。你也可以制造一个 JSONP 请求,以 text 接收到它,然后通过 jQuery 把它解释成 XML,即 “jsonp text xml”。同样,一个简写的字符串,比如 “jsonp xml” ,将会首先尝试把 jsonp 转成 xml,如果失败了,会把 jsonp 转成 text,再从 text 转成xml

?不会智能推测出 jsonp text ?jsonp必须得手动指定-这可以理解。那text嘞?
?jsonp到底是个什么概念….哦 曾经跨域里提到过它。soga [嗯~它是个协议,但直接用的少 jquery本身支持了它] 魂淡啊-这么描述依然不知道它是啥
?响应中的MIME类型
?也就是success里接收的数据的类型,是根据 dataType 这层来指定的…【内含着数据转换,牛掰】
?当是script时,和禁用缓存有啥关联?
?当是script时 把POSTs变成GETs 原因到底是什么?单纯script时呢,还是 &当有时间戳的时候 or 禁用缓存了就这德行了…
?跨域:只要是跨域的 “json” 都会被默默转化成 “jsonp”?—
?也就是 cache:true 的优先级高于时间戳喽
?JSON 数据会以严格方式被解析? 何为严格模式-是双引号么
?还是比较疑惑,jsonp的那个 callback 有啥用?到时测试下,它仅仅是个字符串么 有什么用处
?还有 jsonp 和回调、禁用缓存有什么关系?

converters

类型:PlainObject
默认值:{“* text”: window.String, “text html”:true, “text json”:jQuery.parseJSON, “text xml”:jQuery}
一个包含 dataType-to-dataType 转换的对象。每一个转换器的值都是一个函数,它返回响应转换后的值(v1.5版本中新增)

contents

类型:PlainObject
一个 字符串/正则表达式 对的对象,它决定 jQuery 将会如何解析响应,基于其内容类型(content type)。(v1.5 新增)

?貌似没有用过

scriptCharset

类型:String
只用在 “script” 传输时(比如 “jsonp”跨域请求 或者 dataType:”script” 的请求和 “GET” 类型)。设置请求中使用的 script 标签的 charset 属性。用于当当前页使用的字符集和远程脚本使用的不一样时。

回调及相关

success

类型:Function(Anything data, String textStatus, jqXHR jqXHR)
如果请求成功,就会回调这个函数。它有三个参数:

  1. @param data: 从服务器返回的数据,通过 dataType 参数进行格式化,或者通过 dataFilter 回调函数-如果指定的话
  2. @param textStatus: 一个描述状态的字符串
  3. @param jqXHR(在 jQuery 1.4.x 中是 XMLHttpRequest)对象

在 jQuery 1.5 中,success 也可以接受一个函数数组,每一个函数都会被按序回调。点击查看 Ajax Event

dataFilter

类型:Function(String data, String type) => Anything
用来处理 XMLHttpRequest 原始响应数据的函数。这是一个预滤函数,去“净化”响应,你应该返回处理后的结果数据。
函数接收两个参数:从服务器返回的原始数据 和 ‘dataType’ 参数。

error

类型:Function(jqXHR jqXHR, String textStatus, String errorThrown)
如果请求失败,就会回调这个函数。这个函数接收三个参数:

  1. jqXHR (在 jQuery 1.4.x 中是 XMLHttpRequest)对象
  2. 一个描述错误类型字符串:值除了 null 外,还可以是 “timeout” “error” “abort” 和 “parsererror”
  3. 一个可选的异常对象 errorThrown,如果发生了异常:当发生了 HTTP 错误时,errorThrown 会收到 HTTP 状态的文本部分,比如 “Not Found” 或者 “Internal Server Error”

在 jQuery 1.5 中,error 也可以接受一个函数数组,每一个函数都会被按序回调。点击查看 Ajax Event
注意: 当是跨域 script 和 跨域 JSONP 请求时,这个处理器不会被回调。

?跨域的script和jsonp:是指 dataType 设置的么 【但是真实用时 跨域的error也执行了啊…】
?上面不是说当 dataType:’json’ 只要跨域了dataType就会被设置成jsonp

complete

类型:Function(jqXHR jqXHR, String textStatus)
如果请求完成了,会调用这个函数(在 success 和 error 回调执行完之后)。函数得到传过来的两个参数:

  1. jqXHR(在 jQuery 1.4.x 中是 XMLHttpRequest)对象
  2. 一个请求状态的分类字符串(”success” “notmodified” “nocontent” “error” “timeout” “abort” “parsererror” )

在 jQuery 1.5 中,complete 也可以接受一个函数数组,每一个函数都会被按序回调。点击查看 Ajax Event

timeout

类型:Number
设置请求超时时间(单位是毫秒)。它将会覆盖在 $.ajaxSetup() 中设置的全局超时时间。超时的时间计算开始于 $.ajax 调用。
如果浏览器有多个请求要处理,而没有可用连接时,那么请求有可能在发送之前就超时了。在 jQuery 1.4.x 及其之前的版本,如果请求超时了,XMLHttpRequest 对象将会是一个无效的状态;访问其任何对象成员都可能抛出异常。仅在 Firefox 3.0+ 中,script 和 JSONP 请求不会因为超时而被取消;script 仍然会运行,即使它在超时时间之后达到。

?请求没发出去会超时;发送出去一直木有回应也会导致超时吧-为什么这里木有提-总觉得少了什么
?哎呦,特殊的 script 和 JSONP 请求
?timeout超时后,会调用error吧~ 兼容性如何。超时之后的动作们

beforeSend

类型:Function(jqXHR jqXHR, PlainObject settings)
一个请求前的回调函数,可以用来修改 jqXHR(在 jQuery1.4.x 中是 XMLHTTPRequest)对象-在它被发送出去之前。
使用它设置标准的头部,等等。jqXHR 和 settings 对象都会作为参数传进来。这是一个 Ajax Event。beforeSend 函数返回 false 将会取消请求。在 jQuery1.5 中,beforeSend 选项可以被调用,而不管请求的类型。

?也就是这样进化的 XMLHTTPRequest -> jqXHR -> 各种回调
?听起来挺有用的,但是应用场景是?

context

类型:PlainObject
这个对象是将是所有 Ajax 相关回调的上下文。
默认情况,上下文是一个对象,代表在调用中使用的 Ajax settings($.ajaxSettings 与 settings 合并并被传递到 $.ajax)。
比如,指定一个DOM元素作为上下文,将会把请求的 complete 回调的上下文变成这样:

1
2
3
4
5
6
$.ajax({
url: "test.html",
context: document.body
}).done(function() {
$( this ).addClass( "done" );
});

?代码中的 done() 函数是个什么东东?

statusCode

类型:PlainObject
默认值:{}
一个 HTTP 数字代码和函数的对象,当响应返回匹配的代码时,函数将会被调用。如下代码,当响应状态是 404 时,将会弹出 “page not found”。

1
2
3
4
5
6
7
$.ajax({
statusCode: {
404: function() {
alert( "page not found" );
}
}
});

如果请求成功,状态码函数会得到与 success 回调函数一样的参数;如果请求返回 error(包含3xx重定向),那它们会得到和 error 一样的参数。(v1.5新增)

跨域及 jsonp

crossDomain

类型:Boolean
默认值:同域请求默认是 false,跨域请求是 true
如果你想强制跨域请求(如JSONP)在同一个域中,那就把 crossDomain 设置成 true。这允许,比如服务器端重定向到另一个域。(v1.5新增)

?只要显式指定了就一定会优先生效是么,默认的只针对无为?

jsonp

类型:String
JSONP 请求中,这个值会覆盖 callback 函数名。值将会替代 url 中查询字符串中 ‘callback=?’的’callback’。因此 {jsonp:’onJSONPLoad’} 将会变成 ‘onJSONPLoad=?’ 被传送到服务器。
在 jQuery 1.5 中,设置 jsonp 选项为 false 将会阻止 jQuery 给 URL 添加 “?callback” 字符串或者尝试变成 “=?”。在这种情况下,你也应该显式地设置 jsonpCallback。比如 {jsonp: false, jsonpCallback: “callbackName”}

?JSONP请求是在哪设置的? dataType: ‘jsonp’
?据说JSONP请求都是get的
?总结:当是string时 会替换字符串’callback’;当是false时-会阻止在url上添加”?callback”
?那值岂不是 String or Boolean

jsonpCallback

类型:String 或 Function()
JSONP 请求,为它明确指定一个回调函数名。这个值会替代 jQuery 自动生成的随机名字。最好让 jQuery 生成一个唯一的名称,因为这会使管理请求、提供回调和错误处理变得更容易。当你想要更好的使用浏览器缓存的 GET 请求时,你可能要指定一个回调名字。在 jQuery 1.5 中,你也可以给这个选项设置一个函数,在这种情况下 jsonpCallback 的值,会被设置成那个函数的返回值。

?为什么自动生成的会让这三个变得容易:管理请求、提供回调和错误处理?就知道是那次
?POST请求不会被缓存么
?也就是指定了,就不唯一了,就有可能走缓存。如果每次都想直达服务器,则就不指定
?这个名字太歧义了-带着’callback’,… 它吧,其实就是一个字符串

来,贴张图感受下

缓存

cache

类型:Boolean
默认值:true, 当 dataType 是’script’ 和 ‘jsonp’ 时默认是 false
如果把它设置成 false,这将会强制请求的页面不是被浏览器缓存的。
注意:把 cache 设置成 false,只能正确的工作在 HEAD 和 GET 请求。它的工作方式是给 GET 参数后追加是一个时间戳 “_={timestamp}”,其他类型的请求的时候就不会用到这个参数,
但 IE8 是个例外,当 a POST is made to a URL that 已经被 a GET 请求过了。

?也就是script和jsonp默认不走缓存()
?cache只对HEAD和GET请求有效-想缓存就GET喽。POST一定不缓(也是-初衷是用来提交数据的)
?时间戳的工作原理-只它两用到 其他类型的请求不会用到

ifModified

类型:Boolean
默认值:false
允许请求是成功的,只有响应自上次请求有改变时。这是通过检查 Last-Modified 头完成的。默认值是 false,即忽略头部。
在 jQuery 1.4 中这个技术也检查服务器指定的 ‘etag’ to catch 未修改的数据。

xhr

xhr

类型:Function()
默认值:当 ActiveXObject 可用时是 ActiveXObject(IE),否则是 XMLHttpRequest
创建 XMLHttpRequest 对象的回调。当 ActiveXObject 可用时默认就是 ActiveXObject(IE),否则就是 XMLHttpRequest。
重写以提供自己的实现 for XMLHttpRequest,或改进工厂。

xhrFields

类型:PlainObject
一个 fieldName-fieldValue 对的对象,可以设置本地 XHR 对象。比如,在跨域请求中,你可以使用它把 withCredentials 设置成 true。

1
2
3
4
5
6
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});

在 jQuery1.5 中,withCredentials 属性没有传到本地XHR,因此 CORS 请求将会忽略这个标志。出于这个原因,我们推荐使用 jQuery 1.5.1+。(v1.5.1新增)

mimeType

类型:String
默认值:’GET’
mine类型,可覆盖 XHR 中的 mine 类型(v1.5.1 新增)

常用-默认值

async

类型:Boolean
默认值:true
默认情况下,所有的请求都会被异步发送。如果你需要同步请求,那就把这个选项设置成 false。跨域请求 和 dataType:”jsonp” 的请求不支持同步选项。注意,同步请求可能会暂时锁住浏览器,当请求还在处理的时候会导致浏览器禁用任何操作。
在 jQuery 1.8 版本中,jqXHR($.Deferred) 的 async:false 已经被废弃了;你必须使用 success/error/complete 的回调选项替代 jqXHR 提供的响应方法,诸如 jqXHR.done() 还有被废弃的 jqXHR.success()。

?大部分请求都是跨域的,也就是…只要跨域 即便你设置成了false同步-其实是没意义的?
?也就是这么多个settings之间,其实是相互制约,且有优先级的喽
?jqXHR 是何方妖孽….用了这么多次 ajax() 从没用过==
?有些废弃的…那谁,整理出来,以后就不要主动使用了,哈

global

类型:Boolean
默认值:true
是否对这个请求触发全局 Ajax 事件处理,默认是 true。设置成 false 会阻止触发全局处理,比如 ajaxStart 或 ajaxStop。它能用来控制许多的 Ajax Event

其他

url

类型:String
默认值:当前页
一个包含请求发送到 URL 的字符串 (即独于 settings 提出来的第一个 url~)

username

类型:String
在 HTTP 访问认证请求中使用的用户名

password

类型:String
在 HTTP 访问认证请求中使用的密码

headers

类型:PlainObject
默认值:{}
一个附加的 键/值 对对象,随着请求被发送出去,使用 XMLHttpRequest 传输。头 X-Requested-With:XMLHttpRequest 总是会添加,但是它默认的 XMLHttpRequest 的值可以在这里改变。在头部设置的值也可以在 beforeSend 函数内重写 。(v1.5新增)

isLocal

类型:Boolean
默认值:取决于当前页的协议
允许当前环境被识别成 “local”(比如文件系统),即使 jQuery 默认不识别它。下面的协议是目前公认的 local:file,*-extension 和 widget。如果 isLocal 设置需要修改,建议在 $.ajaxSetup() 方法中设置一次。 (v1.5.1 新增)

小结

最常用 14个

  1. 最常用-传参的:urldata
  2. 最常用-直接默认的:method|typeasyncglobal(布尔-是否触发全局ajax事件处理器)
  3. 最常用-回调的:successerrorcomplete[较少]、beforeSend[较少]、statusCode(响应码/函数 对)
    dataType属性|dataFilter函数(对响应数据的格式化|处理)、context(回调上下文)

请求&响应的数据 8个

  1. 数据类型-请求的:contentType(内容类型)
    processData(布尔-是否执行被自动处理)、traditional(布尔-是否用传统的参数序列化)
  2. 数据类型-响应的:dataType(数据类型)、accepts[较少]
    converters(dataType-to-dataType)、contents(处理响应的)、scriptCharset(脚本编码)

有一定B格的 5个

  1. 最常用-超时设置:timeout
  2. JSONP 请求:jsonpjsonpCallback [前者替换字符串callback,后者替换随机名字]
  3. 缓存:cache(仅GET+HEAD请求)、ifModified

其他 8个

  1. xhr 相关:xhrxhrFieldsmimeType
  2. 跨域:crossDomain(布尔)
  3. 其他:usernamepasswordheaders(附加键值对)、isLocal(布尔)

setting 选项索引

accepts
async

beforeSend

cache
complete
contents
contentType
context
converters
crossDomain

data
dataFilter
dataType

error
global
headers

ifModified
isLocal

jsonp
jsonpCallback

method
mimeType

password
processData

scriptCharset
statusCode
success

timeout
traditional
type

url
username

xhr
xhrFields

参考

http://api.jquery.com/jQuery.ajax/

jQuery.ajax(url [,settings]) //v1.5
jQuery.ajax(settings) //v1.0

文章目录
  1. 1. url
  2. 2. settings
    1. 2.1. request 的方法
      1. 2.1.1. method
      2. 2.1.2. type
    2. 2.2. 发送的数据
      1. 2.2.1. data
      2. 2.2.2. processData
      3. 2.2.3. contentType
      4. 2.2.4. traditional
    3. 2.3. 响应的数据类型
      1. 2.3.1. accepts
      2. 2.3.2. dataType
      3. 2.3.3. converters
      4. 2.3.4. contents
      5. 2.3.5. scriptCharset
    4. 2.4. 回调及相关
      1. 2.4.1. success
      2. 2.4.2. dataFilter
      3. 2.4.3. error
      4. 2.4.4. complete
      5. 2.4.5. timeout
      6. 2.4.6. beforeSend
      7. 2.4.7. context
      8. 2.4.8. statusCode
    5. 2.5. 跨域及 jsonp
      1. 2.5.1. crossDomain
      2. 2.5.2. jsonp
      3. 2.5.3. jsonpCallback
    6. 2.6. 缓存
      1. 2.6.1. cache
      2. 2.6.2. ifModified
    7. 2.7. xhr
      1. 2.7.1. xhr
      2. 2.7.2. xhrFields
      3. 2.7.3. mimeType
    8. 2.8. 常用-默认值
      1. 2.8.1. async
      2. 2.8.2. global
    9. 2.9. 其他
      1. 2.9.1. url
      2. 2.9.2. username
      3. 2.9.3. password
      4. 2.9.4. headers
      5. 2.9.5. isLocal
  3. 3. 小结
    1. 3.1. 最常用 14个
    2. 3.2. 请求&响应的数据 8个
    3. 3.3. 有一定B格的 5个
    4. 3.4. 其他 8个
  4. 4. setting 选项索引
  5. 5. 参考