鸿蒙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
收藏
回复
举报
回复
    相关推荐