html跨域传值,iframe 跨域传参

iframe 跨域传参

2020-08-19

编程之家

https://www.jb51.cc

编程之家收集整理的这篇文章主要介绍了iframe 跨域传参,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

@H_403_0@

@H_403_0@

parent-index.html: (本地起服务,放在5000端口上)

//当前脚本

function resize() {

var ifr = document.getElementById(‘sendMessage‘);

//使用iframe的window向iframe发送message。

ifr.contentWindow.postMessage("123","http://localhost:5001");

window.addEventListener(‘message‘,function (e) {

alert(‘回传 ‘ + e.data)

})

}

child-second.html: (本地起服务,放在5001端口上)

xxxxx

window.addEventListener(‘message‘,receiver,false);

function receiver(e) {

if (e.data) {

console.log(e)

// 注释掉的为单次父子交互

// var obj = {‘name‘: ‘qwer‘,‘age‘: ‘xxx‘}

// e.source.postMessage(JSON.stringify(obj),e.origin);

// console.log(e.data)

document.getElementById(‘howMuch‘).onclick = function second() {

// 父子建立联系后,儿子html可以通过点击事件多次主动向父亲传值

var obj = {‘name‘: ‘qwer‘,‘age‘: ‘xxx‘}

window.parent.postMessage(JSON.stringify(obj),‘http://localhost:5000‘)

}

} else {

alert(e.data);

}

}

.

<think>好的,我现在需要帮助用户在Vue项目中通过iframe嵌入同一系统的其他Vue页面。首先,我需要回顾用户提供的引用内容,看看有什么可以参考的信息。 引用[1]提到了创建一个Vue组件来封装iframe元素,使用props递URL、宽度和高度。还提到了样式设置,比如宽高比16:9。这应该是基础步骤。用户的问题是要嵌入同一系统的其他Vue页面,所以URL可能需要指向本地路由或组件。 引用[2]指出不建议随意使用iframe,除非必要,并提到父子页面通信的问题。用户的需求是同一系统,可能涉及组件间的通信,比如传参或状态同步,需要注意如何解决。 引用[3]提供了父子系统通过postMessage通信的例子,父系统给子系统的iframe。这可能对用户有帮助,如果他们需要在嵌入的页面和父页面之间递数据的话。 接下来,用户的问题是如何在Vue中嵌入同一系统的其他Vue页面。首先,我需要确定用户是想嵌入另一个Vue组件,还是通过路由访问的页面。如果是路由页面,可以通过iframe的src属性指向对应的路由路径,比如'/page1'。如果是组件,可能需要构建独立的入口文件,但通常Vue项目通过路由来管理页面,所以更可能是前者。 步骤一:创建Iframe组件。参考引用[1]的示例,封装一个可复用的iframe组件,接收URL参数。需要确保样式适配,比如使用响应式宽高比。 步骤二:嵌入本地路由页面。假设其他Vue页面有对应的路由路径,在父页面中使用Iframe组件,入本地路由路径作为src。注意,如果使用Vue Router的路由模式为history模式,可能需要正确配置服务器以避免404错误。 步骤三:处理通信问题。如果嵌入的页面需要与父页面交互,可以使用postMessage API,如引用[3]所示。父页面通过postMessage发送数据,子页面监听message事件,反之亦然。需要注意问题,但同一系统下可能不存在,需确保端口和协议一致。 步骤四:优化与注意事项。考虑性能影响,避免不必要的iframe使用,如引用[2]提到的。如果只是展示静态内容,或许有其他替代方案,比如组件引入。但用户明确要求iframe,所以需要遵循最佳实践,比如懒加载、安全设置(sandbox属性)、避免阻塞主线程等。 可能的问题:嵌入的页面如何接收参数?可以通过URL查询参数递,子页面通过route.query获取。或者使用postMessage递数据。 验证步骤:检查iframe的src是否正确指向本地路由,确保路由配置正确,页面能正常加载。测试父子页面之间的通信是否正常,数据是否能正确递。 总结:最佳实践包括创建可复用的iframe组件,正确处理路由和通信,注意安全和性能优化。</think>### 分步解答:Vue中嵌入同一系统其他Vue页面的实践 #### 一、基础实现:创建可复用Iframe组件 1. **新建Iframe组件** 参考引用[1]的封装方式,创建`IframeComponent.vue`,通过props动态控制嵌入内容: ```vue <template> <div class="iframe-container"> <iframe :src="localUrl" :width="width" :height="height" frameborder="0" allowfullscreen @load="handleIframeLoad" ></iframe> </div> </template> <script> export default { name: 'IframeComponent', props: { path: { // 本地路由路径,例如 '/dashboard' type: String, required: true }, query: { // 递参数,例如 { id: 123 } type: Object, default: () => ({}) }, width: { type: String, default: '100%' }, height: { type: String, default: '500px' } }, computed: { localUrl() { // 拼接完整URL,例如 http://localhost:8080/dashboard?id=123 return `${window.location.origin}${this.path}?${new URLSearchParams(this.query)}`; } }, methods: { handleIframeLoad() { this.$emit('loaded'); // 可扩展加载状态管理 } } }; </script> <style scoped> /* 保持引用[1]的响应式宽高比 */ .iframe-container { position: relative; width: 100%; padding-bottom: 56.25%; height: 0; } .iframe-container iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } </style> ``` 2. **在父页面中调用** 假设要嵌入本系统的`/report`页面并递参数: ```vue <template> <div> <iframe-component path="/report" :query="{ reportId: 2023 }" /> </div> </template> <script> import IframeComponent from '@/components/IframeComponent.vue'; export default { components: { IframeComponent } }; </script> ``` #### 二、通信实现:父子页面数据交互 1. **父页面向子页面** 使用`postMessage` API(引用[3]): ```javascript // 父页面中 const iframe = document.querySelector('iframe'); iframe.contentWindow.postMessage( { type: 'UPDATE_DATA', payload: { data: 'value' } }, window.location.origin // 限定同源 ); ``` 2. **子页面接收消息** 在子页面的Vue组件中监听: ```javascript mounted() { window.addEventListener('message', (event) => { if (event.origin !== window.location.origin) return; // 安全校验 if (event.data.type === 'UPDATE_DATA') { this.handleData(event.data.payload); } }); } ``` #### 三、优化与注意事项 1. **路由匹配与配置** - 确保目标页面在Vue Router中正确配置: ```javascript const routes = [ { path: '/report', component: ReportPage } ]; ``` - 若使用history模式,需配置服务器(如Nginx)避免刷新404: ``` location / { try_files $uri $uri/ /index.html; } ``` 2. **安全性增强** 添加`sandbox`属性限制iframe权限: ```vue <iframe sandbox="allow-scripts allow-same-origin" :src="localUrl" ></iframe> ``` 3. **性能优化** - **懒加载**:仅在需要时加载iframe(如使用`v-if`控制渲染)。 - **加载状态**:通过`@load`事件添加加载动画: ```vue <template> <div v-if="isLoading">Loading...</div> <iframe-component @loaded="isLoading = false"/> </template> ``` #### 四、替代方案对比 | 方案 | 适用场景 | 优缺点 | |------|---------|--------| | iframe | 独立功能模块、第三方嵌入 | 隔离样式/作用,但通信复杂 | | 动态组件(`<component :is="">`) | 同一项目组件复用 | 直接共享Vue状态,但耦合度高 | | 微前端(qiankun) | 大型系统模块化 | 完整隔离,但架构复杂 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值