在项目中遇到的这个问题.跨域要注意的两点:(1)必须是get方式;(2)必须是json格式.
跨域直接用的jquery的getJson,那么后台返回的数据必须是json格式,同时,在url添加callback参数:
例:
$.getJSON('http://www.baidu.com?jsonpCallback=?',function(data){
});
用$.ajax()例子:
$.ajax({
url:'http://ext.event.guagua.cn/1/webDanceFighting/getPrizeList',
type:"get",
dataType:"jsonp",
jsonp:"jsonpCallback",
success: function(data){
}
});
用google浏览器调试发现改接口:
服务器返回数据:
jQuery17207754015033133328_1393899140726({"Name":"loogn","Age":23})
返回的字符串就是一个调用一个叫“jQuery17207754015033133328_1393899140726” 的函数,参数是{"Name":"loogn","Age":23}。
其实这个很长的函数名是请求路径中callback=?的作用,我想应该是这样的:$.getJSON方法生成一个对回调方法的引用的名字,换掉?。上面请求会变成
context.Response.Write(cb + " ( " + json + " ) ");
参数名callback也可换成jsoncallback,我想是怕冲突吧,jsoncallback应该优先检测,没有再检测callback(没测试!!)
?也可是具体的函数名,这样回调函数就不能是匿名的了,用?生成只是jQuery为我们的一般操作提供的一个便利。
API中介绍:
dataType:"jsonp", //"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
jsonp:"jsonpCallback", //在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。
但是按照上面方法而且后台返回是json数据的前提下,浏览器仍然报错:
什么原因呢???
具体参照:http://bbs.csdn.net/topics/390416751
总之:一般写法
<?php
header("content-type:text/json;charset=utf-8");
header("Cache-Control: no-cache, must-revalidate");
$username='{"name":"老邹","age":1984}';
echo $username;
?>
但是:jsonp需要一个调用来触发你传入getjson的那个函数,而触发就靠你传入的一个callback参数,这个参数值实际上就是一个特殊函数名,你返回的必须是一段JS代码,才能够触发它,也就是类似
callack_12324343({'hello':'world'});
因此你上面的echo $username;改成
echo "{$_GET['callback']}({$username});";
才算符合jsonp的要求...