小程序开发实战案例五 | 小程序如何嵌入H5页面

在接入小程序过程中会遇到需要将 H5 页面集成到小程序中情况,今天我们就来聊一聊怎么把 H5 页面塞到小程序中。

本篇文章将会从下面这几个方面来介绍:

  • 小程序承载页面的前期准备
  • 小程序如何承载 H5
  • 小程序和 H5 页面如何通讯
  • 小程序和 H5 页面的相互跳转

小程序承载页面的前期准备

首先介绍下我们在用小程序承载页面之前需要做些什么。

第一步当然就是 先有一个 H5 地址 啦,支付宝这边对 H5 地址的要求如下:

  • 仅支持 https 开头的地址
  • 不支持 IP 地址及端口号
  • 不支持重定向页面

第二步就是要 将H5 页面地址配置到支付宝的白名单 里面,这一步必不可少的;如果不配置的话,后面在访问小程序的时候会遇到页面访问受限的报错,详见 👉[web-view页面访问受限]

具体步骤可以参考[配置 H5 域名],下面我简单写一下:

  • 登陆小程序详情界面 -> 找到 开发设置 -> H5 域名配置 -> 点击 添加

  • 按照上面的匹配规则提示进行操作
    • 1、下载校验文件
    • 2、把下载下来的校验文件放到 H5 地址域名的根目录下面
    • 3、在域名地址里输入 H5 地址
    • 4、点击图片中的 点击这里 进行校验
    • 5、校验通过之后就可以添加了

小程序如何承载 H5

前期准备完成后,我们就可以在小程序中去嵌入 H5 页面了,嵌入的步骤非常简单,需要用到的组件是 web-view ,在 web-view 组件的 src 属性中传入 H5 的页面地址,就可以在小程序里面访问 H5 页面了,代码示例如下:

<view class="page"><web-viewsrc="https://render.alipay.com/p/s/web-view/index"></web-view>
</view>

web-view 组件在使用过程中需要注意:

  • 每个小程序界面只能设置一个 web-view ,也就是只能设置一个 H5 页面
  • web-view 组件会自动铺满整个页面
  • 个人类型的小程序不支持使用这个组件

另外,如果有小伙伴没有完成前面配置 H5 域名步骤的话,也没有关系;在调试阶段,我们可以在小程序开发工具上选择忽略 web-view 域名合法性检查,这样就不会有报错的情况了。详细操作步骤参考👉[小程序如何忽略域名校验]

‼️ 划重点:每次 H5 域名配置完成之后,都需要重新上线一个版本,版本上线之后,新配置的才会生效。

小程序和 H5 页面如何通讯

小程序承载 H5 页面后只是第一步,我们在实现部分功能上更多会遇到的就是如何实现数据在小程序和 H5 页面之间进行传输,此时就要用到 onMessage 属性和 postMessag 方法了。

注意:小程序和 H5 数据传输是需要 H5 先发消息给小程序,小程序接收到消息后再发消息给 H5。

H5 端方法代码如下:

  • 需要注意在 H5 页面使用 my.postMessage 和 my.onMessage 方法时必须要引入 https://appx/web-view.min.js(此链接仅支持在支付宝客户端内访问)
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>webview与小程序通信</title></head><body><button onclick="send()">发送</button><button onclick="isminiapp()">判断是否在小程序内</button><button onclick="onmessage()">开始监听小程序发送的消息</button><button onclick="getminiappid()">我要调用小程序获取APPID的API</button><!-- h5 log 工具方便在小程序内查看h5的log--><script src="https://cdn.jsdelivr.net/npm/eruda"></script><script>eruda.init();</script><!--引入https://appx/web-view.min.js, 如该 H5 页面需要同时在非支付宝客户端内使用,为避免该请求404,可参考以下写法 --><script>if (navigator.userAgent.indexOf('AlipayClient') > -1) {document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');}</script><script>//发送消息function send() {my.postMessage({name: "h5发送测试web-view"});}//监听小程序发给H5页面的消息function onmessage() {my.onMessage = function (e) {console.log(e);}}//判断是否在小程序内function isminiapp() {my.getEnv(function (res) {console.log(res.miniprogram) // true  });}//H5内通过通信获取APPID(先给小程序发送消息,表示H5内需要APPID)function getminiappid() {my.postMessage({name: "getappid"});}</script></body></html>

小程序端接收方法:

<!-- .axml -->
<view><web-view id="web-view-1" src="..." onMessage="test"></web-view>
</view>
// 小程序页面对应的 page.js 声明 test 方法,
// 由于 page.axml 里的 web-view 组件设置了 onMessage="test",
// 当页面里执行完 my.postMessage 后,test 方法会被执行
Page({onLoad(e){this.webViewContext = my.createWebViewContext('web-view-1');    },test(e){my.alert({content:JSON.stringify(e.detail),});  this.webViewContext.postMessage({'sendToWebView': '1'});},
});

小程序和 H5 页面的相互跳转

了解完通讯之后,我们再来看看另外一个功能,即小程序和 H5 页面怎么相互跳转。

小程序和 H5 页面跳转分为两种情况,分别是:

  • 从 A 小程序的 a 页面( H5 承载页面)跳转到 A 小程序的 b 页面
  • 从 A 小程序的 a 页面( H5 承载页面)跳转到 B 小程序的 b 页面

同一个小程序页面跳转

这种情况跳转比较简单,只要在 H5 页面里面引入 https://appx/web-view.min.js 后,直接使用my.navigateTo 或者是 my.redirectTo 进行跳转就可以了。

代码如下:

<script type="text/javascript" src="https://appx/web-view.min.js"></script>
<!-- 如该 H5 页面需要同时在非支付宝客户端内使用,为避免该请求404,可参考以下写法 -->
<!-- 请尽量在 html 头部执行以下脚本 -->
<script>if (navigator.userAgent.indexOf('AliApp') > -1) {document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');}
</script>
<script>my.navigateTo({url: '../get-user-info/get-user-info'});
</script>

不同小程序页面跳转

不同小程序页面的跳转逻辑是这样的:H5 页面告诉 A 小程序说我要跳转 B 小程序啦,A 小程序接到指令后执行跳转到 B 小程序的命令。

代码如下:

H5 页面代码

<script type="text/javascript" src="https://appx/web-view.min.js"></script>
<!-- 如该 H5 页面需要同时在非支付宝客户端内使用,为避免该请求404,可参考以下写法 -->
<!-- 请尽量在 html 头部执行以下脚本 -->
<script>if (navigator.userAgent.indexOf('AliApp') > -1) {document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');}
</script>
<script>// 网页向小程序 postMessage 消息my.postMessage({name:"跳转B小程序"});// 接收来自小程序的消息。my.onMessage = function(e) {console.log(e); // {'sendToWebView': '1'}}// 判断是否运行在小程序环境里my.getEnv(function(res) {console.log(res.miniprogram) // true});my.startShare();
</script>

小程序代码:

<!-- .axml -->
<view class="page"><web-viewid="web-view-1"src="https://render.alipay.com/p/s/web-view/index"onMessage="test"></web-view>
</view>
// 小程序页面对应的 page.js 声明 test 方法,
// 由于 page.axml 里的 web-view 组件设置了 onMessage="test",
// 当页面里执行完 my.postMessage 后,test 方法会被执行
Page({onLoad(e) {this.webViewContext = my.createWebViewContext('web-view-1');},test(e) {my.navigateToMiniProgram({appId: 'B小程序的appid', path: 'pages/index/index?p=1&q=2',query: {a: 'foo',b: 'bar',},success: function (res) {console.log(res);},fail: function (err) {console.log(err);}});this.webViewContext.postMessage({ sendToWebView: '1' });},
});

其他问题分享

这边给写一下对接 web-view 过程中可能会遇到的一些问题:

  • [web-view如何调用H5支付]
  • [web-view的title怎么设置]
  • [web-view页面可以使用自定义组件吗]
  • [web-view承载的H5缓存与小程序缓存如何操作]
  • [web-view组件支持刷新当前页面吗]
  • [已设置web-view的H5域名,但是访问H5仍出现页面访问受限]

希望对大家接入有所帮助~

以上就是关于「小程序如何嵌入 H5 页面」的所有内容了,是不是这么一看还挺简单的,一起来试试吧,有问题欢迎在评论区沟通交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/241142.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu重启后进入initramfs导致无法开机

今晚&#xff0c;我的电脑意外关机&#xff0c;重新开机后打开了虚拟机后出现initramfs&#xff0c;一直无法开机。该虚拟机使用的是 vm17,系统是ubuntu20, 解决方案 使用如下命令查看和识别磁盘、分区或文件系统的信息 在initramfs后面输入 fsck /dev/sdb4 ,即修复上面损坏的…

WINCC读写EXCEL-VBS

原创 RENHQ WINCC 关于VBS操作EXCEL的文档不管在论坛上还是在网上&#xff0c;相关的脚本已经很多&#xff0c;但是依然有很多人在问这个问题&#xff0c;于是把我以前在论坛上发的一个集合帖子的脚本拿来&#xff0c;重新开个帖子&#xff0c;如果再有人问的话&#xff0c;可…

kali下-MSF-ftp_login模块破解FTP账号及密码

一、环境准备 两台设备在同一个网络内 一台kali系统&#xff1a;192.168.10.128 一台winserver2016&#xff1a;192.168.10.132 二、MSF介绍 metasploit 全称是The Metasploit Framework&#xff0c;又称MSF&#xff0c;是Kali 内置的一款渗透测试框架&#xff0c;也是全球…

MySQL中锁的概述

按照锁的粒度来分可分为&#xff1a;全局锁&#xff08;锁住当前数据库的所有数据表&#xff09;&#xff0c;表级锁&#xff08;锁住对应的数据表&#xff09;&#xff0c;行级锁&#xff08;每次锁住对应的行数据&#xff09; 加全局锁&#xff1a;flush tables with read lo…

基于springboot+vue的图书个性化推荐系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

线程同步--生产者消费者模型

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件变量的使用必须依赖于互斥锁以确保线…

数据结构之栈的基本操作

该顺序栈涉及到了存储整型数据的顺序栈还有存储字符型数据的顺序栈 实现的功能有&#xff1a;入栈、出栈、判断是否为空栈、求栈的长度、清空栈、销毁栈、得到栈顶元素 此外根据上述功能&#xff0c;编写了数值转换&#xff08;十进制转化八进制&#xff09;方法、括号匹配方法…

服务器变矿机,该如何应对?

开始 恶意的挖矿程序会导致服务器cpu的异常占用&#xff0c;很让人讨厌。起初&#xff0c;我只是使用top命令显示出占用cpu不正常的进程&#xff0c;发现其中一个进程占用了百分之九十九点几&#xff0c;然后通过kill -9 <PID>命令干掉它。但总是过不了几天&#xff0c;…

深度学习:探索人工智能的前沿

1. 引言 1.1 人工智能的演进 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机能够执行通常需要人类智能的任务的领域。从早期的符号推理到现代的深度学习&#xff0c;人工智能经历了漫长的发展过程。 20世纪50年代&#xff…

MySQL 基于创建时间进行RANGE分区

MySQL是一款广泛使用的关系型数据库。在MySQL中&#xff0c;大量数据场景提高查询效率是非常关键的&#xff0c;所以&#xff0c;对数据表进行分区是一个很好的选择。 在创建分区表之前&#xff0c;需要了解一下MySQL分区的基本概念。MySQL分区可以将一个大表分成多个小表&…

K8s 网关选型血泪史

Sealos 公有云几乎打爆了市面上所有主流的开源网关&#xff0c;本文可以给大家很好的避坑&#xff0c;在网关选型方面做一些参考。 Sealos Cloud 的复杂场景 Sealos 公有云上线以来&#xff0c;用户呈爆发式增长&#xff0c;目前总共注册用户 8.7w&#xff0c;每个用户都去创…

FFmpeg之AVFormat

文章目录 一、概述二、解封装流程三、重要结构体3.1、AVFormatContext3.2、AVInputFormat3.3、AVOutputFormat3.4、AVStream 四、重要函数分析4.1、avformat_alloc_context4.2、avformat_open_input4.2.1、init_input4.2.2、av_probe_input_format2 4.3、avformat_find_stream_…

Flutter开发之蓝牙链接传输数据

本文使用的是flutter_blue_plus插件来实现链接蓝牙之后&#xff0c;和设备直接实现数据互相传输的功能。 1、配置蓝牙权限 iOS权限设置<key>NSBluetoothAlwaysUsageDescription</key><string>App需要您的同意,才能访问蓝牙,进行设备连接,数据通讯服务</…

LeetCode 热题 100 | 双指针(上)

目录 1 283. 移动零 2 11. 盛最多水的容器 3 15. 三数之和 菜鸟做题第一周&#xff0c;语言是 C 1 283. 移动零 解题思路&#xff1a; 两个指针一前一后遍历数组前者永远指向 0&#xff0c;后者永远在寻找非 0 数的路上后者找到一个非 0 数就和前者进行一个数值交换 …

Qt应用开发(安卓篇)——Hello Qt On Android

一、前言 这一篇从实际出发&#xff0c;讲述如何创建、编译和部署Qt On Android项目。 二、ADB调试 ADB的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用&#xff0c;主要用于连接计算机与Android 设备&#xff0c;以便进行调试和数据传输。ADB 可以实现以下主要…

分享一个美美的html模板

在这个万物vue的年代&#xff0c;网页设计越来越框架化。 上网搜个资料学习学习吧&#xff0c;咵咵咵&#xff0c;“游泳健身&#xff0c;vue了解一下” 我只是想简单地学个html&#xff0c;js啊&#xff01;怎么就这么复杂&#xff01; 曾几何时&#xff0c;在网上找个网页…

一文了解【完全合作关系】下的【多智能体强化学习】

处于完全合作关系的多智能体的利益一致&#xff0c;获得的奖励相同&#xff0c;有共同的目标。比如多个工业机器人协同装配汽车&#xff0c;他们的目标是相同的&#xff0c;都希望把汽车装好。 在多智能体系统中&#xff0c;一个智能体未必能观测到全局状态 S。设第 i 号智能体…

汽车芯片「新变量」

编者按&#xff1a;汽车行业的格局重构和技术革新&#xff0c;也在推动芯片赛道进入变革周期。不同商业模式的博弈&#xff0c;持续升温。 对于智能汽车来说&#xff0c;过去几年经历了多轮硬件和软件的性能迭代&#xff0c;甚至是革新&#xff0c;如今&#xff0c;市场正在进…

FPGA引脚物理电平(内部资源,Select IO)-认知2

引脚电平 The SelectIO pins can be configured to various I/O standards, both single-ended and differential. • Single-ended I/O standards (e.g., LVCMOS, LVTTL, HSTL, PCI, and SSTL) • Differential I/O standards (e.g., LVDS, Mini_LVDS, RSDS, PPDS, BLVDS, and…

网络信号避雷器综合行业应用方案

一、网络信号避雷器的概念和作用 网络信号避雷器&#xff08;信号浪涌保护器&#xff09;是一种专业用于保护网络、通讯、光缆、广播、电视、监控、视频等信号设备的雷电保护设备。它的功能是在雷电或其他电磁干扰产生的高压电涌进入信号线路时&#xff0c;将其迅速引导至地&a…