uniapp解决app端不能用<web-view>将外部页面嵌入当前页面的问题

uniapp解决app端不能用将外部页面嵌入当前页面的问题

参考资料

android项目嵌套uniapp页面及交互 uniapp嵌套h5页面

代码(兼容h5与app)

父页面

<template>
	<view class="contract view-container">
		<view class="contract-box f-s-s">
			// #ifdef H5
			<scroll-view :scroll-y="true" class="scroll">
				<web-view src="XXX">
				</web-view>
			</scroll-view>
			// #endif
			// #ifdef APP-PLUS
			<Content :url="XXX"
				:paddingTop="57.65" :paddingBottom="16.75" :paddingLeft="16.75" :paddingRight="16.75"></Content>
			// #endif
		</view>
	</view>
</template>

<script setup lang="ts">
	import Content from './content.vue'
</script>

<style lang="scss" scoped>
	.contract {
     
     
		position: relative;
		height: 100vh;
		padding: 57.65rpx 16.75rpx 16.75rpx;

		&:before {
     
     
			position: absolute;
			left: 0;
			top: 0;
			content: '';
			width: 100%;
			height:
### UniApp 中实现与 `web-view` 组件的通信 在 UniApp 开发中,`web-view` 是用于加载外部网页的一个重要组件。为了实现在原生应用与嵌入网页之间进行数据交互,可以利用 `postMessage` 和 `message` 事件来完成双向通信。 #### 1. 应用向网页发送消息 通过调用 `uni.postMessage(OBJECT)` 方法,可以从宿主环境(即 UniApp页面)向嵌套的 `web-view` 页面传递数据[^2]。以下是具体实现方式: ```javascript // 宿主页面 JavaScript 部分 onLoad() { setTimeout(() => { uni.postMessage({ data: { message: '来自UniApp的消息' } }); }, 3000); // 延迟三秒发送消息以便观察效果 } ``` 此代码会在页面加载完成后延迟三秒钟向 `web-view` 加载的内容发送一条消息。 #### 2. 网页接收来自应用的消息 在被加载到 `web-view` 中的目标 HTML 文件里,可以通过监听 `window.addEventListener('message', callback)` 来捕获由 `uni.postMessage()` 发送的数据[^2]。下面是一个简单的例子展示如何处理接收到的信息: ```html <!-- index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Webview Page</title> <script type="text/javascript"> window.addEventListener('message', function(event) { console.log('Received from app:', event.data); alert(`从APP获取到信息:${JSON.stringify(event.data)}`); }); </script> </head> <body> <h1>Hello, Webview!</h1> </body> </html> ``` 当目标网页成功解析并运行这段脚本之后,它就能够响应任何来自于关联的应用程序所发出的通知了。 #### 3. 网页向应用发送消息 如果需要让网页主动通知其所在的容器,则可以在该网页内部执行如下操作[^2]: ```javascript parent.window.webkit.messageHandlers.uniPostMessage.postMessage({ key: value }); ``` 或者对于某些平台可能适用更通用的形式: ```javascript if (window.uni && typeof(window.uni.postMsg)==='function') { window.uni.postMsg({key:value}); } else if(typeof(parent!==undefined)){ parent.postMessage({key:value},'*'); } ``` 注意这里的逻辑是为了兼容不同浏览器的行为差异而设计出来的多重判断机制。 #### 4. 应用接收来自网页的消息 最后一步是在承载 `web-view` 的 Vue 组件定义处绑定好相应的处理器函数以捕捉这些反馈回来的结果[^1][^2]: ```vue <template> <view class="content"> <!-- 使用 @message 属性绑定自定义方法 receiveData --> <web-view :src="'/hybrid/html/index.html'" @message="receiveData"></web-view> </view> </template> <script> export default { methods:{ /** * 接收 webview 内部传来的参数 */ receiveData(e){ const received = e.detail.data; console.log('From WebView:',received); this.$toast(JSON.stringify(received)); } } }; </script> ``` 以上就是完整的基于 UniApp 平台下 `web-view` 双向通讯解决方案及其实际编码示范说明。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值