老生常谈的跨域处理(3)

//http://example.com/b.html <html> <head> <title>B页面</title> <script type="text/javascript" src="https://www.jb51.net/jquery.js"></script> </head> <body> <div>B页面</div> <script> $(function(){ try{ document.domain = "example.com"; //这里将document.domain设置成一样 }catch(e){} }); </script> </body> </html>

这里有个注意点,就是在A页面中,要等iframe标签完成加载B页面之后,再取iframe对象的contentDocument,否则如果B页面没有被iframe完全加载,在A页面中通过contentDocument属性就取不到B页面中的jQuery对象。

一旦取到B页面中的jQuery对象,就可以直接发ajax请求了,这种类似“代理”方式可以解决主子域的跨域问题。

缺点:

只有在主域相同的时候才能使用该方法

4、HTML5的postMessage

原理:

没啥原理,就是一个html5所提供的一个API.--->HTML5 window.postMessage是一个安全的、基于事件的消息API。

在需要发送消息的源窗口调用postMessage方法即可发送消息。其中.源窗口可以是全局的window对象,也可以是以下类型的窗口:

1、文档窗口中的iframe:

var iframe = document.getElementById('my-iframe'); var win = iframe.documentWindow;

2、JavaScript打开的弹窗:

var win = window.open();

3、当前文档窗口的父窗口:

var win = window.parent;

4、

var win = window.opener();

发送消息:找到源window对象后,即可调用postMessage API向目标窗口发送消息:

win.postMessage(msg, targetOrigin);

说明:postMessage函数接收两个参数:

1、msg, 将要发送的消息,可以使一切javascript参数,如字符串,数字,对象,数组等。

2、targetOrigin,这个参数称作“目标域”,注意,是目标域不是本域!比如,你想在2.com的网页上往1.com网页上传消息,那么这个参数就是“”,而不是2.com.协议,(一个完整的域名包括:主机名,端口号。如::80/

接收消息:那目标窗口要怎么接收传过来的数据呢,只要监听window的message事件就可以接收了。

var onmessage = function (event) { var data = event.data; var origin = event.origin; //do someing }; if (typeof window.addEventListener != 'undefined') { window.addEventListener('message', onmessage, false); } else if (typeof window.attachEvent != 'undefined') { //for ie window.attachEvent('onmessage', onmessage); }

message事件监听函数接收一个参数,Event对象实例,该对象有三个属性:

data : 消息

origin:消息的来源地址

source:发送消息窗口的window对象引用

使用方法(案例):

--> 发送消息的页面

<!-- 这个是 页面 --> <div> <!-- 要给下面的页面传一个妹子过去 --> <iframe src="https://lsLib.com/lsLib.html"></iframe> </div> <script type="text/javascript"> window.onload=function(){ window.frames[0].postMessage('苍老师','http://lslib.com'); } </script>

--> 接收消息的页面

<!-- 这个是 页面 --> <script type="text/javascript"> window.addEventListener('message',function (e) { console.log(e.origin,e.data); alert('收到妹子一枚:'+e.data); }); </script>

优缺点:

优点:方便,安全,有效的解决了跨域问题

缺点:万恶的资本主义,ie8+才支持,而且ie8+<ie10只支持iframe的方式。

5、使用window.name来进行跨域(相对比较完美的方法)

原理:  

当iframe的页面跳到其他地址时,其window.name值保持不变,并且可以支持非常长的 name 值(2MB)。

浏览器跨域iframe禁止互相调用/传值.但是调用iframe时 window.name 却不变,正是利用这个特性来互相传值,当然跨域下是不容许读取ifram的window.name值.

所以这里我们还要准备一个和主页面 相同域下的代理页面 ,iframe调用子页面

使用方法:

1、准备三个页面:

    //应用页面

     // 代理页面,要求和应用页面在同一个域。一般是一个空的html

   //应用页面获取数据的页面,简称:数据页面

2、数据页面将数据传到window.name中去。如下:

中的 data.html

// data.html window.name="苍老师"; //可以是其他类型的数据,比如数组,对象等等

   //应用页面的代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwdspz.html