uniapp webview子页面向父页面发送数据和触发事件,重点在第3条!!!

1、众所周知H5中iframe可以用过postmessage进行,从H5子页面向H5父页面进行通信。方法如下:

// 子页面
window.parent.postMessage({ data: '你的消息' }, '*');


// 父页面
<iframe src="xxxxxxxxxxx"></iframe>
window.addEventListener('message', function(event) {
    console.log('收到父页面的消息:', event.data);
});

以上方法也适用在uniapp webview 子页面向父页面进行通信。
页面卸载是记得将事件removeEventListener


2、 在uniapp微信小程序webview中,H5子页面向微信小程序父页面进行通信。方法如下:

// 首先需要引入jssdk
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>


// 子页面
window.parent.postMessage({ data: '你的消息' }, '*');
// 但在以上特定时机才会触发组件的message事件:小程序后退、组件销毁、分享、复制链接
// 这时候可以通过上面jssdk注册的方法进行触发
// 注意:如果父页面是H5页面,并且注册了window.addEventListener('message')方法。
// 那么执行以下方法,该addEventListener方法还会再触发一次。
// 其他返回方法不会触发addEventListener!!!!!!!!
wx.miniProgram.navigateBack();


// 父页面
<web-view src="xxxxxxxxxxx" @message="onMessage"></web-view>
onMessage(e) {
	console.log('收到父页面的消息:', e);
}



3、在第2种情况下,有个特殊情况很坑!!!!!,因为注册的wx方法会冲突。

在uniapp微信小程序webview中,uniapp H5子页面向微信小程序父页面进行通信。

如果还是用第2种方法。wx.miniProgram将会是undefined,因为uniapp定义的wx将覆盖jssdk注册的wx方法。
这时通过再引入一个uni-webview.js文件得以解决,
下载链接:https://download.csdn.net/download/guoqu1919/88864022?utm_source=bbsseo
整体代码如下:

// 首先需要引入jssdk和js文件
// 注意:uni sdk放到body下面(也就是要在body标签尾部放入以下三个script标签代码,这个很重要!!!!!)
// 因为uni需要在uniapp自身uni定义之前定义,如果你放在body外部,uni还没赋值给uniWebView就被覆盖了。
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script src="uni-webview.js"></script>
<script>
	const uniWebView = uni;
</script>


// 子页面(其实与第2种逻辑相同,只不过换了方法)
uniWebView.webView.postMessage({data: {}})
uniWebView.webView.navigateBack();


// 父页面
<web-view src="xxxxxxxxxxx" @message="onMessage"></web-view>
onMessage(e) {
	console.log('收到父页面的消息:', e);
}

这个方法使用于H5子页面微信小程序webview父页面通信,也就是适用于第2种第3种情况。

### UniApp WebView 实现信息传递 #### HTML JavaScript 通信机制 在 UniApp 中,`<web-view>` 组件用于加载外部网页并允许与这些页面进行双向数据交换。为了实现这种交互,可以利用 `@message` 事件监听器来捕获来自 Web 页面的消息,并通过调用特定 API 向 Web 页面发送消息。 对于向 Web 页面发送数据的情况,可以在 H5 页面准备好之后触发 `UniAppJSBridgeReady` 事件,随后使用 `uni.postMessage()` 方法传送所需的数据到原生端[^5]: ```javascript document.addEventListener(&#39;UniAppJSBridgeReady&#39;, function () { uni.postMessage({ data: { name: "小明", age: "20" } }); }); ``` 当需要从 Web 页面接收到的信息时,则应在 Vue 组件内定义相应的处理函数作为 `@message` 的回调[^2]: ```html <template> <div class="content"> <!-- 加载指定 URL --> <web-view :src="url" @message="handleMessage"></web-view> </div> </template> <script> export default { methods: { handleMessage(event) { const message = event.detail.data; console.log(message); } }, }; </script> ``` 此外,如果希望在同一应用的不同实例间共享相同的内容但又能够区分它们的行为(比如一个用来展示而另一个负责接收消息),可以通过复制相同的 `<web-view>` 结构并在其中一个实例上附加 `@message` 处理逻辑的方式达成目的[^3]。 最后值得注意的是,在某些情况下可能还需要配置额外的参数以便更好地控制 WebView 行为或访问其内部状态。这可通过传递第三个参数至 `plus.webview.create()` 来完成,该参数是一个 JSON 对象形式的选项列表[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值