首先说下同源,同源策略是浏览器的一种安全策略,所谓同源是指:域名、协议、端口完全相同。而跨域就是不同源!一般 a
, img
, link
, video
, audio
, 等等能够发出请求的标签都可以实现跨域访问。但是这些标签不能得到返回的东西,所以一般不会用他们来请求资源。
跨域方法
原生 JavaScript 跨域
1 2 3 4 5 6 7 8
| <script type="text/javascript"> function showuser(data) { var data = JSON.parse(data); console.log(data); }; </script>
<script src="http://x.cn/showalluser.html?callback=showuser" charset="utf-8"></script>
|
jQuery 跨域
1 2 3 4 5 6 7 8 9
| $.ajax({ type: "post", url: "http://127.0.0.1:8080/showalluser.html", dataType: "jsonp", jsonp: "callback", success: function(data) { console.log(data); } });
|
iframe 跨域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| function(URL, callBack) { $iframe = $("<iframe style='display: none;'></iframe>"); $iframe.prop("src", URL); $("body").append($iframe);
$iframe.on('load', function() { var ifrDocument = this.contentDocument;
var jsonStr = $(ifrDocument).find("body").text();
var jsonObj = JSON.parse(jsonStr);
callBack(jsonObj); $(this).remove(); }); }
|
原生 JavaScript 跨域封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <script>
function crossDomain(url,params,fn){ var head = document.getElementsByTagName('head')[0]; var cbName = 'jsonp'+ (Math.random() * Math.random()).toString().substr(2) + new Date().getTime(); window[cbName] = function(data){ fn(data); } var qstring = ''; for(var key in params){ qstring += key + '=' + params[key] + '&'; } qstring += 'callback=' + cbName; url += '?' + qstring; var scriptObj = document.createElement('script'); scriptObj.src = url; head.appendChild(scriptObj); } </script>
<script>
crossDomain('http://api.douban.com/v2/movie/in_theaters',{},function(data){ console.log(data); }) </script>
|
1 2 3 4
| <script src="jsonp412964552676679031484646377133(data)”>// 挂载在 window 上可以直接执行 /*远程获取的 data 传入 jsonp* 函数内容,交给回调函数fn(data) */ </script>
|