首页 > 其他分享 >不同源H5页面消息通信(web-view 内的H5向父级页面发消息并回传结果给子页面)

不同源H5页面消息通信(web-view 内的H5向父级页面发消息并回传结果给子页面)

时间:2024-12-02 14:30:13浏览次数:7  
标签:const 父级 H5 result wx 发消息 页面

文章目录

应用场景是两个 H5不同源 的情况下实现消息互通。

本示例使用 uniapp 开发H5,父级H5 通过 <web-view> 组件加载 子H5 页面;子H5 页面向 父级H5 发送消息调起 父级H5 页面的微信扫一扫功能,再将扫一扫结果回传给 子H5页面。

  • 父级H5链接:https://www.A.com
  • 子级H5链接:https://www.B.com

父级 H5 页面

  • index.vue
<template>
	<web-view allow="geolocation; microphone; camera; midi; encrypted-media;display-capture;" :src="url"></web-view>
</template>

<script src="./index.js"></script>

<style lang="scss" scoped>
	@import './index.scss';
</style>
  • index.js
import wx from "weixin-js-sdk";
// 请求后台接口
import { getJsapiConfig } '@/apis/wechatApi';

export default {
    data() {
        return {
            url: ''
        }
    },
	async onl oad() {
		const _this = this
		
		// 初始化微信Jsapi配置
		const url = window.location.href.split("#")[0]
        const {code, data: wxConfig} = await getJsapiConfig({url})
        if (code === 200) {
            await _this.initWxConfig(wxConfig);
        }
		
		// 监听消息(监听子H5页面发送过来的消息)
		window.addEventListener('message', async (event) => {
		    const {origin, data, source} = event
		    console.log('子页面消息:', origin, data, source)
			if (window === source) {
		        // 跳过第一次的初始化触发的情况
		        return
		    }
			// 过虑非子页面源的消息
		    if (origin !== 'https://www.B.com') {
		        return
		    }
			// 获取子页面自定义 cmd
		    const {cmd} = data
		    if (cmd !== 'wx.scanQRCode') {
		        return
		    }
		    const result = await _this.wxScanCode()
		    // 将扫一扫结果,发送回子页面
		    const response = {cmd: "wx.scanQRCodeResult", result}
		    await source.postMessage(response, origin);
		}, false);

		// 子 H5 页面链接地址
		this.url = 'https://www.B.com'
	},
	methods: {
		// 初始化微信配置
		initWxConfig(config) {
	        const {appId, timestamp, nonceStr, signature} = config
	        wx.config({
	            debug: false,
	            appId: appId,
	            timestamp: Number(timestamp),
	            nonceStr: nonceStr,
	            signature: signature,
	            jsApiList: ['scanQRCode']
	        })
	    },
		// H5调起微信扫一扫功能
		wxScanCode() {
	        return new Promise((resolve, reject) => {
	            wx.ready(() => {
	                wx.scanQRCode({
	                    needResult: 1,
	                    scanType: ["qrCode", "barCode"],
	                    success: async function (res) {
	                        const result = res.resultStr;
	                        resolve(result)
	                    },
	                    error: function (res) {
	                        reject(res)
	                    }
	                })
	            })
	            wx.error((res) => {
	                reject(res)
	            })
	        })
	    }
	}
}

子级 H5 页面

  • index.vue
<template>
	<view>{{ result }}</view>
	<button @click="handleClick"></button>
</template>

<script src="./index.js"></script>

<style lang="scss" scoped>
	@import './index.scss';
</style>
  • index.js
export default {
	data() {
        return {
			result: null
		}
	},
	async mounted() {
        const _this = this
		// 监听消息(监听父级H5页面传回来的消息)
		window.addEventListener('message', async (event) => {
            const {origin, data, source} = event
			if (window === source) {
                return
            }
			// 过虑非父级页面源的消息
            if (origin !== 'https://www.A.com') {
                return
            }
            const {cmd, result} = data
            if (cmd === 'wx.scanQRCodeResult') {
                _this.result = result
            }
        }, false);
	},
	methods: {
		handleClick() {
			// 向父级页面发消息
			window.parent.postMessage({cmd: 'wx.scanQRCode', data: {}}, 'https://www.A.com')
		}
	}
}

标签:const,父级,H5,result,wx,发消息,页面
From: https://blog.csdn.net/weixin_42607526/article/details/144187067

相关文章

  • H5-14 H5新增标签
    1、扩展知识:div容器元素,也是页面中见到的最多的元素div实现  <divid="header"></div>头部  <divid="nav"></div>导航  <divid="article">文章    <divid="section"></div>子文章  </div&......
  • 【HarmonyOS开发】华为商城应用页面实验示例解析(ArkTS实战解析)
    一.实验背景本次项目为华为云鸿蒙应用入门级开发者认证的实验项目,借此来巩固对ArkTS的学习。实验源地址开发者云实验_云实验KooLabs_在线实验_上云实践_云计算实验_AI实验_华为云官方实验平台-华为云 实验目标本实验一共需要完成以下三个部分的任务:本实验将模拟制作......
  • CH585_IAP升级步骤
    1、打开名为:McuProgramIAPTool.exe的工具,工具界面如图:注:仅下载界面有效2、给接收器升级时,不需要保证2.4G处于连接状态,只要接收器插在PC上即可完成升级3、选择接口:mi_034、点击搜索按钮,如果插入了2.4G接收器,会枚举到对应设备,返回已连接信息5、选择要升级的目标文件 6、......
  • H5-13 块元素与行内元素(内联元素)
    1、块元素与行内元素(内联元素)HTML5出现之前,经常把元素按照块级元素和内联元素来区分。在HTML5中,元素不再按照这种方式来区分,而是按照内容模式来区分,分为元数据型(metadatacontent)、区块型(sectioningcontent)、标题型(headingcontent)。元素不属于任何一个类别,被称为穿透的、......
  • CH592_IAP升级步骤
    1、打开名为:McuProgramIAPTool.exe的工具,工具界面如图:注:仅下载界面有效2、确保当前2.4G接收器插在电脑上,并保证2.4G处于连接状态,这样才能让接收器把PC下传的升级固件数据透传给模块端3、选择接口:mi_034、点击搜索按钮,如果插入了2.4G接收器,会枚举到对应设备,返回已连接信息......
  • 如何在页面上显示Emoji表情?
    在前端页面上显示Emoji表情有很多方法,以下是几种常见且可靠的方式:直接使用Unicode字符:Emoji本质上是Unicode字符,可以直接在HTML中使用。这是最简单的方法,也最兼容各种浏览器。<p>我喜欢这个表情:......
  • 页面上的登录表单记住了密码(显示星号),但我又忘了密码,如何找回这个密码呢?
    很遗憾,直接从前端获取被遮蔽的密码是不可能的。浏览器出于安全考虑,会将密码以星号或圆点显示,并且不会将其真实值存储在容易访问的HTML属性中。即使使用JavaScript,你也无法直接读取用户输入的密码。试图绕过这个安全限制是不道德的,并且在大多数情况下也是非法的。如果你需要找回......
  • js如何检测当前页面是否以全屏模式显示?
    你可以使用JavaScript检测页面是否处于全屏模式,主要通过检查document.fullscreenElement(标准API)或特定厂商前缀的属性。以下是一个兼容多种浏览器的函数:functionisFullscreen(){return!!(document.fullscreenElement||//标准APIdocument.webkitFull......
  • 移动端如何设置页面以全屏模式运行?
    移动端设置页面以全屏模式运行,主要依靠浏览器提供的API和一些CSS技巧。以下是一些常见的方法:1.使用FullscreenAPI:这是推荐的方法,因为它提供了更标准化和灵活的控制。请求全屏:使用requestFullscreen()方法。这个方法可以在不同的元素上调用,例如document.document......
  • iOS下页面如何启动加载时显示画面图片?如何设置大小?它有什么好处?
    在iOS下,启动加载时显示的画面图片叫做LaunchScreen。它在App完全启动并显示第一个页面之前出现,给用户一种App快速响应的感受,并提供品牌展示的机会。以下是设置LaunchScreen的几种方法以及如何控制大小:1.使用LaunchScreenStoryboard(推荐)这是Apple推荐的方式......