iframe 跨域

175 阅读1分钟

针对iframe的使用与属性配置详情参考 : developer.mozilla.org/zh-CN/docs/…

此处重点记录一下 iframe 脚本

MDN 中提到 :

image.png

受同源策略限制 子父窗口之间无法通过脚本直接操作 这时就需要通过跨域解决

iframe 跨域 有两种场景 :

  1. 主域相同子域不同
  2. 域名完全不同

主域相同子域不同

对于主域相同子域不同的两个页面,我们可以通过设置 两个窗口 document.domain 是他们的值一致 例如: 网页a local-platform.apps.com/ 和 网页b frame-test.apps.com/ 网页a中 使用iframe 嵌套 网页b 此时需要 在a页面 和 b页面 分别设置 document.domain = 'apps.com' 即可

如何在本地测试: 首先在本地起了两个服务 分别是: http://localhost:8000http://localhost:8080 然后在本地hosts文件中分别给这个两个服务提供域名 mac 通过:

cd /private/etc
sudo vim hosts

进入 hosts 文件 并添加

image.png

然后通过nginx 监听两个server 配置如下

image.png

此时可以通过 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)
})