1.通过ajax传输boolean型到服务器时会变成字符串型,如:

//客户端
false
//服务器
"false"

2.ajax的baseHeaders

ajax插件中的baseHeaders对象的是http请求头部的信息

    var mime = settings.accepts[dataType],
baseHeaders = { },
protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol,
xhr = $.ajaxSettings.xhr(), abortTimeout
if (!settings.crossDomain)
//x-requested-with为XMLHttpRequest是Ajax异步请求方式。
//为null,是同步请求方式。
baseHeaders['X-Requested-With'] = 'XMLHttpRequest'
if (mime) {
baseHeaders['Accept'] = mime
if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0]
//重写服务器响应的MIME类型,以欺骗浏览器避免浏览器格式化服务器返回的数据。
//如果dataType = "json",那么请求头:Accept:application/json,指示服务器我接受json数据
    xhr.overrideMimeType && xhr.overrideMimeType(mime)
}
if (settings.contentType || (settings.data && settings.type.toUpperCase() != 'GET'))
//为post请求,Content-Type为application/x-www-form-urlencoded
baseHeaders['Content-Type'] = (settings.contentType || 'application/x-www-form-urlencoded')
settings.headers = $.extend(baseHeaders, settings.headers || {})
for (name in settings.headers)
//设置http请求头部信息
xhr.setRequestHeader(name, settings.headers[name])

来看看例子:

var dataType = dataType ? dataType : 'json';
$.ajax({
type: 'post',
url: config.URL,
data: JSON.stringify(params),
dataType: dataType,
success: function(data) {
callback(data);
},
error: function(data) {
errCallback(data);
}
});

http请求头部:

3.ajax的事件

ajax的事件是根据ajax的过程和状态来注册的。

  过程或者状态           函数名 参数
                    请求发送前 ajaxBeforeSend xhr, settings
                    请求开始 ajaxStart  settings
                    请求终止 ajaxStop  settings
                    请求成功 ajaxSuccess data, xhr, settings
                    请求出错 ajaxError error, type, xhr, settings
                    请求完成 ajaxComplete status, xhr, settings

所以事件的参数都含有: settings,下面列出各个参数的含义:

xhr:XMLHttpRequest对象。

data: ajax请求中的data对象,即请求body中的数据。

error:又两种请求,如果在请求成功,解析获得的数据,与dataType类型不一致而报错,其他的error都是null。

if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) {
dataType = dataType || mimeToDataType(xhr.getResponseHeader('content-type'))
result = xhr.responseText
//解析返回的数据格式
try {
if (dataType == 'script') (1,eval)(result)
else if (dataType == 'xml') result = xhr.responseXML
else if (dataType == 'json') result = blankRE.test(result) ? null : JSON.parse(result)
} catch (e) { error = e }
if (error) ajaxError(error, 'parsererror', xhr, settings)
else ajaxSuccess(result, xhr, settings)
} else {
ajaxError(null, 'error', xhr, settings)
}

type:出错的类型,"timeout", "error", "abort", "parsererror",四种情况的一种。

status: 请求完成的状态。  "success", "notmodified", "error", "timeout", "abort", "parsererror",六种请求中的一种,

这就表示ajaxComplete有六种情况可以触发,其实在代码中我只看到了四种,和type一样的四种状态。

每个事件都要触发triggerGlobal事件,也就是要触发triggerAndReturn事件。

  // trigger an Ajax "global" event
function triggerGlobal(settings, context, eventName, data) {
//默认为true
if (settings.global)
return triggerAndReturn(context || document, eventName, data)
}
  // trigger a custom event and return false if it was cancelled
function triggerAndReturn(context, eventName, data) {
var event = $.Event(eventName)
$(context).trigger(event, data)
//非默认事件
return !event.defaultPrevented
}

4.ajax的jsonp

通过script标签来发起URL请求,实现跨域。可以在$.ajax中设置jsonp请求,也可以直接调用$.ajaxJSONP,

$.ajaxJSONP = function(options){
var callbackName = 'jsonp' + (++jsonpID),
script = document.createElement('script'),
abort = function(){
$(script).remove()
if (callbackName in window) window[callbackName] = empty
ajaxComplete('abort', xhr, options)
},
xhr = { abort: abort }, abortTimeout
//请求出错了
if (options.error) script.onerror = function() {
xhr.abort()
options.error()
}
//请求成功,服务器需要设置返回的数据中执行callback函数。
window[callbackName] = function(data){
clearTimeout(abortTimeout)
$(script).remove()
delete window[callbackName]
ajaxSuccess(data, xhr, options)
}
//通过data拼凑一个URL,该URL最后的情况是:?callbackName=jsonp1或者?callbackName=jsonp2....
serializeData(options)
script.src = options.url.replace(/=\?/, '=' + callbackName)
//该URL通过script标签放入html。
$('head').append(script)
//请求超时
if (options.timeout > 0) abortTimeout = setTimeout(function(){
xhr.abort()
ajaxComplete('timeout', xhr, options)
}, options.timeout) return xhr
}

zepto.js之ajax剖析的更多相关文章

  1. zepto.js的事件处理

    能够深入理解zepto对事件的处理,那么整个JS的事件处理就应该差不多合格了,事件处理是JS语言的一个难点. 1. 首先来看$.event函数. JS中有很多事件,都是已经定义好了,我们直接调用就可以 ...

  2. scroll事件实现监控滚动条并分页显示示例(zepto.js)

    scroll事件实现监控滚动条并分页显示示例(zepto.js  ) 需求:在APP落地页上的底部位置显示此前其他用户的购买记录,要求此div盒子只显示3条半,但一页有10条,div内的滑动条滑到一页 ...

  3. 使用backbone.js、zepto.js和trigger.io开发HTML5 App

    为了力求运行速度快.响应迅即,我们推荐使用backbone.js和zepto.js. 为了让这个过程更有意思,我们开发了一个小小的示例项目,使用CSS重置样式.Backbone.js和带转场效果的几个 ...

  4. 移动开发js库Zepto.js应用详解

    从哪里下载 Zepto 地址:http://zeptojs.com/ 中文版地址:http://www.css88.com/doc/zeptojs_api/ 这个问题看起来很蠢,从官网下载不就行了嘛! ...

  5. zepto.js 源码解析

    http://www.runoob.com/w3cnote/zepto-js-source-analysis.html Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jqu ...

  6. 移动端zepto.js文件的构建

    因为在zepto的官网http://www.zeptojs.cn/#download下载的文件只包括了默认的几个模块,这并不能全部适应我们所需功 能,还需要按自己需要去添加相应模块.所以需要去构建我们 ...

  7. zepto.js 源码注释备份

    /* Zepto v1.0-1-ga3cab6c - polyfill zepto detect event ajax form fx - zeptojs.com/license */ ;(funct ...

  8. zepto js 源码 解读

    /* Zepto v1.0-1-ga3cab6c - polyfill zepto detect event ajax form fx - zeptojs.com/license */ ;(funct ...

  9. Zepto.js入门介绍

    GitHub Zepto Zepto的一些可选功能是专门针对移动端浏览器的:因为它的最初目标在移动端提供一个精简的类似jquery的js库. Zepto不支持旧版本的Internet Explorer ...

随机推荐

  1. Java--笔记(4)

    31.中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源.中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯.是连接两个独立应用程序或独立系统的软 ...

  2. 链栈的C语言实现

    /* 功能:栈的链表实现 Author:lxm Date: 20160511 */ #include <stdio.h> #include <stdlib.h> #define ...

  3. [转] DBCP 的validationQuery

    原文地址:http://blog.csdn.net/fgakjfd/article/details/5600462 网上很多评论说DBCP有很多BUG,但是都没有指明是什么BUG,只有一部分人说数据库 ...

  4. 【转】oracle数据库开发的一些经验积累

    1.不安装Oracle客户连接Oracle 8的方法  请将以下文件拷贝到运行文件所在目录 一.ODBC动态库 : ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc ...

  5. quartz使用案例

    @Service public class QuartzServiceImpl extends BaseServiceImpl<JobDetails, String, QuartzTaskVO& ...

  6. Java算法-插入排序

    插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过程中逐个将比较过的 ...

  7. 【转】HTTP中的长连接和短连接分析

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

  8. Hive 的分桶 & Parquet 概念

    分区 & 分桶 都是把数据划分成块.分区是粗粒度的划分,桶是细粒度的划分,这样做为了可以让查询发生在小范围的数据上以提高效率. 分区之后,分区列都成了文件目录,从而查询时定位到文件目录,子数据 ...

  9. css选择器(选择<div>内所有<p>元素)

    情况1:<div><p></div> 情况2:<div><a><p></p></a></div&g ...

  10. [NOIP2014] 提高组 洛谷P1941 飞扬的小鸟

    题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便 ...