/*可以跨域请求数据*/
其原理是对<script>装载的服务端数据用全局函数(callback)操作
首先写个简单示例:(jsonpCallback可动态创建注册成全局函数)
<scripttype="text/javascript">
varm=Math.random();
varjsonpCallback=newFunction("result","alert(result.data);");
</script>
<scripttype="text/javascript"src="http://localhost/json.PHP?jsonp=jsonpCallback"></script>
服务端:
<?PHP
echo"jsonpCallback({data:'jsondata'})";
会弹出:jsondata
$.get(url,params,callback)
与$.post请求方法一样,只是请求类型不同
返回的是字符格式,可以用$.evalJSON()方法进行转换格式
然后对JSON对象进行操作
$.getJSON(url,callback)
返回JSON对象,跨域示例如下:
-
<?PHP
-
functiongetdata()
-
{
-
$.getJSON(
-
"http://www.test.com/payment/payment/paytest?callback=?",
-
{id:1,name:"name"},
-
function(jsondata){
-
alert(jsondata.json);
-
});
-
}
-
-
翻开jquery.的源码,一步步找:
-
-
getJSON:function(url,data,callback){
-
returnjQuery.get(url,callback,"json");
-
}
-
-
再找JQuery.get
-
-
get:function(url,type){
-
//shiftargumentsifdataargumentwasomited
-
-
if(jQuery.isFunction(data)){
-
type=type||callback;
-
callback=data;
-
data=null;
-
}
-
-
returnjQuery.ajax({
-
type:"GET",
-
url:url,
-
data:data,
-
success:callback,
-
dataType:type
-
});
-
}
-
-
再找jQuery.ajax
-
-
jQuery.ajax({
-
url:url,
-
type:type,
-
dataType:"html",
-
data:params,
-
complete:function(res,status){
-
//Ifsuccessful,injecttheHTMLintoallthematchedelements
-
if(status==="success"||status==="notmodified"){
-
//Seeifaselectorwasspecified
-
self.html(selector?
-
//Createadummydivtoholdtheresults
-
jQuery("<div/>")
-
//injectthecontentsofthedocumentin,removingthescripts
-
//toavoidany'PermissionDenied'errorsinIE
-
.append(res.responseText.replace(rscript,""))
-
-
//Locatethespecifiedelements
-
.find(selector):
-
-
//Ifnot,justinjectthefullresult
-
res.responseText);
-
}
-
-
if(callback){
-
self.each(callback,[res.responseText,status,res]);
-
}
-
}
-
});
-
-
returnthis;
-
}
-
-
再找ajax方法,揭开秘密要来了:
-
-
由于太多,帖开头部分,有兴趣的同学自己去看下
-
-
ajax:function(origSettings){
-
vars=jQuery.extend(true,{},jQuery.ajaxSettings,origSettings);
-
-
varjsonp,
-
callbackContext=origSettings&&origSettings.context||s,
-
type=s.type.toUpperCase();
-
-
//convertdataifnotalreadyastring
-
if(s.data&&s.processData&&typeofs.data!=="string"){
-
s.data=jQuery.param(s.data,s.traditional);
-
}
-
-
比较重要的一部分:
-
-
http://localhost/index/ajax?callback=jsonp1274437815229&id=1
-
-
服务器判断是否有这个callback参数,如果有就返回JS函数名+对象
-
-
//jsonp=jsonp1274437815229(请求地址的回调参数)
-
-
//jsonp全局函数
-
window[jsonp]=window[jsonp]||function(tmp){
-
data=tmp;
-
success();
-
complete();
-
//Garbagecollect
-
window[jsonp]=undefined;