
回复
本文总结一下使用Web组件访问在线网页时的基础属性和事件设置。
使用Web组件加载一个网页,最简单的一行代码就可实现,即 Web({ src: 网页地址, controller: new webview.WebviewController() })
名称 | 类型 |
---|---|
src | 网页资源地址 |
controller | 控制器,通过controller可以控制Web组件各种行为 |
renderMode | 表示当前Web组件的渲染方式 |
incognitoMode | 表示当前创建的webview是否是隐私模式 |
sharedRenderProcessToken | 表示当前Web组件指定共享渲染进程的token |
异步渲染模式:RenderMode.ASYNC_RENDER
在此场景下,Web组件高度正好为一屏或接近一屏(内嵌在navigation中)。加载的H5页面高度大于Web组件高度,Web内部将产生滚动条,用户可以通过在Web内部滑动来浏览H5页面的信息。建议在仅由Web组件构成的应用页面中使用此模式,以提高性能并降低功耗。
同步渲染模式:RenderMode.SYNC_RENDER
在此场景下,H5页面与Web组件高度一致,Web内部不生成滚动条,作为一个超长组件展示,通过Scroll组件实现应用内部的滚动,确保用户能够平滑浏览Web内容及其他ArkUI组件的内容。适用于需要Web作为业务内容的一部分渲染超长组件,不允许Web内部生成滚动条,与其余ArkUI组件协同完成页面布局
通过WebviewController可以控制Web组件各种行为,接下来看一下controller都有哪些方法,筛选一些常用的分类总结如下:
设置方法
方法名 | 说明 |
---|---|
loadUrl | 加载指定的URL |
refresh | 通知Web组件刷新网页 |
zoom | 调整当前网页的缩放比例 |
requestFocus | 使当前web页面获取焦点 |
zoomIn | 将当前网页进行放大,比例为25% |
zoomOut | 将当前网页进行缩小,比例为20% |
getTitle | 获取当前网页的标题 |
getPageHeight | 获取当前网页的页面高度 |
storeWebArchive | 异步保存当前页面 |
getUrl | 获取当前页面的url地址 |
stop | 停止页面加载 |
setAudioMuted | 设置网页静音 |
setUrlTrustList | 设置当前web的url白名单 |
setConnectionTimeout | 设置网络连接超时时间 |
onActive | 通知Web组件进入前台激活状态 |
onInactive | 通知Web组件进入未激活状态 |
前进后退方法 | |
方法名 | 说明 |
---- | ---- |
accessForward | 当前页面是否可前进 |
forward | 按照历史栈,前进一个页面 |
accessBackward | 当前页面是否可后退,即当前页面是否有返回历史记录 |
backward | 按照历史栈,后退一个页面 |
accessStep | 是否可前进或者后退给定的step步 |
clearHistory | 删除所有前进后退记录 |
backOrForward | 按照历史栈,前进或者后退指定步长的页面 |
getBackForwardEntries | 获取当前Webview的历史信息列表 |
JS交互相关方法 | |
方法名 | 说明 |
---- | ---- |
registerJavaScriptProxy | 注入JavaScript对象到window对象中 |
runJavaScript | 异步执行JavaScript脚本,返回Promise |
deleteJavaScriptRegister | 删除通过指定name的应用侧JavaScript对象 |
滚动相关方法 | |
方法名 | 说明 |
---- | ---- |
pageUp | 是否跳转到页面最顶部 |
pageDown | 是否跳转到页面最底部 |
setScrollable | 设置网页是否允许滚动 |
getScrollable | 获取当前网页是否允许滚动 |
getScrollOffset | 获取网页当前的滚动偏移量 |
scrollTo | 将页面滚动到指定的绝对位置 |
scrollBy | 将页面滚动指定的偏移量 |
关键字查找方法 | |
方法名 | 说明 |
---- | ---- |
searchAllAsync | 异步查找网页中所有匹配关键字并高亮 |
clearMatches | 清除所有高亮字符查找结果 |
searchNext | 滚动到下一个匹配的查找结果并高亮 |
web资源相关方法 | |
方法名 | 说明 |
---- | ---- |
getFavicon | 获取页面的favicon图标 |
hasImage | 查找当前页面是否存在图像 |
removeCache | 清除应用中的资源缓存文件 |
prefetchPage | 提前下载页面所需的资源 |
startDownload | 使用Web组件下载 |
enableAdsBlock | 启用广告过滤功能 |
isAdsBlockEnabled | 是否开启广告过滤功能 |
正常加载过程的状态回调
方法名 | 说明 |
---|---|
onControllerAttached | 当Controller成功绑定到Web组件时触发该回调,因该回调调用时网页还未加载,无法在回调中使用有关操作网页的接口 |
onLoadIntercept | 当Web组件加载url之前触发该回调,用于判断是否阻止此次访问。 |
onInterceptRequest | 当Web组件加载URL之前触发该回调,用于拦截URL并返回响应数据。返回响应数据则按照响应数据加载,无响应数据则返回null表示按照原来的方式加载。 |
onPageBegin | 网页开始加载时触发该回调,且只在主frame触发。 |
onProgressChange | 网页加载进度变化时触发该回调。 |
onPageEnd | 网页加载完成时触发该回调,且只在主frame触发。 |
异常加载涉及的状态回调 | |
方法名 | 说明 |
---- | ---- |
onOverrideUrlLoading | 回调函数返回true将导致当前Web中止加载URL,而返回false则会导致Web继续照常加载URL。 |
onPageVisible | 旧页面不再呈现,新页面即将可见时触发的回调函数。 |
onRenderExited | 应用渲染进程异常退出时触发该回调,可以在此回调中进行系统资源的释放、数据的保存等操作。 |
onDisAppear | 通用事件-组件卸载消失时触发此回调 |
回调事件测试代码 |
import { webview } from '@kit.ArkWeb'
import ApiConstants from '../net/ApiConstants'
@ComponentV2
export struct WebPage{
private webviewController: WebviewController = new webview.WebviewController()
build() {
Column() {
Web({
src: ApiConstants.WEB_URL,
controller: this.webviewController,
renderMode: RenderMode.ASYNC_RENDER // 设置渲染模式
})
//Web组件网页正常加载过程所涉及的状态
//该回调调用时网页还未加载,因此无法在回调中使用有关操作网页的接口
.onControllerAttached(() => {
// 推荐在此loadUrl、设置自定义用户代理、注入JS对象等
console.log('onControllerAttached execute')
})
//Web组件加载url之前触发该回调,用于判断是否阻止此次访问。默认允许加载
.onLoadIntercept((event) => {
if (event) {
console.log('onLoadIntercept url:' + event.data.getRequestUrl())
console.log('url:' + event.data.getRequestUrl())
console.log('isMainFrame:' + event.data.isMainFrame())
console.log('isRedirect:' + event.data.isRedirect())
console.log('isRequestGesture:' + event.data.isRequestGesture())
}
// 返回true表示阻止此次加载,否则允许此次加载
return false;
})
//当Web组件加载url之前触发该回调,用于拦截url并返回响应数据
.onInterceptRequest((event) => {
if (event) {
console.log('onInterceptRequest url:' + event.request.getRequestUrl());
}
// 返回响应数据则按照响应数据加载,无响应数据则返回null表示按照原来的方式加载
return null;
})
//网页开始加载时触发该回调
.onPageBegin((event) => {
if (event) {
console.log('onPageBegin url:' + event.url);
}
})
.onProgressChange((event) => {
if (event) {
console.log('onProgressChange:' + event.newProgress);
}
})
.onPageEnd((event) => {
// 推荐在此事件中执行JavaScript脚本
if (event) {
console.log('onPageEnd url:' + event.url);
}
})
//Web组件网页异常加载过程所涉及的状态
//回调函数返回true将导致当前Web中止加载URL,而返回false则会导致Web继续照常加载URL
.onOverrideUrlLoading((webResourceRequest: WebResourceRequest) => {
if (webResourceRequest && webResourceRequest.getRequestUrl() == "about:blank") {
return true;
}
return false;
})
//渲染流程中当HTTP响应的主体开始加载,新页面即将可见时触发该回调
.onPageVisible((event) => {
console.log('onPageVisible url:' + event.url);
})
//应用渲染进程异常退出时触发该回调,可以在此回调中进行系统资源的释放、数据的保存等操作
.onRenderExited((event) => {
if (event) {
console.log('onRenderExited reason:' + event.renderExitReason);
}
})
//组件卸载消失时触发此回调
.onDisAppear(() => {
this.getUIContext().getPromptAction().showToast({
message: 'The web is hidden',
duration: 2000
})
})
//网页加载遇到错误时触发该回调
.onErrorReceive((event) => {
if (event) {
console.log('getErrorInfo:' + event.error.getErrorInfo());
console.log('getErrorCode:' + event.error.getErrorCode());
console.log('url:' + event.request.getRequestUrl());
console.log('isMainFrame:' + event.request.isMainFrame());
console.log('isRedirect:' + event.request.isRedirect());
console.log('isRequestGesture:' + event.request.isRequestGesture());
console.log('getRequestHeader_headerKey:' + event.request.getRequestHeader().toString());
}
})
//网页加载过程中需要关注一些重要的性能指标。
//FCP 网页首次内容绘制的回调函数
.onFirstContentfulPaint(event => {
if (event) {
console.log("onFirstContentfulPaint:" + "[navigationStartTick]:" +
event.navigationStartTick + ", [firstContentfulPaintMs]:" +
event.firstContentfulPaintMs);
}
})
//FMP 网页绘制页面主要内容的回调函数
.onFirstMeaningfulPaint((details) => {
console.log("onFirstMeaningfulPaint: [navigationStartTime]= " + details.navigationStartTime +
", [firstMeaningfulPaintTime]=" + details.firstMeaningfulPaintTime);
})
//LCP 网页绘制页面最大内容的回调函数
.onLargestContentfulPaint((details) => {
console.log("onLargestContentfulPaint: [navigationStartTime]= " + details.navigationStartTime +
", [largestImagePaintTime]=" + details.largestImagePaintTime +
", [largestTextPaintTime]=" + details.largestTextPaintTime +
", [largestImageLoadStartTime]=" + details.largestImageLoadStartTime +
", [largestImageLoadEndTime]=" + details.largestImageLoadEndTime +
", [imageBPP]=" + details.imageBPP);
})
}
}
}