文档管理中心
您当前正在浏览HarmonyOS最新文档,覆盖已发布的所有API版本,可在API参考中筛选您使用的API版本。详细的版本配套关系请参考版本说明
开发与测试开放能力API应用框架ArkWeb(方舟Web)ArkTS 组件Web组件描述

组件描述

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

Web组件是ArkWeb Kit提供的具有网页显示能力的UI组件,用于在应用内嵌入和展示网页内容。开发者可通过Web组件加载在线网页和本地网页,支持隐私模式浏览、同步渲染模式、共享渲染进程等特性,满足混合开发、内容嵌入、浏览器类应用等多种场景下的网页展示需求。Web组件的控制器(WebviewController)及相关控制能力由模块描述提供。在使用Web组件时需注意:同一页面内的多个Web组件应分别绑定不同的WebviewController实例以保证独立性和性能隔离;移动设备上当Web实例超过10个时系统会主动回收后台页面数据。

元服务中使用ArkWeb的说明,请参考Web组件概述

说明
  • 该组件从API version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

  • 示例效果请以真机运行为准。

  • 在移动设备上,当应用的Web实例数量超过10个时,系统会主动回收后台页面数据。

该模块提供以下Web组件网页显示相关的常用功能:

需要权限

访问在线网页时需添加网络权限:ohos.permission.INTERNET,具体申请方式请参考声明权限

子组件

接口

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

Web(value: WebOptions)

说明

不支持转场动画。

为了保证各Web组件间的独立性和性能隔离,同一页面内的多个Web组件应分别绑定不同的WebviewController实例。

系统能力: SystemCapability.Web.Webview.Core

参数:

展开
参数名 类型 必填 说明
value WebOptions Web组件的初始化配置选项,用于设置加载的网页资源(src)、绑定的控制器(controller)以及渲染模式等行为参数。具体属性结构请参考WebOptions接口定义。

示例:

加载在线网页。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. controller: webview.WebviewController = new webview.WebviewController();
  7. build() {
  8. Column() {
  9. Web({ src: 'www.example.com', controller: this.controller })
  10. }
  11. }
  12. }

隐私模式WebView加载在线网页。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. controller: webview.WebviewController = new webview.WebviewController();
  7. build() {
  8. Column() {
  9. Web({ src: 'www.example.com', controller: this.controller, incognitoMode: true })
  10. }
  11. }
  12. }

Web组件同步渲染模式。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. controller: webview.WebviewController = new webview.WebviewController();
  7. build() {
  8. Column() {
  9. Web({ src: 'www.example.com', controller: this.controller, renderMode: RenderMode.SYNC_RENDER })
  10. }
  11. }
  12. }

Web组件指定共享渲染进程。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. exampleController: webview.WebviewController = new webview.WebviewController();
  7. w3Controller: webview.WebviewController = new webview.WebviewController();
  8. build() {
  9. Column() {
  10. Web({ src: 'www.example.com', controller: this.exampleController, sharedRenderProcessToken: '111' })
  11. Web({ src: 'www.w3.org', controller: this.w3Controller, sharedRenderProcessToken: '111' })
  12. }
  13. }
  14. }

指定Web组件是否将鼠标事件作为触摸事件处理。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. noEmulateController: webview.WebviewController = new webview.WebviewController();
  7. emulateTouchController: webview.WebviewController = new webview.WebviewController();
  8. build() {
  9. Column() {
  10. Web({ src: 'www.example.com', controller: this.noEmulateController, emulateTouchFromMouseEvent: false })
  11. Web({ src: 'www.w3.org', controller: this.emulateTouchController, emulateTouchFromMouseEvent: true })
  12. }
  13. }
  14. }

加载本地网页。

通过$rawfile方式加载。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. controller: webview.WebviewController = new webview.WebviewController();
  7. build() {
  8. Column() {
  9. // 通过$rawfile加载本地资源文件。
  10. Web({ src: $rawfile("index.html"), controller: this.controller })
  11. }
  12. }
  13. }

通过resource协议加载。

使用 resource://rawfile/ 协议前缀可以避免常规 $rawfile 方式在处理带有“#”路由链接时的局限性。当URL中包含“#”号时,“#”后面的内容会被视为锚点(fragment)。

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. controller: webview.WebviewController = new webview.WebviewController();
  7. build() {
  8. Column() {
  9. // 通过resource协议加载本地资源文件。
  10. Web({ src: "resource://rawfile/index.html#home", controller: this.controller })
  11. }
  12. }
  13. }

在“src/main/resources/rawfile”文件夹下创建index.html:

收起
自动换行
深色代码主题
复制
  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <body>
  5. <div id="content"></div>
  6. <script>
  7. function loadContent() {
  8. var hash = window.location.hash;
  9. var contentDiv = document.getElementById('content');
  10. if (hash === '#home') {
  11. contentDiv.innerHTML = '<h1>Home Page</h1><p>Welcome to the Home Page!</p>';
  12. } else {
  13. contentDiv.innerHTML = '<h1>Default Page</h1><p>This is the default content.</p>';
  14. }
  15. }
  16. // 加载界面
  17. window.addEventListener('load', loadContent);
  18. // 当hash变化时,更新界面
  19. window.addEventListener('hashchange', loadContent);
  20. </script>
  21. </body>
  22. </html>

加载沙箱路径下的本地资源文件,需要开启应用中文件系统的访问fileAccess权限。

  1. 通过构造的单例对象GlobalContext获取沙箱路径。

    收起
    自动换行
    深色代码主题
    复制
    1. // GlobalContext.ets
    2. export class GlobalContext {
    3. private constructor() {}
    4. private static instance: GlobalContext;
    5. private _objects = new Map<string, Object>();
    6. public static getContext(): GlobalContext {
    7. if (!GlobalContext.instance) {
    8. GlobalContext.instance = new GlobalContext();
    9. }
    10. return GlobalContext.instance;
    11. }
    12. getObject(value: string): Object | undefined {
    13. return this._objects.get(value);
    14. }
    15. setObject(key: string, objectClass: Object): void {
    16. this._objects.set(key, objectClass);
    17. }
    18. }
    收起
    自动换行
    深色代码主题
    复制
    1. // xxx.ets
    2. import { webview } from '@kit.ArkWeb';
    3. import { GlobalContext } from '../GlobalContext';
    4. let url = 'file://' + GlobalContext.getContext().getObject('filesDir') + '/index.html';
    5. @Entry
    6. @Component
    7. struct WebComponent {
    8. controller: webview.WebviewController = new webview.WebviewController();
    9. build() {
    10. Column() {
    11. // 加载沙箱路径文件。
    12. Web({ src: url, controller: this.controller })
    13. .fileAccess(true)
    14. }
    15. }
    16. }
  2. 修改EntryAbility.ets。

    以filesDir为例,获取沙箱路径。若想获取其他路径,请参考应用文件路径

    收起
    自动换行
    深色代码主题
    复制
    1. // xxx.ets
    2. import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
    3. import { webview } from '@kit.ArkWeb';
    4. import { GlobalContext } from '../GlobalContext';
    5. export default class EntryAbility extends UIAbility {
    6. onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    7. // 通过在GlobalContext对象上绑定filesDir,可以实现UIAbility组件与UI之间的数据同步。
    8. GlobalContext.getContext().setObject('filesDir', this.context.filesDir);
    9. console.info('Sandbox path is ' + GlobalContext.getContext().getObject('filesDir'));
    10. }
    11. }

    加载的html文件。

    收起
    自动换行
    深色代码主题
    复制
    1. <!-- index.html -->
    2. <!DOCTYPE html>
    3. <html>
    4. <body>
    5. <p>Hello World</p>
    6. </body>
    7. </html>
在 开发与测试 开放能力API 中进行搜索
请输入您想要搜索的关键词