functionprescript(s){
if(s.cache===undefined){
s.cache=false;
}
if(s.crossDomain){
s.type="GET";
}
}
functionprejsonp(s,originalSettings,jqXHR){
//给回调函数命名
varcallbackName=s.jsonpCallback
s.url+=(/(?:)/.test(s.url)?"&":"?")+s.jsonp+"="+callbackName;
//脚本执行后使用数据转换器来检索json
//提供给代码获取服务器的是据
s.getData=function(){
if(!responseContainer){
jQuery.error(callbackName+"wasnotcalled");
}
returnresponseContainer[0];
};
//修改处理机制
s.dataTypes[0]="json";
//创建一个全局函数
overwritten=window[callbackName];
//用来收集服务器给的数据
window[callbackName]=function(){
responseContainer=arguments;
};
return"script";
}
/**
*jsonp的预先处理
*/
functioninspectPrefiltersOrTransportsA(options,originalOptions,jqXHR){
//预处理jsonp
vardataTypeOrTransport=prejsonp(options,originalOptions,jqXHR)
//扩充dataTypes
options.dataTypes.unshift(dataTypeOrTransport);
//预处理script类型
prescript(options)
}
/**
*分发器
*@return{[type]}[description]
*/
functioninspectPrefiltersOrTransportsB(s,originalOptions,jqXHR){
return{
send:function(_,complete){
varscript=jQuery("<script>").prop({
async:true,
charset:s.scriptCharset,
src:s.url
}).on(
"loaderror",
callback=function(evt){
script.remove();
callback=null;
if(evt){
complete()
}
}
);
//<scriptasync=""src="http://192.168.1.113:8080/github/jQuery/jsonp.php
document.head.appendChild(script[0]);
}
}
}
/**
*模拟ajax的jsonp请求
*@param{[type]}options[description]
*@return{[type]}[description]
*/
functioncreateAjax(options){
if(typeofurl==="object"){
options=url;
url=undefined;
}
options=options||{};
/**
*参数
*jQuery.ajaxSetup是默认参数
*@type{[type]}
*/
vars=jQuery.ajaxSetup({},options);
//Deferreds
//异步机制
vardeferred=jQuery.Deferred();
varcompleteDeferred=jQuery.Callbacks("oncememory");
/**
*实际返回的ajax对象
*@type{Object}
*/
varjqXHR={}
//把jqXHR对象转化promise对象,幷加入complete、success、error方法
deferred.promise(jqXHR).complete=completeDeferred.add;
//别名
jqXHR.success=jqXHR.done;
jqXHR.error=jqXHR.fail;
s.dataTypes=jQuery.trim(s.dataType||"*").toLowerCase().match(/(?:)/)||[""];
//预处理
inspectPrefiltersOrTransportsA(s,options,jqXHR);
for(iin{
success:1,
error:1,
complete:1
}){
jqXHR[i](s[i]);
}
/**
*分发器
*/
transport=inspectPrefiltersOrTransportsB(s,options,jqXHR);
functiondone(status,nativeStatusText,responses,headers){
console.log(s,s.getData())
}
//发送请求
transport.send(s,done);
returnjqXHR;
}
functionshow(data){
$('body').append('<li>'+data+'</li>');
}
/**
*数据回调接收
*@return{[type]}[description]
*/
functionflightHandler(){
}
$("#test").click(function(){
//执行一个异步的HTTP(Ajax)的请求。
varajax=createAjax({
url:'http://192.168.1.113:8080/github/jQuery/jsonp.php',
data:{
'action':'aaron'
},//预传参的数组
dataType:'jsonp',//数据类型
jsonp:'callback',//指定回调函数名,与服务器端接收的一致,并回传回来
jsonpCallback:flightHandler,
success:function(){
show('局部事件success')
}
})
})