//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 window.name="苍老师"; //可以是其他类型的数据,比如数组,对象等等