回复
鸿蒙Next组件Web基础属性和事件总结(一) 原创
auhgnixgnahz
发布于 2025-8-20 08:57
浏览
0收藏
本文总结一下使用Web组件访问在线网页时的基础属性和事件设置。
使用Web组件加载一个网页,最简单的一行代码就可实现,即 Web({ src: 网页地址, controller: new webview.WebviewController() })
Web组件需要传一个参数WebOptions,接下来看一下WebOptions的各个参数:
| 名称 | 类型 |
|---|---|
| src | 网页资源地址 |
| controller | 控制器,通过controller可以控制Web组件各种行为 |
| renderMode | 表示当前Web组件的渲染方式 |
| incognitoMode | 表示当前创建的webview是否是隐私模式 |
| sharedRenderProcessToken | 表示当前Web组件指定共享渲染进程的token |
其中渲染模式分2种:
异步渲染模式:RenderMode.ASYNC_RENDER
在此场景下,Web组件高度正好为一屏或接近一屏(内嵌在navigation中)。加载的H5页面高度大于Web组件高度,Web内部将产生滚动条,用户可以通过在Web内部滑动来浏览H5页面的信息。建议在仅由Web组件构成的应用页面中使用此模式,以提高性能并降低功耗。
同步渲染模式:RenderMode.SYNC_RENDER
在此场景下,H5页面与Web组件高度一致,Web内部不生成滚动条,作为一个超长组件展示,通过Scroll组件实现应用内部的滚动,确保用户能够平滑浏览Web内容及其他ArkUI组件的内容。适用于需要Web作为业务内容的一部分渲染超长组件,不允许Web内部生成滚动条,与其余ArkUI组件协同完成页面布局
WebviewController
通过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 | 是否开启广告过滤功能 |
接下来看一下Web回调事件
正常加载过程的状态回调
| 方法名 | 说明 |
|---|---|
| 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);
})
}
}
}
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
赞
1
收藏
回复
相关推荐




















