首先什么是跨域,简单地理解就是因为JavaScript同源策略( Access-Control-Allow-Origin)的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象。更详细的说明可以看下表:
URL | 说明 | 是否允许通信 |
---|---|---|
http://www.a.com/a.js http://www.a.com/b.js | 同一域名下 | 允许 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js | 同一域名下不同文件夹 | 允许 |
http://www.a.com:8000/a.js http://www.a.com/b.js | 同一域名,不同端口 | 不允许 |
http://www.a.com/a.js https://www.a.com/b.js | 同一域名,不同协议 | 不允许 |
http://www.a.com/a.js http://70.32.92.74/b.js | 域名和域名对应ip | 不允许 |
http://www.a.com/a.js http://script.a.com/b.js | 主域相同,子域不同 | 不允许 |
http://www.a.com/a.js http://a.com/b.js | 同一域名,不同二级域名(同上) | 不允许(cookie这种情况下也不允许访问) |
http://www.cnblogs.com/a.js http://www.a.com/b.js | 不同域名 | 不允许 |
解决跨域访问页面对象的问题有6种方法,详见http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html。 本文仅介绍JQuery jsonp方法。
Jquery Jsonp
请求字符串中一定要有“callback”的字符串,它定义了处理函数。如果这个值=?,jquery将自动生成一个随机函数。一定要不保证服务器返回的数据型如
callbackname(json)
jQuery.ajax方法:
jQuery(document).ready(function(){
$.ajax({
type: "get",
async: false,
url: "http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?",
dataType: "jsonp",
jsonp: "callbackparam",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback: "success_jsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
success: function(json){
$("body").append(json.postalcodes[0].adminCode2);
},
error: function(){
alert('failed');
}
});
});
Jquery.getJSON方法:
jQuery.getJSON("http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?", function(data){ alert(data.postalcodes[0].postalcode); });
网上也有人开发了jquery.jsonp插件,大家也可以研究一下。
参考文献:
1, Cross-domain communications with JSONP, Part 1: Combine JSONP and jQuery to quickly build powerful mashups
http://www.ibm.com/developerworks/library/wa-aj-jsonp1/
2, JQuery.ajax
http://api.jquery.com/jQuery.ajax/
3, JQuery.getJSON
http://api.jquery.com/jQuery.getJSON/
4, JavaScript跨域总结与解决办法
http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html
5, 跨域请求之jQuery的ajax jsonp的使用解惑
http://www.cnblogs.com/know/archive/2011/10/09/2204005.html
6, JavaScript: Use a Web Proxy for Cross-Domain XMLHttpRequest Calls