在开发中引用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页面代码如下:html>
html5 PostMessage 演示实例点我传值给B域名下的页面
function setmsgb(){
window.frames[0].postMessage('setmsga','http://localhost');
}
window.addEventListener('message',function(e){
alert(e.data);
},false);
b页面代码如下:html>
我是b页面点我传值给A域名下页面
// 接收判断是不是a页面传递过来的值
window.addEventListener('message',function(e){
alert('A域名下页面传递的值为'+e.data);
},false);
// 函数
function setmsga () {
window.parent.postMessage('我是B域名下页面传过来的','*');
}
最后的演示效果如下:
通过上面的演示,很直接的看到我们两个域名直接 的通信成功了。
那么它的浏览器兼容性怎么样呢?
所谓浏览器兼容性几乎变成了IE几开始支持的问题了,不过好消息是跟localStorage一样,IE8+都支持了,所以最好使用事件绑定的写法,为了兼容IE,也要判断是否支持addEventListener。