首先回顾一下什么是同源策略html
提到iframe有不少人嗤之以鼻,iframe的缺点不少,可是在某些特定场景下,也能够发挥不错的做用,首先看一下iframe的缺点:git
缺点:github
1.iframe会阻塞主页面的Onload事件;算法
2.相同域iframe和主页面共享http链接池,因此若是相同域用多个iframe会阻塞加载跨域
解决方案:浏览器
动态生成iframe,在主页面加载完成后去生产iframe加载,从而避免阻塞的影响
复制代码
3.iframe 对SEO不友好bash
在广告位以及内部系统等适合的场景中使用iframe
复制代码
otherWindow.postMessage(message, targetOrigin, [transfer]);
复制代码
otherWindow
是window对象的引用:markdown
window.open
/window.opener
使用window.open返回的对象dom
HTMLIFrameElement.contentWindow
iframe元素的contentWindow属性函数
window.parent
当前窗口的父窗口对象,若是没有返回自身
window.frames
当前窗口的全部直接子窗口
看起来比较复杂,若是想实现主页面和iframe交互,只须要第二项和第三项
targetOrigin
:
1.*
表明能够发送到任意origin
2.https:www.xxx.com:443
能够指定特定的origin
发送,默认端口号能够省略
以主页面中嵌套一个iframe为案例说明
主页面:
//html <iframe src="./iframe.html" id="iframe" frameborder="0" scrolling="no" width="100%"></iframe> 复制代码
//js //发送message var iframe = document.getElementById('iframe') iframe.contentWindow.postMessage(data, '*') 复制代码
子页面:
//js //监听message事件 window.addEventListener("message", receiveMessageFromIndex, false);//注意ie中事件绑定是attachEvent //回调函数 function receiveMessageFromIndex(event) { //传递的data能够从event.data中获取到 } 复制代码
//发送消息给主页面 window.parent.postMessage(data, '*'); //主页面监听方式和子页面同样 复制代码
这样就比较简单的实现了主页面和子页面的双向通讯。
须要注意的是postMessage
API
中的message
在ie8/ie9等一些低版本浏览器中,中是不支持除String
之外的其余类型时(由于不支持结构化克隆算法),因此,若是要兼容低版本ie,须要经过JSON.strigify
以及JSON.parse
去发送和接受。
这里给了一个主页面以及子页面的双向通讯的demo: