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 及以上。​
Plain Text
复制
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 检测,确定支持后再进行实际调用。​

效果示例​

扫码体验​

代码示例​

简单示例​

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

通信示例​

H5 的网页内容,并且假设网页上线后的链接为https://some-domain/some/path/index.html:​
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>
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>
js
复制
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 打开​
js
复制
// isTTWebView 若为 true,则是在头条小程序的 web-view 中打开
const isTTWebView = navigator.userAgent
.toLowerCase()
.includes("toutiaomicroapp");

分享示例​

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

完整的 h5 示例​

html
复制
<!-- 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>
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 页面。​
js
复制
// webview.html(web-view 组件承载的网页地址) 中的跳转逻辑
tt.miniProgram.navigateTo({
url: "/pages/pay/index",
success(res) {
console.log("跳转成功", res);
},
fail(err) {
console.log("navigateTo调用失败", err);
},
});
js
复制
// pages/pay/index
Page({
pay() {
// 支付逻辑
...
// 支付完成
tt.navigateTo({
url: '/pages/webview/index', // 指定页面的 url
});
},
});

二级页面侧滑返回示例​

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

checkJsApi 使用示例​

使用 checkJsApi 判断当前宿主是否支持某些 api。​
js
复制
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 中进行图片选取及上传。​
js
复制
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 请求则会失败。