针对iframe的使用与属性配置详情参考 : developer.mozilla.org/zh-CN/docs/…
此处重点记录一下 iframe 脚本
MDN 中提到 :
受同源策略限制 子父窗口之间无法通过脚本直接操作 这时就需要通过跨域解决
iframe 跨域 有两种场景 :
- 主域相同子域不同
- 域名完全不同
主域相同子域不同
对于主域相同子域不同的两个页面,我们可以通过设置 两个窗口 document.domain 是他们的值一致 例如: 网页a local-platform.apps.com/ 和 网页b frame-test.apps.com/ 网页a中 使用iframe 嵌套 网页b 此时需要 在a页面 和 b页面 分别设置 document.domain = 'apps.com' 即可
如何在本地测试: 首先在本地起了两个服务 分别是: http://localhost:8000 和 http://localhost:8080 然后在本地hosts文件中分别给这个两个服务提供域名 mac 通过:
cd /private/etc
sudo vim hosts
进入 hosts 文件 并添加
然后通过nginx 监听两个server 配置如下
此时可以通过 local-platform.apps.com/ 来访问 http://localhost:8000 通过 frame-test.apps.com/ 访问 http://localhost:8080
在 local-platform.apps.com/ 添加 引入 iframe
<iframe id="frame-test" class="frame-test" src="http://frame-test.apps.com" frameborder="0"></iframe>
并分别设置 window.document.domain = 'apps.com'
然后就可以 通过脚本操作 iframe 嵌套的网页内容了
域名完全不同
如果域名完全不同 可以采用 window.postMessage 来实现窗口间交互 关于postMessage的使用这里暂不记录可以查阅资料
案例一 父窗口向子窗口 发送数据
在父窗口 发送代码如下
const frame = document.getElementById('frame-test') // 获取iframe
frame.onload = () => {
const frameWin = frame.contentWindow
frameWin.postMessage({ msg: 'test-frame' }, 'http://frame-test.apps.com')
}
子窗口接受
window.addEventListener('message', (e)=>{
console.log('App.vue: 46 >>>>> ', e.data)
})
案例二
子窗口 发送数据
window.parent.postMessage({name: 'frame-test-message'}, 'http://local-platform.apps.com')
父窗口接受数据
window.addEventListener('message', (e) => {
console.log('allProject.vue: 235 >>>>> ', e.data)
})