当前位置: 首页 > news >正文

Vue3 + TypeScript 实现 iframe 嵌入与通信的完整指南以及全屏弹窗方案

创建一个 IframeComponent 组件,用于嵌入 iframe

创建 src/components/IframeComponent.vue 文件:

<template><div class="iframe-container"><iframe ref="iframeRef" :src="src" :style="iframeStyle" @load="handleIframeLoad"></iframe></div>
</template><script lang="ts" setup>
import { ref, onMounted, computed } from 'vue';const props = defineProps({src: {type: String,required: true,},fullscreen: {type: Boolean,default: false,},
});const iframeRef = ref<HTMLIFrameElement | null>(null);const iframeStyle = computed(() => ({width: props.fullscreen ? '100vw' : '600px',height: props.fullscreen ? '100vh' : '400px',border: 'none',
}));const handleIframeLoad = () => {console.log('Iframe loaded');
};onMounted(() => {if (iframeRef.value) {iframeRef.value.addEventListener('load', handleIframeLoad);}
});
</script><style scoped>
.iframe-container {position: relative;overflow: hidden;
}
</style>

实现父子通信

创建 src/components/ParentComponent.vue 文件

<template><div class="parent-container"><h1>父组件</h1><button @click="sendMessage">向Iframe发送消息</button><button @click="toggleFullscreen">切换全屏</button><IframeComponentref="iframeComponentRef":src="iframeSrc":fullscreen="isFullscreen"/></div>
</template><script lang="ts" setup>
import { ref } from 'vue';
import IframeComponent from './IframeComponent.vue';const iframeComponentRef = ref(null);
const iframeSrc = "https://example.com";
const isFullscreen = ref(false);const sendMessage = () => {const iframeWindow = iframeComponentRef.value?.iframeRef?.contentWindow;if (iframeWindow) {iframeWindow.postMessage("来自父组件的问候", "*");}
};const toggleFullscreen = () => {isFullscreen.value = !isFullscreen.value;
};
</script><style scoped>
.parent-container {padding: 20px;
}button {margin-right: 10px;margin-bottom: 10px;
}
</style>

iframe 接收消息

在 iframe 加载的页面中,需要添加代码来监听来自父页面的消息。

创建 public/iframe.html 文件:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Iframe页面</title><style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f0f0f0;}.message-container {background-color: white;padding: 20px;border-radius: 8px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);}</style></head><body><div class="message-container"><h1>Iframe页面</h1><p id="message">等待消息...</p></div><script>window.addEventListener("message", (event) => {console.log("收到来自父页面的消息:", event.data);document.getElementById("message").textContent = `收到消息: ${event.data}`;});</script></body>
</html>

使用组件

在 App.vue 中使用创建的 ParentComponent

<template><div id="app"><ParentComponent /></div>
</template><script lang="ts" setup>
import ParentComponent from './components/ParentComponent.vue';
</script>

iframe 内置弹框全屏问题解决方案

  1. iframe 宽高设置全屏,背景透明,border 设为 0,position 设置为 absolute top,left 设为0。
  2. 内嵌的 html 页面添加padding限制实际展示大小(具体值可由父级传到子级)。
  3. 内嵌页面 bodypadding。
  4. 监听内嵌页面的鼠标移动事件,和父级鼠标移动事件,判断鼠标位置确定用户操作范围,动态修改 iframe 范围外的其他元素层级,以便鼠标点击。

http://www.mrgr.cn/news/58546.html

相关文章:

  • 动态规划-子序列问题——376.摆动序列
  • 青训营 X 豆包MarsCode 技术训练营--最大矩形面积问题
  • MATLAB锂电概率分布模型
  • 微积分复习笔记 Calculus Volume 1 - 3.7 Derivatives of Inverse Functions
  • 学习webservice的心得
  • TinTin Web3 动态精选:Vitalik 探讨以太坊协议,Solana ETN 开启质押功能
  • Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
  • Openpyxl--学习记录
  • 标准数字隔离器主要特性和应用---腾恩科技
  • 盘点双十一最值得买的好物有哪些?盘点2024双十一超值好物推荐
  • CTF-RE 从0到N: 重新定义ida识别错误的变量
  • Java基础题:搬砖
  • 将接近感应添加到您的下一个嵌入式设计中
  • Kubernetes高可用方案
  • shell编程实例1—猜数字游戏
  • 《中安未来护照阅读器:边检行业的高效利器》
  • springboot小区物业报修管理系统-计算机设计毕业源码03418
  • ECharts系列:图表中显示点,点与点之间不连线
  • LINUX1.5.1(vim编辑器)
  • dinput8.dll文件的用途、常见问题、以及修复dinput8.dll错误的几种方法