web-view 网页容器
收藏
我的收藏

基础库 1.0.0 开始支持本组件。​
该组件是一个用于承载网页的容器,将 H5 切入到小程序内部,铺满整个页面。使用该组件要进行业务域名配置仅支持添加开发者可控制(能放置校验文件到域名根目录)的域名个人类型的小程序暂不支持使用。

属性说明​

属性名​
类型​
默认值​
必填​
说明​
最低支持版本​
src​
string​
是​
组件指向网页的链接。网页链接需登录字节小程序开发者平台配置业务域名。只支持 httpswss 协议。​
1.0.0​
progressbar-color​
Color​
#51a0d8​
否​
webview 的进度条颜色​
1.0.0​
type​
string​
default​
否​
若使用web-view组件引入第三方客服,必须填写type="im"业务域名配置流程及注意事项与普通H5页面接入一致​
2.72.0​
bindmessage​
EventHandle​
否​
当网页通过 tt.miniProgram.postMessage 向小程序 postMessage 时,bindmessage 绑定的方法会在小程序的特定时机(小程序后退、组件销毁、分享)触发并收到消息。​
1.17.0​
bindload​
EventHandle​
否​
当网页加载完成时触发的消息​
1.28.0​
binderror​
EventHandle​
否​
当网页加载失败时触发的消息​
1.0.0​

相关 API​

<web-view /> 中如果需要使用字节小程序提供的接口能力,需要手动引入 字节小程序 JSSDK 文件。提供了以下接口,为您使用:​
接口类型​
接口名​
说明​
JS SDK 支持版本​
导航​
tt.miniProgram.redirectTo​
参数与小程序接口 tt.redirectTo 一致​
1.0.1​
导航​
tt.miniProgram.navigateTo​
参数与小程序接口 tt.navigateTo 一致​
1.0.1​
导航​
tt.miniProgram.switchTab​
参数与小程序接口 tt.switchTab 一致​
1.0.1​
导航​
tt.miniProgram.reLaunch​
参数与小程序接口 tt.reLaunch 一致​
1.0.1​
导航​
tt.miniProgram.navigateBack​
参数与小程序接口 tt.navigateBack 一致​
1.0.1​
侧滑​
tt.miniProgram.setSwipeBackModeSync​
参数与小程序接口 tt.setSwipeBackModeSync 一致​
1.0.2
向小程序发送消息​
tt.miniProgram.postMessage​
此方法用于网页向小程序发送消息,会在特定时机(小程序后退、组件销毁、分享)触发组件的 bindmessage 上绑定的方法,方法的回调参数为网页postMessage的信息的数组队列,详细查看下面通信示例。​
1.0.1​
基础​
tt.miniProgram.getEnv​
用于获取当前是否是小程序环境。假如是小程序环境,会返回对应小程序 systemInfo (getSystemInfo complete返回值)。依赖基础库版本 2.74.0 及以上。​
tt.miniProgram.getEnv((res)=>{ if(res.miniprogram){ console.log(res.systemInfo); } })
1.1.0​
基础​
tt.miniProgram.checkJsApi​
用来判断传入当前宿主是否支持传入的Api。​
依赖基础库版本 2.74.0 及以上。详细查看下面checkJsApi示例
1.1.0​
图片​
tt.miniProgram.chooseImage​
参数与小程序接口tt.chooseImage一致。​
依赖基础库版本 2.74.0 及以上。​
1.1.0​
图片​
tt.miniProgram.compressImage​
参数与小程序接口tt.compressImage一致。​
依赖基础库版本 2.74.0 及以上。​
1.1.0​
图片​
tt.miniProgram.previewImage​
参数与小程序接口tt.previewImage一致。​
依赖基础库版本 2.74.0 及以上。​
1.1.0​
文件​
tt.miniProgram.uploadFile​
参数与小程序接口tt.uploadFile一致。​
依赖基础库版本 2.74.0 及以上。​
1.1.0​
网络​
tt.miniProgram.getNetworkType​
参数与小程序接口tt.getNetworkType一致。​
依赖基础库版本 2.74.0 及以上。​
1.1.0​
定位​
tt.miniProgram.openLocation​
参数与小程序接口tt.openLocation一致。​
依赖基础库版本 2.74.0 及以上。​
1.1.0​
定位​
tt.miniProgram.getLocation​
参数与小程序接口tt.getLocation一致。​
依赖基础库版本 2.74.0 及以上。​
1.1.0​
redirectTonavigateTo 等页面跳转的 api 只支持 url 为 / 开始的绝对路径。​
setSwipeBackModeSync api 依赖基础库的能力,而基础库从 2.17.0 版本开始支持此能力,所以如果强依赖此能力,建议通过 getSystemInfoSync api 中的参数 SDKVersion 作为判断依据。注意:即使是在低于 2.17.0 的基础库上使用此能力也不会报错,但是预期的功能不会生效。​
chooseImage、compressImage、previewImage、uploadFile、getNetwork、openLocation、getLocation 等在 JSSDK 1.1.0 新增的接口,依赖基础库版本 2.74.0。其次建议开发者在实际调用前通过 checkJsApi 进行 API 检测,确定支持后再进行实际调用。​

效果示例​

扫码体验​

代码示例​

简单示例​

<web-view src="https://some-domain/some/path"></web-view>

通信示例​

H5 的网页内容,并且假设网页上线后的链接为https://some-domain/some/path/index.html:​
<!-- https://some-domain/some/path/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>call phone</title> <!-- 需要主动引入JSSDK --> <script src="https://lf1-cdn-tos.bytegoofy.com/goofy/developer/jssdk/jssdk-1.1.0.js"></script> </head> <body> <div>H5的内容</div> </body> <script type="text/javascript"> (function () { // 发送postMessage1 tt.miniProgram.postMessage({ data: { mes: "postMessage1", }, // success 回调表示把 data 数据存储成功。 // 存储成功的数据会在小程序后退、组件销毁、页面分享时,通过 bindmessage 发送给用户 success(res) { console.log("网页消息"); }, // fail 回调表示没有把 data 数据存储成功 fail(err) { console.log(err); }, }); // 发送postMessage2 tt.miniProgram.postMessage({ data: { mes: "postMessage2", }, }); // 发送postMessage3 tt.miniProgram.postMessage({ data: { mes: "postMessage3", }, }); })(); </script> </html>
<!-- https://some-domain/some/path/index.html为上面H5的线上地址 --> <web-view src="https://some-domain/some/path/index.html" bindload="webviewOnLoad" binderror="webviewOnError" bindmessage="onMessage" ></web-view>
Page({ /** * 小程序后退、组件销毁、页面分享时且当前 H5 页面调用过 tt.miniProgram.postMessage,则触发此函数 * 其中 options.detail.data 就是 H5 页面通过 tt.miniProgram.postMessage 传入的 data 信息; */ onMessage(options) { /** * 网页的消息发出顺序为 postMessage1、postMessage2、postMessage3 * options.detail.data 的详细内容分别为: * [{ mes: "postMessage1" }, { mes: "postMessage2" }, { mes: "postMessage3" }] */ console.log("onmessage:", options.detail.data); }, webviewOnLoad() { console.log("webview 加载成功"); }, webviewOnError(e) { console.log("webview 加载失败", e); }, });

环境判断示例​

判断 H5 页面是否在小程序 web-view 打开​
// isTTWebView 若为 true,则是在头条小程序的 web-view 中打开 const isTTWebView = navigator.userAgent .toLowerCase() .includes("toutiaomicroapp");

分享示例​

用户分享时可获取当前 web-view 的 URL,即在 onShareAppMessage 回调中返回 webViewUrl 参数​
Page({ onShareAppMessage(options) { console.log(options.webViewUrl); // 当前 web-view 的URL }, });

完整的 h5 示例​

<!-- https://some-domain/some/path/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>call phone</title> <script src="https://lf1-cdn-tos.bytegoofy.com/goofy/developer/jssdk/jssdk-1.1.0.js"></script> </head> <body> <button onclick="navigateBack()">navigateBack</button> </body> <script type="text/javascript"> function navigateBack() { tt.miniProgram.navigateBack({ delta: 1, }); } </script> </html>
<!-- 将生成的 h5 站点地址放入小程序 web-view 的 src 即可 --> <web-view src="https://some-domain/some/path/index.html"></web-view>

web-view 组件支付示例​

web-view 组件中不支持调用 h5 中的支付,请跳转到小程序里支付,支付完成再返回 web-view 页面,逻辑如下:​
    1.web-view 网页中调用 tt.miniProgram.navigateTott.miniProgram.redirectTo 跳转至小程序支付页面,小程序支付 API: tt.pay。​
    2.完成支付后再跳转至 web-view 页面。​
// webview.html(web-view 组件承载的网页地址) 中的跳转逻辑 tt.miniProgram.navigateTo({ url: "/pages/pay/index", success(res) { console.log("跳转成功", res); }, fail(err) { console.log("navigateTo调用失败", err); }, });
// pages/pay/index Page({ pay() { // 支付逻辑 ... // 支付完成 tt.navigateTo({ url: '/pages/webview/index', // 指定页面的 url }); }, });

二级页面侧滑返回示例​

期望在 h5 的二级页面侧滑返回上级 h5 页面,而不是返回到小程序页面。​
// 比如 A 是 webview 组件的首页,跳转到二级页面 B,期望在 B 中侧滑能够返回到 A 页面,而不是退出到小程序页面。可以使用如下方式 // B.html tt.miniProgram.setSwipeBackModeSync(0);

checkJsApi 使用示例​

使用 checkJsApi 判断当前宿主是否支持某些 api。​
function checkJsApi(cb) { tt.miniProgram.checkJsApi({ jsApiList: ["chooseImage", "previewImage", "compressImage", "uploadFile"], success(res) { console.log("checkJsApi success:", res); cb(res); }, fail(res) { console.log("checkJsApi fail:", res); }, }); }

图片相关示例​

在 H5 中进行图片选取及上传。​
tt.miniProgram.chooseImage({ count:1, sourceType:'album', success(res){ console.log('chooseImage success:', res); tt.miniProgram.uploadFile({ url: 'https://some-domain/upload', filePath: res.tempFilePaths[0] name: 'data', success(res){ console.log('uploadFile success:', res); }, fail(res){ console.log('uploadFile fail:', res); } }) }, fail(res){ console.log('chooseImage fail:', res); } })

使用 web-view 打开限定域名内的网页​

访问小程序开发者平台,进入对应的小程序管理后台, 点击 开发设置 -> webview 域名,即可下载、配置校验文件并配置 webview 域名。​

Bug & Tip​

    Tip:jssdk 从 1.0.3 开始在非字节小程序环境下被引用,不会覆盖其他 jssdk 的 webkit 对象。​
    Tip:网页内 iframe 的域名也需要配置到域名白名单。​
    Tip:只能引入一次字节小程序 JSSDK,多次引入会导致小程序 API 无法调用。注意本次 jssdk 从 1.0.1 升级到 1.0.2,主要考虑到 1.0.1 对应的域名会逐步废弃掉,其次从 1.0.2 版本开始支持 setSwipeBackModeSync 能力。​
    Tip:一个页面只能有一个,会自动铺满整个页面,并覆盖其他组件。​
    Tip: 网页与小程序之间不支持除 JSSDK 提供的接口之外的通信。​
    Tip: 组件的 userAgent 的特征值是 ToutiaoMicroApp,可以通过 navigator.userAgent.toLowerCase().includes('toutiaomicroapp') 来判断页面环境是否为字节小程序。​
    Tip: 组件的 bindmessage 绑定的方法的触发时机是特定的,仅为小程序后退、组件销毁、分享时,方法内的回调参数是数组,小程序运行时会把tt.miniProgram.postMessage中发送的数据过滤掉方法后,保存在一个队列里,一次性通过bindmessage上的方法通知到小程序中。​
    Tip:不支持调起 H5 的支付。​
    Tip: 网页内的跳转链接,是需要配置域名白名单的,以支持二跳的时候可以正常的跳转。​
    Tip:src 属性仅支持 httpswss 协议,不支持的协议会返回:页面打开失败。​
    TIp:如果不配置端口。如 https://server.com,那么请求的 URL 中也不能包含端口,甚至是默认的 443 端口也不可以。如果向 https://server.com:443 请求则会失败。