一、前言
$.ajax
是zepto发送请求的核心方法,$.get
,$.post
,$.jsonp
都是封装了$.ajax
方法。$.ajax
将jsonp与异步请求的代码格式统一起来,内部主要是先处理url,数据和请求头部然后新建XMLHttpRequest对象发送请求。
二、源码
(function ($) {
var jsonpID = +new Date(),
document = window.document,
key,
name,
rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
scriptTypeRE = /^(?:text|application)\/javascript/i,
xmlTypeRE = /^(?:text|application)\/xml/i,
jsonType = 'application/json',
htmlType = 'text/html',
blankRE = /^\s*$/,
originAnchor = document.createElement('a');
originAnchor.href = window.location.href;
//触发自定义事件并且如果阻止默认事件触发返回false
function triggerAndReturn(context, eventName, data) {
var event = $.Event(eventName);
$(context).trigger(event, data);
return !event.isDefaultPrevented()
}
//触发ajax的全局事件
function triggerGlobal(settings, context, eventName, data) {
if (settings.global) return triggerAndReturn(context || document, eventName, data)
}
//正在ajax请求数量
$.active = 0;
//第一次ajax触发时触发,绑定在document上
function ajaxStart(settings) {
if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart')
}
//所有ajax都已经停止触发,绑定在document上
function ajaxStop(settings) {
if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop')
}
//触发beforeSend事件或全局ajaxBeforeSend事件,如果有一个返回false,则取消此次请求;否则触发ajaxSend全局事件
function ajaxBeforeSend(xhr, settings) {
var context = settings.context;
if (settings.beforeSend.call(context, xhr, settings) === false ||
triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false)
return false;
triggerGlobal(settings, context, 'ajaxSend', [xhr, settings])
}
//请求成功调用函数
function ajaxSuccess(data, xhr, settings, deferred) {
var context = settings.context, status = 'success';
settings.success.call(context, data, status, xhr);
if (deferred) deferred.resolveWith(context, [data, status, xhr]);
triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data]);
ajaxComplete(status, xhr, settings)
}
//请求失败调用函数 type: "timeout", "error", "abort", "parsererror"
function ajaxError(error, type, xhr, settings, deferred) {
var context = settings.context;
settings.error.call(context, xhr, type, error);
if (deferred) deferred.rejectWith(context, [xhr, type, error]);
triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type]);
ajaxComplete(type, xhr, settings)
}
//请求完成调用函数 status: "success", "notmodified", "error", "timeout", "abort", "parsererror"
function ajaxComplete(status, xhr, settings) {
var context = settings.context;
settings.complete.call(context, xhr, status);
triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings]);
ajaxStop(settings)
}
//执行自定义过滤函数
function ajaxDataFilter(data, type, settings) {
if (settings.dataFilter == empty) return data;
var context = settings.context;
return settings.dataFilter.call(context, data, type)
}
// Empty function, used as default callback
function empty() {
}
$.ajaxJSONP = function (options, deferred) {
if (!('type' in options)) return $.ajax(