小程序开发实战案例五 | 小程序如何嵌入H5页面
<div class="lake-content"><p id="u2b80494c" class="ne-p"><span class="ne-text">在接入小程序过程中会遇到需要将 H5 页面集成到小程序中情况,今天我们就来聊一聊怎么把 H5 页面塞到小程序中。</span></p>
<p id="u1f06c868" class="ne-p"><img width="142" id="u806322f6" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2024/png/136731/1705628668459-b6889219-80c6-4cce-b385-b93cea5f4a79.png"></p>
<p id="u2784d11b" class="ne-p"> </p>
<p id="u3cab4bec" class="ne-p"><span class="ne-text">本篇文章将会从下面这几个方面来介绍:</span></p>
<ul class="ne-ul">
<li id="ue78c53b7" data-lake-index-type="0"><span class="ne-text">小程序承载页面的前期准备</span></li>
<li id="ud0d7114a" data-lake-index-type="0"><span class="ne-text">小程序如何承载 H5</span></li>
<li id="u569f65bf" data-lake-index-type="0"><span class="ne-text">小程序和 H5 页面如何通讯</span></li>
<li id="u95b1745a" data-lake-index-type="0"><span class="ne-text">小程序和 H5 页面的相互跳转</span></li>
</ul>
<p id="u46a49cbf" class="ne-p"> </p>
<h2 id="plmoy"><span class="ne-text">小程序承载页面的前期准备</span></h2>
<p id="ud7b4ad70" class="ne-p"><span class="ne-text">首先介绍下我们在用小程序承载页面之前需要做些什么。</span></p>
<p id="u0b9a3d66" class="ne-p"><span class="ne-text">第一步当然就是 <strong>先有一个 H5 地址 </strong><span class="ne-text">啦,支付宝这边对 H5 地址的要求如下:</span></span></p>
<ul class="ne-ul">
<li id="u6a55d03f" data-lake-index-type="0"><span class="ne-text">仅支持 https 开头的地址</span></li>
<li id="u764f415a" data-lake-index-type="0"><span class="ne-text">不支持 IP 地址及端口号</span></li>
<li id="u53913f4e" data-lake-index-type="0"><span class="ne-text">不支持重定向页面</span></li>
</ul>
<p id="ua9789ec5" class="ne-p"> </p>
<p id="u36a467df" class="ne-p"><span class="ne-text">第二步就是要 <strong>将H5 页面地址配置到支付宝的白名单 </strong><span class="ne-text">里面,这一步必不可少的;如果不配置的话,后面在访问小程序的时候会遇到页面访问受限的报错,详见 <span class="ne-text">👉<span class="ne-text">[<span class="ne-text">web-view页面访问受限</span><span class="ne-text">]</span></span></span></span></span></p>
<p id="uc518e83e" class="ne-p"> </p>
<p id="u306e449a" class="ne-p"><span class="ne-text">具体步骤可以参考[<span class="ne-text">配置 H5 域名</span><span class="ne-text">],下面我简单写一下:</span></span></p>
<ul class="ne-ul">
<li id="u6b55fa60" data-lake-index-type="0"><span class="ne-text">登陆小程序详情界面 -> 找到 <strong>开发设置 -</strong><span class="ne-text">> H5 域名配置 -> 点击 <strong>添加</strong></span></span></li>
</ul>
<p id="u0f65ecf7" class="ne-p"> </p>
<p id="ue4860434" class="ne-p"><img width="1366" id="uf4ffe544" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2024/png/136731/1705565178183-aff1167c-e343-43f0-8c20-1f5fa09cff72.png"></p>
<p id="u8a40c1a7" class="ne-p"> </p>
<ul class="ne-ul">
<li id="uc3d68705" data-lake-index-type="0"><span class="ne-text">按照上面的匹配规则提示进行操作</span></li>
</ul>
<ul class="ne-list-wrap">
<ul class="ne-ul">
<li id="u22265903" data-lake-index-type="0"><span class="ne-text">1、下载校验文件</span></li>
<li id="ua3dd602a" data-lake-index-type="0"><span class="ne-text">2、把下载下来的校验文件放到 H5 地址域名的根目录下面</span></li>
<li id="uef04494e" data-lake-index-type="0"><span class="ne-text">3、在域名地址里输入 H5 地址</span></li>
<li id="u30cea676" data-lake-index-type="0"><span class="ne-text">4、点击图片中的 <strong>点击这里 </strong><span class="ne-text">进行校验</span></span></li>
<li id="uc82bb8cd" data-lake-index-type="0"><span class="ne-text">5、校验通过之后就可以添加了</span></li>
</ul>
</ul>
<p id="ue280eb96" class="ne-p"> </p>
<p id="u1a31138f" class="ne-p"><img width="500" id="u1e080f7a" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2024/png/136731/1705565393750-ecda902a-8c71-4b19-a88a-f0f45a1b56e7.png"></p>
<p id="u6e8947b8" class="ne-p"> </p>
<p id="udd186c0c" class="ne-p"> </p>
<h2 id="NgQaT"><span class="ne-text">小程序如何承载 H5</span></h2>
<p id="u35ae809f" class="ne-p"><span class="ne-text">前期准备完成后,我们就可以在小程序中去嵌入 H5 页面了,嵌入的步骤非常简单,需要用到的组件是 web-view ,在 web-view 组件的 src 属性中传入 H5 的页面地址,就可以在小程序里面访问 H5 页面了,代码示例如下:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="page"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">web-view
</span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="https://render.alipay.com/p/s/web-view/index"</span>
<span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">web-view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p id="u759bf84b" class="ne-p"><span class="ne-text">web-view 组件在使用过程中需要注意:</span></p>
<ul class="ne-ul">
<li id="u1a6d4e47" data-lake-index-type="0"><span class="ne-text">每个小程序界面只能设置一个 web-view ,也就是只能设置一个 H5 页面</span></li>
<li id="u1cb12944" data-lake-index-type="0"><span class="ne-text">web-view 组件会自动铺满整个页面</span></li>
<li id="uf30bf03c" data-lake-index-type="0"><span class="ne-text">个人类型的小程序不支持使用这个组件</span></li>
</ul>
<p id="uf310bfdf" class="ne-p"> </p>
<p id="ua2ba9e15" class="ne-p"><span class="ne-text">另外,如果有小伙伴没有完成前面配置 H5 域名步骤的话,也没有关系;在调试阶段,我们可以在小程序开发工具上选择忽略 web-view 域名合法性检查,这样就不会有报错的情况了。详细操作步骤参考<span class="ne-text">👉<span class="ne-text">[<span class="ne-text">小程序如何忽略域名校验</span><span class="ne-text">]</span></span></span></span></p>
<p id="u2fdd40f4" class="ne-p"> </p>
<p id="u2d20a98a" class="ne-p"><strong>‼️</strong><strong> 划重点:每次 H5 域名配置完成之后,都需要重新上线一个版本,版本上线之后,新配置的才会生效。</strong></p>
<p class="ne-p"> </p>
<h2 id="lleqb"><span class="ne-text">小程序和 H5 页面如何通讯</span></h2>
<p id="u1794c073" class="ne-p"><span class="ne-text">小程序承载 H5 页面后只是第一步,我们在实现部分功能上更多会遇到的就是如何实现数据在小程序和 H5 页面之间进行传输,此时就要用到 onMessage 属性和 postMessag 方法了。</span></p>
<p id="u0136b590" class="ne-p"><strong><span class="ne-text">注意:</span></strong><span class="ne-text">小程序和 H5 数据传输是需要 H5 先发消息给小程序,小程序接收到消息后再发消息给 H5。</span></p>
<p id="u70d72277" class="ne-p"><span class="ne-text">H5 端方法代码如下:</span></p>
<ul class="ne-ul">
<li id="uc1030aef" data-lake-index-type="0"><span class="ne-text">需要注意在 H5 页面使用 my.postMessage 和 my.onMessage 方法时必须要引入 https://appx/web-view.min.js(此链接仅支持在支付宝客户端内访问)</span></li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><!</span><span style="color: rgba(255, 0, 255, 1)">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">html </span><span style="color: rgba(255, 0, 0, 1)">lang</span><span style="color: rgba(0, 0, 255, 1)">="en"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">charset</span><span style="color: rgba(0, 0, 255, 1)">="UTF-8"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span>webview与小程序通信<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">onclick</span><span style="color: rgba(0, 0, 255, 1)">="send()"</span><span style="color: rgba(0, 0, 255, 1)">></span>发送<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">onclick</span><span style="color: rgba(0, 0, 255, 1)">="isminiapp()"</span><span style="color: rgba(0, 0, 255, 1)">></span>判断是否在小程序内<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">onclick</span><span style="color: rgba(0, 0, 255, 1)">="onmessage()"</span><span style="color: rgba(0, 0, 255, 1)">></span>开始监听小程序发送的消息<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">onclick</span><span style="color: rgba(0, 0, 255, 1)">="getminiappid()"</span><span style="color: rgba(0, 0, 255, 1)">></span>我要调用小程序获取APPID的API<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> h5 log 工具方便在小程序内查看h5的log</span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="https://cdn.jsdelivr.net/npm/eruda"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
eruda.init();
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)">引入https://appx/web-view.min.js, 如该 H5 页面需要同时在非支付宝客户端内使用,为避免该请求404,可参考以下写法 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">if</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> (navigator.userAgent.indexOf(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">AlipayClient</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">) </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">></span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">-</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">1</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">) {
document.writeln(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"><script src="https://appx/web-view.min.js"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"><</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">/</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">script></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">发送消息</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> send() {
my.postMessage({
name: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">h5发送测试web-view</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
});
}
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">监听小程序发给H5页面的消息</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> onmessage() {
my.onMessage </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> (e) {
console.log(e);
}
}
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">判断是否在小程序内</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> isminiapp() {
my.getEnv(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> (res) {
console.log(res.miniprogram) </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> true</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> });
}
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">H5内通过通信获取APPID(先给小程序发送消息,表示H5内需要APPID)</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> getminiappid() {
my.postMessage({
name: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">getappid</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
});
}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p id="uce550f1d" class="ne-p"> </p>
<p id="u4b642f50" class="ne-p"><span class="ne-text">小程序端接收方法:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> .axml </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">web-view </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="web-view-1"</span><span style="color: rgba(255, 0, 0, 1)"> src</span><span style="color: rgba(0, 0, 255, 1)">="..."</span><span style="color: rgba(255, 0, 0, 1)"> onMessage</span><span style="color: rgba(0, 0, 255, 1)">="test"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">web-view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 小程序页面对应的 page.js 声明 test 方法,</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 由于 page.axml 里的 web-view 组件设置了 onMessage="test",</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 当页面里执行完 my.postMessage 后,test 方法会被执行</span>
<span style="color: rgba(0, 0, 0, 1)">Page({
onLoad(e){
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.webViewContext = my.createWebViewContext('web-view-1'<span style="color: rgba(0, 0, 0, 1)">);
},
test(e){
my.alert({
content:JSON.stringify(e.detail),
});
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.webViewContext.postMessage({'sendToWebView': '1'<span style="color: rgba(0, 0, 0, 1)">});
},
});</span></pre>
</div>
<p> </p>
<p id="u6aca92c4" class="ne-p"> </p>
<h2 id="uxIox"><span class="ne-text">小程序和 H5 页面的相互跳转</span></h2>
<p id="u1869b8d6" class="ne-p"><span class="ne-text">了解完通讯之后,我们再来看看另外一个功能,即小程序和 H5 页面怎么相互跳转。</span></p>
<p id="u54fea199" class="ne-p"><span class="ne-text">小程序和 H5 页面跳转分为两种情况,分别是:</span></p>
<ul class="ne-ul">
<li id="u61b36808" data-lake-index-type="0"><span class="ne-text">从 A 小程序的 a 页面( H5 承载页面)跳转到 A 小程序的 b 页面</span></li>
<li id="udad75d53" data-lake-index-type="0"><span class="ne-text">从 A 小程序的 a 页面( H5 承载页面)跳转到 B 小程序的 b 页面</span></li>
</ul>
<p id="u2e6df987" class="ne-p"> </p>
<h3 id="CQwjs"><span class="ne-text">同一个小程序页面跳转</span></h3>
<p id="ua67aa7e6" class="ne-p"><span class="ne-text">这种情况跳转比较简单,只要在 H5 页面里面引入 https://appx/web-view.min.js 后,直接使用my.navigateTo 或者是 my.redirectTo 进行跳转就可以了。</span></p>
<p id="ua30cdeac" class="ne-p"><span class="ne-text">代码如下:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text/javascript"</span><span style="color: rgba(255, 0, 0, 1)"> src</span><span style="color: rgba(0, 0, 255, 1)">="https://appx/web-view.min.js"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 如该 H5 页面需要同时在非支付宝客户端内使用,为避免该请求404,可参考以下写法 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 请尽量在 html 头部执行以下脚本 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">if</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> (navigator.userAgent.indexOf(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">AliApp</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">) </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">></span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">-</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">1</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">) {
document.writeln(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"><script src="https://appx/web-view.min.js"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"><</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">/</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">script></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
my.navigateTo({url: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">../get-user-info/get-user-info</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<h3 id="GzIQk"><span class="ne-text">不同小程序页面跳转</span></h3>
<p id="u575fd693" class="ne-p"><span class="ne-text">不同小程序页面的跳转逻辑是这样的:H5 页面告诉 A 小程序说我要跳转 B 小程序啦,A 小程序接到指令后执行跳转到 B 小程序的命令。</span></p>
<p id="u0a04f03b" class="ne-p"><span class="ne-text">代码如下:</span></p>
<p id="u0f524da2" class="ne-p"><span class="ne-text">H5 页面代码</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text/javascript"</span><span style="color: rgba(255, 0, 0, 1)"> src</span><span style="color: rgba(0, 0, 255, 1)">="https://appx/web-view.min.js"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 如该 H5 页面需要同时在非支付宝客户端内使用,为避免该请求404,可参考以下写法 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 请尽量在 html 头部执行以下脚本 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">if</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> (navigator.userAgent.indexOf(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">AliApp</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">) </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">></span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">-</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">1</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">) {
document.writeln(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"><script src="https://appx/web-view.min.js"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"><</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">/</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">script></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> 网页向小程序 postMessage 消息</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">my.postMessage({name:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">跳转B小程序</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">"</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">});
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> 接收来自小程序的消息。</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">my.onMessage </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">(e) {
console.log(e); </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> {'sendToWebView': '1'}</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> 判断是否运行在小程序环境里</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">my.getEnv(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">(res) {
console.log(res.miniprogram) </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)"> true</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">});
my.startShare();
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<p id="uec4c2b32" class="ne-p"> </p>
<p id="u956fbf71" class="ne-p"><span class="ne-text">小程序代码:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> .axml </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="page"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">web-view
</span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="web-view-1"</span><span style="color: rgba(255, 0, 0, 1)">
src</span><span style="color: rgba(0, 0, 255, 1)">="https://render.alipay.com/p/s/web-view/index"</span><span style="color: rgba(255, 0, 0, 1)">
onMessage</span><span style="color: rgba(0, 0, 255, 1)">="test"</span>
<span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">web-view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 小程序页面对应的 page.js 声明 test 方法,</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 由于 page.axml 里的 web-view 组件设置了 onMessage="test",</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 当页面里执行完 my.postMessage 后,test 方法会被执行</span>
<span style="color: rgba(0, 0, 0, 1)">Page({
onLoad(e) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.webViewContext = my.createWebViewContext('web-view-1'<span style="color: rgba(0, 0, 0, 1)">);
},
test(e) {
my.navigateToMiniProgram({
appId: </span>'B小程序的appid'<span style="color: rgba(0, 0, 0, 1)">,
path: </span>'pages/index/index?p=1&q=2'<span style="color: rgba(0, 0, 0, 1)">,
query: {
a: </span>'foo'<span style="color: rgba(0, 0, 0, 1)">,
b: </span>'bar'<span style="color: rgba(0, 0, 0, 1)">,
},
success: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (res) {
console.log(res);
},
fail: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
console.log(err);
}
});
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.webViewContext.postMessage({ sendToWebView: '1'<span style="color: rgba(0, 0, 0, 1)"> });
},
});</span></pre>
</div>
<p> </p>
<p id="u0fccb751" class="ne-p"> </p>
<h2 id="bs3IK"><span class="ne-text">其他问题分享</span></h2>
<p id="u3d5088e6" class="ne-p"><span class="ne-text">这边给写一下对接 web-view 过程中可能会遇到的一些问题:</span></p>
<ul class="ne-ul">
<li id="u5f004a08" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">web-view如何调用H5支付</span><span class="ne-text">]</span></span></li>
<li id="u0977624c" data-lake-index-type="0"><span class="ne-text"></span></li>
<li id="u7b03b3b2" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">web-view页面可以使用自定义组件吗</span><span class="ne-text">]</span></span></li>
<li id="uce1cde17" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">web-view承载的H5缓存与小程序缓存如何操作</span><span class="ne-text">]</span></span></li>
<li id="u7021246e" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">web-view组件支持刷新当前页面吗</span><span class="ne-text">]</span></span></li>
<li id="u978a124a" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">已设置web-view的H5域名,但是访问H5仍出现页面访问受限</span><span class="ne-text">]</span></span></li>
</ul>
<p id="ue3a021a4" class="ne-p"><span class="ne-text">希望对大家接入有所帮助~</span></p>
<p id="ud358ce1f" class="ne-p"> </p>
<p id="uee41ed0c" class="ne-p"><span class="ne-text">以上就是关于「小程序如何嵌入 H5 页面」的所有内容了,是不是这么一看还挺简单的,一起来试试吧,有问题欢迎在评论区沟通交流。</span></p>
</div><br><br>
来源:https://www.cnblogs.com/yjdmx/p/17974216
頁:
[1]