vue 通过iframe引入html资源,并传递参数

在vue开发中,有时我们需要在项目中嵌入第三方的html页面,我们可以使用iframe标签来实现。

Vue中嵌入Html有两种方式

(1)html作为一个单独的服务,iframe标签中src填入远程地址,这样做的好处是vue与iframe之间不需要通信,与后端的通信可以直接通过js发请求与后端进行交互。

<iframe src="http://127.0.0.1:8081/demo31.html"  width="100%" height="800px" scrolling="auto"></iframe>

(2)vue项目集成html页面,这样不需要其他服务,但是需要实现vue和html的通信。

<iframe src="static/grhx/IndividualPortrait.html" ref="iframe" scrolling="no" style="width:100%; height: 35vw"></iframe>

我在项目中实现的是第二种方式,html作为本地页面集成的。

实现步骤:

1.在public下的static引入html页面和js,css等资源

2.vue页面通过iframe标签嵌入html资源

3.vue向html传递数据

通过获取iframe对象,然后调用postMessage方法:

4.html页面接收数据

通过监听事件window.addEventListener实现

5.html向vue传递数据

// 向vue中发送数据
window.parent.postMessage({
  params: "你想传输的值",
  cmd: "iframeOne" /*当有多个iframe页面传值时,可以设计通过其中的字段获取对应的值*/
},'*');

6.vue接收数据

在mounted中加载监听事件,并配上处理监听对象的方法。

window.addEventListener("message", this.handleMessage);

在method中定义方法,用于处理监听的事件。

handleMessage(event) {
 	// 获取从iframe页面中传过来的值
 	var cmd = event.data.cmd;
 	var params = event.data.params;
 }

以上就完成了vue项目嵌入html的功能。

### Vue 中使用 iframe 嵌入 HTML 页面Vue 项目中嵌入 HTML 页面可以通过 `<iframe>` 标签实现。为了更好地管理和控制 iframe 的行为,可以利用 Vue 组件化的优势来封装 iframe。 #### 创建一个简单的 iframe 组件 创建一个新的组件 `IframeComponent.vue`: ```vue <template> <div class="iframe-container"> <iframe :src="url" frameborder="0"></iframe> </div> </template> <script> export default { props: ['url'], }; </script> <style scoped> .iframe-container { width: 100%; height: 600px; } iframe { width: 100%; height: 100%; } </style> ``` 这个组件接收一个 URL 属性将其设置为 iframe 的源地址[^1]。 #### 在父组件中使用 IframeComponent 假设有一个名为 `ParentComponent.vue` 的父组件,在其中引入注册 `IframeComponent`: ```vue <template> <div> <button @click="loadPage">加载页面</button> <IframeComponent v-if="showIframe" :url="pageUrl"/> </div> </template> <script> import IframeComponent from './components/IframeComponent'; export default { components: { IframeComponent }, data() { return { showIframe: false, pageUrl: '' }; }, methods: { loadPage() { this.pageUrl = 'https://example.com'; this.showIframe = true; } } }; </script> ``` 这里定义了一个按钮用于触发 iframe 加载指定的 URL 地址,通过条件渲染的方式显示/隐藏 iframe[^3]。 #### 跨域通信与交互 当涉及到跨域场景下父子页面之间的调用时,则需遵循浏览器的安全策略——同源政策(SOP),即只有协议、域名和端口都相同的情况下才允许直接访问对方的内容窗口对象(window);对于不同源的情况则可通过 postMessage API 实现安全的数据交换[^2]。 例如,在子页面内发送消息给父级 Vue 应用程序: ```javascript // 子页面中的 JavaScript 代码 window.parent.postMessage('来自 iFrame 的问候', '*'); ``` 而在父页面监听这些消息: ```javascript mounted() { window.addEventListener('message', function(event) { console.log(`收到的消息:${event.data}`); }); }, beforeDestroy() { window.removeEventListener('message', /* ... */); } ``` 这样就可以实现在不同的上下文中互相传递数据而不违反安全性原则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值