简体中文
组件类型:UniWebViewElement
承载网页的容器
Web | 微信小程序 | Android | iOS |
---|---|---|---|
4.0 | 4.41 | 3.9 | 4.11 |
名称 | 类型 | 默认值 | 兼容性 | 描述 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
src | string(string.HTMLURIString) | - | webview 指向网页的链接 | |||||||||||||
allow | string | - | 用于为 iframe 指定其特征策略 | |||||||||||||
sandbox | string | - | 该属性对呈现在 iframe 框架中的内容启用一些额外的限制条件。 | |||||||||||||
fullscreen | boolean | - | 是否铺满整个页面,默认值:true 。 | |||||||||||||
webview-styles | WebViewStyles | {"progress":{"color":"#00FF00"}} | webview 网络地址页面加载进度条样式 | |||||||||||||
| ||||||||||||||||
horizontalScrollBarAccess | boolean | true | 设置是否显示横向滚动条 | |||||||||||||
verticalScrollBarAccess | boolean | true | 设置是否显示纵向滚动条 | |||||||||||||
@message | (event: UniWebViewMessageEvent) => void | - | 网页向应用 postMessage 时触发。e.detail = { data } | |||||||||||||
@error | (event: UniWebViewErrorEvent) => void | - | 网页加载错误时触发。e.detail = { errSubject, errCode, errMsg, url, fullUrl, src } | |||||||||||||
@load | (event: UniWebViewLoadEvent) => void | - | 网页加载完成后触发。e.detail = { url, src } | |||||||||||||
@loading | (event: UniWebViewLoadingEvent) => void | - | 网页加载中触发。e.detail = { url, src } | |||||||||||||
@download | (event: UniWebViewDownloadEvent) => void | - | 点击网页中可下载链接时触发。e.detail = { url, userAgent, contentDisposition, mimetype, contentLength } | |||||||||||||
(event: UniWebViewLoadEvent) => void | - | 网页加载完成后触发。e.detail = { url, src }。已废弃,请改用load |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
type | string | 是 | - | - | 事件类型,固定值message |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
data | UTSJSONObject[] | 是 | - | - | 消息包含的数据,4.13版本之前类型为Map<string, any | null> | null,4.13版本(含)之后类型为Array<UTSJSONObject> |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
type | string | 是 | - | - | 事件类型,固定值error |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
errSubject | string | 是 | - | - | 统一错误主题(模块)名称,固定值uni-web-view | ||||||||||||
errCode | number | 是 | - | - | 统一错误码 100001 ssl error 100002 page error 100003 http error | ||||||||||||
| |||||||||||||||||
errMsg | string | 是 | - | - | 统一错误描述信息 | ||||||||||||
url | string | 是 | - | - | 加载错误的网页链接,非完整链接,仅包含scheme://authority部分,4.13版本起支持 | ||||||||||||
fullUrl | string | 是 | - | - | 加载错误的网页链接,完整链接,4.13版本起支持 | ||||||||||||
src | string | 是 | - | - | 加载错误的网页链接,完整链接,4.13版本起支持 |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
type | string | 是 | - | - | 事件类型,固定值load |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
string | 是 | - | - | 加载完成的网页链接 | |
src | string | 是 | - | - | 加载完成的网页链接,4.13版本起支持 |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
type | string | 是 | - | - | 事件类型,固定值loading |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
string | 是 | - | - | 加载中的网页链接 | |
src | string | 是 | - | - | 加载中的网页链接,4.13版本起支持 |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
type | string | 是 | - | - | 事件类型,固定值download |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
url | string | 是 | - | - | 下载链接 |
userAgent | string | 是 | - | - | 用户代理 |
contentDisposition | string | 是 | - | - | 指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地 |
mimetype | string | 是 | - | - | 媒体类型 |
contentLength | number | 是 | - | - | 文件大小 |
为增强uni-app x组件的开放性,从 HBuilderX 4.25
起,UniElement对象提供了 getAndroidView 和 getIOSView 方法。
该方法可以获取到 web-view 组件对应的原生 WebView
对象,从而可以调用原生 API 以扩展当前 web-view 组件和上下文对象未提供的能力。
比如:Android 平台和 iOS 平台的原生 WebView 都提供了 canGoBack 和 canGoForward 两个 API,用来判断当前网页是否可以回退和前进。但 uni-app x 的 web-view 组件上下文对象没有封装上述 API。
下面则举例说明在 Android 平台如何通过获取原生 WebView 对象来实现上述能力(iOS 平台写法类似)。
import WebView from 'android.webkit.WebView';
function canGoBack() : boolean {
// 第一步获取web-view组件的UniElement对象
const element = uni.getElementById(elementId); //elementId为页面上web-view组件的id。不过一般建议从uvue页面给uts插件传入指定的UniElement对象,而不是在uts插件中直接获取页面组件的id。
// 第二步通过UniElement的getAndroidView方法,通过泛型指定的方式,获取Android原生的WebView对象。泛型参数即为原生对象的类型名称
const webview = element?.getAndroidView<WebView>();
// 然后就可以调用原生WebView的各种方法,比如 canGoBack 方法
return webview == null ? false : webview.canGoBack();
}
function canGoForward() : boolean {
const element = uni.getElementById(elementId); //elementId为页面上web-view组件的id
const webview = element?.getAndroidView<WebView>();
return webview == null ? false : webview.canGoForward();
}
详细的示例源码,在 hello uni-app x 的 组件 -> web-view 示例 中, 获取原生WebView对象,然后进一步使用了可否前进后退的方法,封装代码如下:
本地路径/static方式
由于uni-app/uni-app x编译时,只把/static目录下的静态资源copy到app中,所以src均需指向/static目录下。
其他目录的html文件由于不会被打包进去,所以无法访问。
app平台文件路径会存在大小写敏感问题,为了有更好的兼容性,建议统一按大小写敏感原则处理 详情
支持网络路径
支持http、https。
app平台使用系统Webview组件,由系统Webview管理缓存。
不可以嵌套组件
Template
Script
<template>
<scroll-view class="uni-flex-item">
<web-view id="web-view" class="uni-flex-item" :style="{ 'pointer-events': pointerEvents }" :src="src"
:webview-styles="webview_styles" :horizontalScrollBarAccess="horizontalScrollBarAccess"
:verticalScrollBarAccess="verticalScrollBarAccess" @message="message" @error="error" @loading="loading"
@load="load" @download="download" @touchstart="touchstart" @tap="tap">
</web-view>
<!-- #ifdef APP -->
<view class="uni-padding-wrap uni-common-mt">
<view class="uni-btn-v">
<input class="uni-input" confirmType="go" placeholder="输入网址跳转" @confirm="confirm" maxlength="-1" />
</view>
<view class="uni-row uni-btn-v">
<button class="uni-flex-item" type="primary" :disabled="!canGoBack" @click="back">后退</button>
<button class="margin-left-5 uni-flex-item" type="primary" :disabled="!canGoForward"
@click="forward">前进</button>
</view>
<view class="uni-row uni-btn-v">
<button class="uni-flex-item" type="primary" @click="reload">重新加载</button>
<button class="margin-left-5 uni-flex-item" type="primary" @click="stop">停止加载</button>
</view>
<view class="uni-btn-v">
<button type="primary" @click="nativeToWeb">原生和Web通信</button>
</view>
<!-- #ifdef APP-ANDROID -->
<view class="uni-row uni-btn-v">
<view class="uni-row uni-flex-item align-items-center">
<text>显示横向滚动条</text>
<switch :checked="true" @change="changeHorizontalScrollBarAccess"></switch>
</view>
<view class="uni-row uni-flex-item align-items-center">
<text>显示竖向滚动条</text>
<switch :checked="true" @change="changeVerticalScrollBarAccess"></switch>
</view>
</view>
<!-- #endif -->
<!-- #ifdef APP-IOS -->
<view class="uni-row uni-btn-v" v-if="isProd() === false">
<view class="uni-row uni-flex-item align-items-center">
<text>前进、后退功能在Windows端需要打自定义基座,MAC端需要配置Xcode环境后进行真机运行或者打自定义基座</text>
</view>
</view>
<!-- #endif -->
</view>
<!-- #endif -->
</scroll-view>
</template>
<style>
.margin-left-5 {
margin-left: 5px;
}
.align-items-center {
align-items: center;
}
</style>
web-view的操作api为uni.createWebviewContext()。
给web-view组件设一个id属性,将id的值传入uni.createWebviewContext(),即可得到web-view组件的上下文对象,进一步可使用.evalJS()
、.reload()
等方法。
uts向web-view的网页发消息
使用evalJS()
方法,详见上方示例代码
web-view里的网页向uts发消息
在网页中引入uni.webview.1.5.5.js。即可在网页中调用一批uni的api,包括:
方法名 | 说明 | 平台差异说明 |
---|---|---|
uni.webView.navigateTo | navigateTo | Web平台暂不支持 |
uni.webView.redirectTo | redirectTo | Web平台暂不支持 |
uni.webView.reLaunch | reLaunch | Web平台暂不支持 |
uni.webView.switchTab | switchTab | Web平台暂不支持 |
uni.webView.navigateBack | navigateBack | Web平台暂不支持 |
uni.webView.postMessage | 向应用发送消息 | Web平台暂不支持 |
在网页中使用uni.postMessage()
即可向uts发送消息。
uts端在 <web-view>
组件的 message
事件回调 event.detail.data
中接收消息。
示例代码详见hello-uni-app-x/hybrid/html/local.html
Tips
event.detail.data
中的数据,以数组的形式接收每次 post 的消息。(注:支付宝小程序除外,支付宝小程序中以对象形式接受)