主项目通过iframe嵌套子项目,子项目弹框无法全屏

之所以调研iframe技术,是因为一个问题引起的。

问题:主项目通过iframe嵌套子项目,子项目弹框无法全屏,请问有什么方案解决呢?

经过调研,有以下方式解决:

  1. 主项目实现一个弹框,子项目和主项目进行通信,对弹框进行控制。
  2. 子项目通过getContainer把弹框挂载到主项目的body上。
  3. 如果是简单的弹框,可以手写一个。

第1种方案是比较通用的方案,比较简单。

但有时候会存在这样的问题,主项目无法修改,怎么办?只能用第3种方案,自己手写一个弹框了。

好多人会使用第2中方案,因为毕竟a-modal给出了这样的api,但第2种方案有坑,并且坑不小。它不是一个通用方案不建议使用,实在没办法,也可以尝试着一用。

第2种方案会存在以下问题:

  • 子项目挂载到主项目的body上,a-modal的样式丢失。

以上问题如何解决:

第一种方法:在主项目上放一个a-modal,用v-show="false"隐藏,这样子项目挂载到主项目body上的a-modal也有了样式。

主项目

xml 复制代码
<template>
  <a-card title="主项目 - 子项目展示">
    <div>
      <iframe
        ref="iframeRef"
        :src="subAppUrl"
        frameborder="0"
      ></iframe>
    </div>
    <!-- 可以用v-show -->
    <a-modal v-show="false" v-model:open="open" title="Basic Modal" @ok="handleOk">
      <p>Some contents...</p>
      <p>Some contents...</p>
      <p>Some contents...</p>
    </a-modal>
  </a-card>
</template>

<script setup>
import { ref } from 'vue'

const iframeRef = ref(null)
// 通过代理访问子项目,确保同域名
const subAppUrl = ref('/sub-app/')


const open = ref(true);

const showModal = () => {
  open.value = true;
};

const handleOk = (e) => {
  console.log(e);
  open.value = false;
};
</script>
ini 复制代码
<script setup>
import { ref } from 'vue'

const iframeRef = ref(null)
// 通过代理访问子项目,确保同域名
const subAppUrl = ref('/sub-app/')


const open = ref(true);

const showModal = () => {
  open.value = true;
};

const handleOk = (e) => {
  console.log(e);
  open.value = false;
};
</script>

子项目

ini 复制代码
<a-modal
  v-model:open="modalVisible"
  title="弹框"
  width="600px"
  :get-container="getContainer"
  @ok="handleOk"
  @cancel="handleCancel"
>
  <div class="modal-content">
    <h2>这是一个弹框</h2>
    <p>弹框内容区域</p>
    <a-space>
      <a-button>按钮1</a-button>
      <a-button>按钮2</a-button>
    </a-space>
  </div>
</a-modal>
javascript 复制代码
// 获取主项目的body作为弹框容器
const getContainer = () => {  
  try {
    // 通过 window.parent 访问主项目的 document
    if (window.parent && window.parent !== window.self) {
      console.log('window.parent.document:', window.parent.document)
      if (window.parent.document && window.parent.document.body) {
        console.log('成功获取父窗口body')
        return window.parent.document.body
      }
    } else {
      console.warn('window.parent 不存在或等于 window.self')
    }
  } catch (e) {
    // 如果跨域,会抛出错误,则使用当前窗口的body
    console.error('无法访问父窗口,使用当前窗口body:', e)
  }
  console.log('使用当前窗口body')
  return document.body
}

第二种方式:需要把a-modal的样式注入进去。

这种代码就不贴了,个人觉得比较麻烦,并且还有不确定的边界,个人不建议用这种方式。

相关推荐
IT_陈寒27 分钟前
Vite动态导入把我坑惨了,原来要这样用才对
前端·人工智能·后端
DFT计算杂谈31 分钟前
KPROJ编译教程
java·前端·python·算法·conda
觅_33 分钟前
前端学习后端的时候 选择一个技术
前端·学习
独泪了无痕36 分钟前
CryptoJS:数据安全的JavaScript加密利器
前端·vue.js·node.js
发现一只大呆瓜1 小时前
一文搞懂 Vite 处理CommonJS包、按需编译逻辑及 Rollup 插件兼容规则
前端
Edwardwu1 小时前
写了个y-mxgraph:给 draw.io 接上了 Yjs,顺便解决了部署在 iframe 里的一堆问题
前端·typescript
其实防守也摸鱼1 小时前
软件安全与漏洞--软件安全编码
java·前端·网络·安全·网络安全·web·工具
发现一只大呆瓜2 小时前
Vite 开发预构建机制详解,搞懂 esbuild 与 Rollup 分工差异
前端·面试·vite
熊猫_豆豆2 小时前
一个模拟四轴飞行器在随机气流扰动下悬停飞行的交互式3D仿真网页,包含飞行器建模与PID控制算法
javascript·3d·html·四轴无人机模拟飞行
九九落3 小时前
前端获取经纬度完全指南:从Geolocation API到地图集成
前端·获取经纬度