如何使用html5 PostMessage解决iframe完全跨域的问题

 jQuery/js   高蒙   阅读(304)    iframe跨域  postmessage   2016-12-19 13:17:38 


在开发中引用iframe页面是常见的,但是iframe完全跨域同时能够操作引入的iframe跨域页面中元素却很少见。

使用的场景有可能是:

  • 1.页面和其打开的新窗口的数据传递。

  • 2.多窗口之间消息传递。

  • 3.页面与嵌套的iframe消息传递。

此时,就牵扯到iframe完全跨域的问题。

这里介绍一个方法html5 PostMessage方法,html5引入的message的API可以更方便、有效、安全的解决这些难题。postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。

一、postMessage()的介绍?

语法:
postMessage(data,origin)

参数描述
data要传递的数据,html5规范中提到该参数可以是JavaScript的任意基本类型或可复制的对象,然而并不是所有浏览器都做到了这点儿,部分浏览器只能处理字符串参数,所以我们在传递参数的时候需要使用JSON.stringify()方法对对象参数序列化,在低版本IE中引用json2.js可以实现类似效果。
origin字符串参数,指明目标窗口的源,协议+主机+端口号[+URL],URL会被忽略,所以可以不写,这个参数是为了安全考虑,postMessage()方法只会将message传递给指定窗口,当然如果愿意也可以建参数设置为"*",这样可以传递给任意窗口,如果要指定和当前窗口同源的话设置为"/"。

二、如何通过PostMessage()实现iframe完全跨域。

我这里使用127.0.0.1 和 localhost 模拟两个域名。

a页面代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>html5 PostMessage 演示实例</title>
</head>
<body>
<button onclick="setmsgb();">点我传值给B域名下的页面</button>
<iframe id="child" src="http://localhost/b.html"></iframe>
    <script type="text/javascript">
        function setmsgb(){
            window.frames[0].postMessage('setmsga','http://localhost');
        }
        window.addEventListener('message',function(e){
            alert(e.data);
        },false);
    </script>
</body>
</html>

b页面代码如下:

<!doctype html>
<html>
    <head>
<title>我是b页面</title>
    </head>
    <body style="height:100%;">
        <button id="container" onclick="setmsga();">点我传值给A域名下页面</button>
        <script type="text/javascript">
    // 接收判断是不是a页面传递过来的值 
window.addEventListener('message',function(e){
alert('A域名下页面传递的值为'+e.data);
            },false);
// 函数
            function setmsga () {            
                window.parent.postMessage('我是B域名下页面传过来的','*');
            }
        </script>
    </body>
</html>

最后的演示效果如下:

a.jpgb.jpg

通过上面的演示,很直接的看到我们两个域名直接 的通信成功了。

那么它的浏览器兼容性怎么样呢?

所谓浏览器兼容性几乎变成了IE几开始支持的问题了,不过好消息是跟localStorage一样,IE8+都支持了,所以最好使用事件绑定的写法,为了兼容IE,也要判断是否支持addEventListener。




相关文章



最新评论


我要评论



回复:

Copyrights © 2016-2017 高蒙个人博客 www.shuchengxian.com, All rights reserved. 皖ICP备15015490号 皖公网安备 34152302000022号网站地图

关键词:iframe跨域,postmessage