微信小程序webview通信

本文在uniapp 框架背景下生成,其他情况仅作参考

开始

直接照着文档来即可。

小程序页面:

scss 复制代码
message(e) {
    console.log(e.detail.data)
}
<web-view src="xxx" @message="message"></web-view>

h5页面:

css 复制代码
uni.postMessage({
    data: {
        action: 'message'
    }
});

实际上在h5页面postMessage 之后发现并没有触发小程序页面的message 事件,仔细看文档发现只有在特定的时机才会触发:后退组件销毁分享

可以在h5页面多次postMessage ,最终message 事件的参数会是个按顺序生成的数组。

H5页面

进行在小程序上不易处理的逻辑操作,本文的案例是根据DOM 生成图片,采用的是html2canvas 库。

完成之后或返回,或跳转其他页面,都需要调用小程序的API,这里通过weixin-webview-jssdk 实现。

通信

分享

通过页面的分享按钮触发,此时仍在当前页面,直接处理相关逻辑即可。

后退

这个后退 是指包含webview 标签的这个小程序页面的后退。那么这里需要一个中间页面,在onShow时判断是要跳转到该小程序页面,还是展示数据。此时整个流程就非常清晰了,具体的细节稍微画了一下流程图来展示。

如果是h5环境,则直接展示h5页面。

如果是微信环境,跳转到中间页面,在onLoad 中立即跳转到小程序页面。

小程序页面中由webview 标签嵌套h5页面,在h5页面中获取数据之后,自动执行小程序的返回操作,此时又会回到中间页面。 同时触发webview 标签的message事件,然后将数据发送给中间页面。具体的页面通信方式在下文作详细阐述。

返回到中间页面,检测到有数据存在,则不会自动跳转到小程序页面,而是展示数据。

如果直接在小程序页面返回(不是在h5中获取数据之后调用的返回),则回到中间页面时不会有数据,则再次执行返回,回到初始页。

销毁

这个销毁 是指包含webview 标签的销毁。那么仍然需要一个中间页面,在数据生成之后,通过页面间通信的方式来通知小程序页面销毁webview 标签,具体的细节稍微画了一下流程图来展示。

如果是h5环境,则直接展示h5页面。

如果是微信环境,跳转到小程序页面。维护一个控制webview标签展示的flag,默认为true。

sql 复制代码
<web-view v-if="flag" src="xxx" @message="message"></web-view>

此时展示h5页面,生成数据之后跳转到中间页,中间页通知小程序页面数据生成了(具体的页面通信方式在下文作详细阐述.),该把flag 置为false了,然后执行返回操作。

回到小程序页面,发现flag 为false且存在数据,则webview 组件销毁,触发message 事件,执行数据处理逻辑。

页面间通信

  1. 通过getCurrentPages 方法可以获取到页面栈,找到对应的页面实例,就可以修改其中的数据。

  2. uni.$emit + uni.$on 实现的页面间通信

    发送页面:

    bash 复制代码
    uni.$emit("fn", { payload: "anything" })

    接收页面:

    javascript 复制代码
    uni.$on("fn",(res) => {
        console.log(res)
    })

    记得取消监听

    javascript 复制代码
    onUnload() {
      uni.$off("fn")
    },
  3. 与上个方法类似,由微信提供的API。

    发送页面:

    kotlin 复制代码
    this.eventChannel = this.getOpenerEventChannel()
    this.eventChannel.emit('fn', { payload: "anything" });

    接收页面:

    css 复制代码
    uni.navigateTo({
        url: 'xxx',
        events: {
            fn: data => fn()
        }
    })
相关推荐
ssshooter11 分钟前
小程序分包页面报 "has not been registered yet" 的隐蔽根因:一个动态 import 拖垮整个分包
前端·javascript·微信小程序
鹏多多31 分钟前
Web浏览器后台离线通知方案实现以及兼容指南
前端·javascript·vue.js
yangmu320333 分钟前
Vue3 响应式系统深度解析:从 Proxy 到依赖追踪
前端·javascript·vue.js
还有多久拿退休金42 分钟前
AI 写了代码,谁替你"试毒"?
前端·架构·ai编程
大E帝国子民143 分钟前
OpenCloudOS Server 9 安装 Nginx 完整指南
前端·网络·nginx
少年白马醉春风丶1 小时前
【AI Agent面试题】Agent 的自主性分级,怎么理解?
前端
yingyima1 小时前
Docker Compose 紧急救援:凌晨3点服务器报警的解决方案
前端
石小石Orz2 小时前
星云SDK + 油猴:给LLM塑造肉身,陪伴你在每个网页
前端·人工智能
2601_963771372 小时前
10 Best PHP Media CMS and Scripts for Web Creators in 2026
开发语言·前端·php
VaJoy2 小时前
全面革新⚡️ Vue 3.6 项目工程的基础实现
前端·vue.js