跨域代码总结

一,常用的jsonp跨域
1,在浏览器里面能拼得出来,但是正常代码请求返回如下:故代码不同源,需要进行跨域请求

Paste_Image.png
1,jsonp                                      只能get请求
2,document.domain +iframe          主域相同子域不同
3,windows.name  +iframe         不同页面不同域名都可以,且name可以支持非常长的String值
4,cors                              服务器端处理
5,location.hash +iframe         不分,利用代理
6,HTML postMessage              支持度挺高的 

跨域请求方式如下:

1,jsonp请求

注意:jsonp是利用src不受同源策略影响来实现的,src只能get请求方式
不能解决不同域的两个页面之间的如何进行JavaScript调用的问题

使用ajax调用jsonp
 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSONP实现跨域2</title>
</head>
<body>
    <div id="mydiv">
        <button id="btn">点击</button>
    </div>
</body>
<script type="text/javascript">
    function handleResponse(response){
            console.log(response);
    }
</script>
<script type="text/javascript">
    window.onload = function() {

    var oBtn = document.getElementById('btn');

    oBtn.onclick = function() {     

        var script = document.createElement("script");
        script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
        document.body.insertBefore(script, document.body.firstChild);   
使用jquery的$ajax()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery实现JSONP</title>
</head>
<body>
    <div id="mydiv">
        <button id="btn">点击</button>
    </div>
</body>
<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", // 返回的数据类型,设置为JSONP方式
                jsonp : 'callback', //指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback
                jsonpCallback: 'handleResponse', //设置回调函数名
                data : {
                    q : "javascript", 
                    count : 1
                }, 
                success: function(response, status, xhr){
 console.log('状态为:' + status + ',状态是:' + xhr.statusText);
                    console.log(response);
                }
            });
        });
    });
</script>
</html>
通过getJSON()来实现jsonp跨域
$.getJSON("https://api.douban.com/v2/book/search?q=javascript&count=1&callback=?", function(data){
                console.log(data);
            });

2,主域相同,子域不同,document.domain + iframe

注意:形式可以是一个页面里面嵌套iframe(另一个页面或者域之间的数据通信)
实现方式如下:可以把2个界面的document.domain设置成一样的,但是只能设置成本身,后者更高一级的父域才行。

  在页面(http://www.damonare.cn/a.html) 中设置document.domain:

<iframe id = "iframe" src="http://damonare.cn/b.html" onload = "test()"></iframe>
<script type="text/javascript">
    document.domain = 'damonare.cn';//设置成主域
    function test(){
        alert(document.getElementById('iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象
    }
</script>
------------------------------------------------------------------
在页面(http://damonare.cn/b.html) 中也设置document.domain:

<script type="text/javascript">
    document.domain = 'damonare.cn';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同
</script>

3,通过location.hash + + iframe跨域

主域不同

4,通过HTML5的postMessage方法跨域

两个页面之间的通信

A页面通过postMessage方法发送消息:

window.onload = function() {  
    var ifr = document.getElementById('ifr');  
    var targetOrigin = "http://www.google.com";  
    ifr.contentWindow.postMessage('hello world!', targetOrigin);  
};
B页面通过message事件监听并接受消息:

var onmessage = function (event) {  
  var data = event.data;//消息  
  var origin = event.origin;//消息来源地址  
  var source = event.source;//源Window对象  
  if(origin=="http://www.baidu.com"){  
console.log(data);//hello world!  
  }  
};  
if (typeof window.addEventListener != 'undefined') {  
  window.addEventListener('message', onmessage, false);  
} else if (typeof window.attachEvent != 'undefined') {  
  //for ie  
  window.attachEvent('onmessage', onmessage);  
}

5,使用 CORS跨域

浏览器和服务器之间的通信,思想就是使用自定义HTTP头部让浏览器和服务器进行通信

平时正常写代码
<script type="text/javascript">
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://segmentfault.com/u/trigkit4/",true);
    xhr.send();
</script>
服务器设置请求头:Access-Control-Allow-Origin启用CORS。
Access-Control-Allow-Origin:*//或者是通配符
兼容:IE10+
 

6,使用windows.name + + iframe跨域

** windows都有一个name属性,在页面载入期间,都是共享应name属性**

比如:我们在任意一个页面输入
window.name = "My window's name";
setTimeout(function(){
    window.location.href = "http://damonare.cn/";
},1000)
--------------------------
进入damonare.cn页面后我们再检测再检测 window.name :
window.name; // My window's name
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 关于前端跨域的解决方法的多种多样实在让人目不暇接。以前碰到一个公司面试的场景是这样的,好几个人一起在等待面试...
    andreaxiang阅读 3,335评论 1 4
  • 1. 什么是跨域? 跨域一词从字面意思看,就是跨域名嘛,但实际上跨域的范围绝对不止那么狭隘。具体概念如下:只要协议...
    w_zhuan阅读 3,541评论 0 0
  • 1. 什么是跨域? 跨域一词从字面意思看,就是跨域名嘛,但实际上跨域的范围绝对不止那么狭隘。具体概念如下:只要协议...
    他在发呆阅读 4,210评论 0 0
  • 前言相信每一个前端er对于跨域这两个字都不会陌生,在实际项目中应用也是比较多的。但跨域方法的多种多样实在让人目不暇...
    Www刘阅读 3,878评论 2 23
  • “来书云:日用功夫中是立志……离群索居之人,当更有何法以处之?”。“工夫大略亦只是如此用,只要无间断,得到纯熟后,...
    小岳1579阅读 3,843评论 0 0