uni-app 中一个vue页面存在多个web-view时 获取、入参等异常
uni-app 中一个vue页面存在多个web-view时 获取、入参等异常
操作步骤:
- 一个vue 中循环webview即可复现
预期结果:
- 多个web-view循环时,id不一样
- :webview-styles=“webviewStyles(index)” 当延迟加载时【即:loading 变更为true】,则index 为当前;并且创建的webView 宽高按照当前执行;
- 接收消息@message 回调时,能否在EventHandler中添加属性 标识那个web-view 即id;
实际结果:
- 多个web-view循环时,通过console.log( this.$scope.$getAppWebview().children() ) 查看发现所有的id都一样【致命bug 导致我无法删除对应Webview】
- 多个web-view循环时,@message=“receiveMessage($event,index)”, 此时 index永远都时0;
- :webview-styles=“webviewStyles(index)” 当延迟加载时【即:loading 变更为true】,则index 同上;并且创建的webView 宽高按照上一个执行;
- 接收消息@message 回调时,我无法知道是哪个webView 进行回调的。
bug描述:
问题:
- 多个web-view循环时,通过console.log( this.$scope.$getAppWebview().children() ) 查看发现所有的id都一样【致命bug 导致我无法删除对应Webview】
- 多个web-view循环时,@message=“receiveMessage($event,index)”, 此时 index永远都时0;
- :webview-styles=“webviewStyles(index)” 当延迟加载时【即:loading 变更为true】,则index 同上;并且创建的webView 宽高按照上一个执行;
- 接收消息@message 回调时,能否在EventHandler中添加属性 标识那个web-view 即id;
使用场景:
我们需要对接第三方的界面,我们通过接口获取到:首页、购物车、我的等界面,我们只能通过webView 打开相应的界面,他们通过uni.postMessage发送消息获取定位、图片等信息。
附件
项目 | 信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | Windows 11 家庭中文版 23H2 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.29 |
手机系统 | Android |
手机系统版本号 | Android 14 |
手机厂商 | 小米 |
手机机型 | Redmi Note 13 5G 必现 |
页面类型 | vue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
1 回复
在uni-app中,当一个Vue页面包含多个<web-view>
组件时,管理和获取这些<web-view>
的内容、参数传递等确实会变得复杂。这是因为<web-view>
主要用于嵌入外部网页,而外部网页与宿主页面之间的通信需要通过特定的机制来实现。
以下是一个简单的代码示例,展示如何在uni-app中实现多个<web-view>
组件之间的通信和参数传递。需要注意的是,<web-view>
的通信主要依赖于postMessage
API。
Vue页面代码示例
<template>
<view>
<web-view ref="webview1" src="https://example1.com" @message="handleMessage1"></web-view>
<web-view ref="webview2" src="https://example2.com" @message="handleMessage2"></web-view>
<button @click="sendMessageToWebview1">Send Message to Webview 1</button>
<button @click="sendMessageToWebview2">Send Message to Webview 2</button>
</view>
</template>
<script>
export default {
methods: {
sendMessageToWebview1() {
this.$refs.webview1.evalJS(`window.postMessage({data: 'Hello from app to webview1'}, '*');`);
},
sendMessageToWebview2() {
this.$refs.webview2.evalJS(`window.postMessage({data: 'Hello from app to webview2'}, '*');`);
},
handleMessage1(event) {
console.log('Message from webview1:', event.detail.data);
},
handleMessage2(event) {
console.log('Message from webview2:', event.detail.data);
}
}
}
</script>
注意事项
- 通信机制:
<web-view>
组件通过window.postMessage
方法发送消息,宿主页面通过监听@message
事件接收消息。 - 安全性:在
postMessage
的第二个参数中,'*'
表示接受所有来源的消息。在实际应用中,应指定具体的来源以提高安全性。 - evalJS方法:
evalJS
方法用于在<web-view>
中执行JavaScript代码,这里用于发送消息。 - 跨域问题:如果嵌入的网页与uni-app不在同一个域下,需要确保目标网页允许跨域通信。
通过上述代码,你可以在uni-app中管理多个<web-view>
组件,并实现它们与宿主页面之间的通信。然而,对于更复杂的场景,如获取<web-view>
内部页面的DOM或状态,可能需要考虑其他方法,如使用自定义URL Scheme、Storage API或第三方库。不过,这些方法通常依赖于网页本身的支持和配合。