跨域解决方案整理笔记
一. 前言①. 跨域知识:
②. 跨域阻碍
但 :
<img> 的src(获取图片)
<link>的href(获取css)
<script>的src(获取javascript) 这三个都不符合同源策略,它们可以跨域获取数据
二. JSONP跨域解决方案①. 知识点
②. 代码实现方式
1). js 实现方式
<script type="text/javascript"> window.onload = function() { var oBtn = document.getElementById('btn'); //TODO 小小的点击事件 oBtn.onclick = function() { var script = document.createElement("script"); //TODO 注意最后的 callback参数,此为回调标识 script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse"; document.body.insertBefore(script,document.body.firstChild); }; }; //TODO 此处为回调函数 function handleResponse(response){ console.log(response); } </script>
2). jQuery 封装 JSONP
<script type="text/javascript" src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
<script type="text/javascript"> $(function(){ $("#btn").click(function(){ $.ajax({ async : true,url : "https://api.douban.com/v2/book/search",type : "GET",dataType : "jsonp",//TODO 返回的数据类型,设置为JSONP方式 jsonp : 'callback',//指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback //TODO 设置回调函数名,如果不想在下面的 success:function()处理数据, //TODO 可以创建同名方法 handleResponse(response) jsonpCallback: 'handleResponse',data : { q : "javascript",count : 1 },success: function(response,status,xhr){ //console.log('状态为:' + status + ',状态是:' + xhr.statusText); console.log(response); } }); }); }); </script>
3). $.getJSON()
<script type="text/javascript" src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
<script type="text/javascript"> $(function(){ $("#btn").click(function(){ $.getJSON("https://api.douban.com/v2/book/search?q=javascript&count=1&callback=?",function(data){ console.log(data); }); }); }); </script>
③. JSONP的优缺点1). JSONP的优点
2). JSONP的缺点
④. 可行方案思考
⑤. 文章推荐
三. CORS 方案
"Access-Control-Allow-Origin:*";//允许任何域向我们的服务器发送请求
四. 设置 document.domain方案
①. 代码实现方式
// url http://bentos.com/foo
var ifr = document.createElement('iframe');
ifr.src = 'http://b.bentos.com/foo';
ifr.onload = function() {
var ifrdoc = ifr.contentDocument || ifr.contentWindow.document;
ifrdoc.getElementsById("foo").innerHTML);
};
ifr.style.display = 'none';
document.body.appendChild(ifr);
// URL http://b.bentos.com/bar
document.domain = 'bentos.com'
// URL: http://b.bentos.com/foo
var data = {
foo: 'bar',bar: 'foo'
};
callback(data);
五. window.name 方案
六. CSST (CSS Text Transformation)
七. window.postMessage
// URL: http://bentos.com/foo
var win = window.open('http://b.com/bar');
win.postMessage('Hello,bar!','http://b.com');
// URL: http://baidu.com/bar
window.addEventListener('message',function(event) { console.log(event.data); }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |