1# AtomicServiceWeb 2 3<!--Kit: ArkUI--> 4<!--Subsystem: ArkUI--> 5<!--Owner: @qq_36417014--> 6<!--Designer: @autojuan--> 7<!--Tester: @tinygreyy--> 8<!--Adviser: @zengyawen--> 9 10为开发者提供满足定制化诉求的Web高阶组件,屏蔽原生Web组件中无需关注的接口,并提供JS扩展能力。 11 12> **说明:** 13> 14> - 该组件从API Version 12开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 15> - 示例效果请以真机运行为准,当前DevEco Studio预览器不支持。 16 17## 需要权限 18 19访问在线网页时需添加网络权限:ohos.permission.INTERNET,具体申请方式请参考[声明权限](../../../security/AccessToken/declare-permissions.md)。 20 21## 导入模块 22 23``` 24import { AtomicServiceWeb } from '@kit.ArkUI'; 25``` 26 27## 子组件 28 29无 30 31## 属性 32 33不支持[通用属性](ts-component-general-attributes.md) 34 35## AtomicServiceWeb 36 37``` 38AtomicServiceWeb({ 39 src: ResourceStr, 40 controller: AtomicServiceWebController, 41 navPathStack?: NavPathStack, 42 mixedMode?: MixedMode, 43 darkMode?: WebDarkMode, 44 forceDarkAccess?: boolean, 45 nestedScroll?: NestedScrollOptions | NestedScrollOptionsExt, 46 onMessage?: Callback<OnMessageEvent>, 47 onErrorReceive?: Callback<OnErrorReceiveEvent>, 48 onHttpErrorReceive?: Callback<OnHttpErrorReceiveEvent>, 49 onPageBegin?: Callback<OnPageBeginEvent>, 50 onPageEnd?: Callback<OnPageEndEvent>, 51 onControllerAttached?: Callback<void>, 52 onLoadIntercept?: Callback<OnLoadInterceptEvent, boolean>, 53 onProgressChange?: Callback<OnProgressChangeEvent> 54}) 55``` 56 57**装饰器类型:**@Component 58 59**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 60 61**系统能力:** SystemCapability.ArkUI.ArkUI.Full 62 63**参数**: 64 65| 名称 | 类型 | 必填 | 装饰器类型 | 说明 | 66|----------------------|------------------------------------------------------------------------------------------------------------------|----|-------------|----------------------------------------------------------------------------------------------------------------------| 67| src | [ResourceStr](ts-types.md#resourcestr) | 是 | - | 网页资源地址,访问网络资源需要在AGC配置业务域名,访问本地资源仅支持包内文件($rawfile)。不支持通过状态变量(例如@State)动态更新地址。加载的网页中支持通过JS SDK提供的接口调用系统能力,具体以JS SDK为准。 | 68| controller | [AtomicServiceWebController](#atomicservicewebcontroller) | 是 | @ObjectLink | 通过AtomicServiceWebController可以控制AtomicServiceWeb组件各种行为。 | 69| navPathStack | [NavPathStack](ts-basic-components-navigation.md#navpathstack10) | 否 | - | 路由栈信息。当使用NavDestination作为页面的根容器时,需传入NavDestination容器对应的NavPathStack处理页面路由。 | 70| mixedMode | [MixedMode](../../apis-arkweb/arkts-basic-components-web-e.md#mixedmode) | 否 | @Prop | 设置是否允许加载超文本传输协议(HTTP)和超文本传输安全协议(HTTPS)混合内容,默认不允许加载HTTP和HTTPS混合内容。 | 71| darkMode | [WebDarkMode](../../apis-arkweb/arkts-basic-components-web-e.md#webdarkmode9) | 否 | @Prop | 设置Web深色模式,默认关闭。 | 72| forceDarkAccess | boolean | 否 | @Prop | 设置网页是否开启强制深色模式。true表示设置网页开启强制深色模式,false表示设置网页不开启强制深色模式。默认值:false。该属性仅在darkMode开启深色模式时生效。 | 73| nestedScroll<sup>15+</sup> | [NestedScrollOptions](../../apis-arkui/arkui-ts/ts-container-scrollable-common.md#nestedscrolloptions10对象说明) \| [NestedScrollOptionsExt](../../apis-arkweb/arkts-basic-components-web-i.md#nestedscrolloptionsext14) | 否 | @Prop | 设置嵌套滚动选项。<br>**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 | 74| onMessage | Callback\<[OnMessageEvent](#onmessageevent)\> | 否 | - | H5页面通过JS SDK的postMessage()发送消息后,Web组件对应的页面返回或销毁时,触发该回调。 | 75| onErrorReceive | Callback\<[OnErrorReceiveEvent](#onerrorreceiveevent)\> | 否 | - | 网页加载遇到错误时触发该回调。出于性能考虑,建议此回调中尽量执行简单逻辑。在无网络的情况下,触发此回调。 | 76| onHttpErrorReceive | Callback\<[OnHttpErrorReceiveEvent](#onhttperrorreceiveevent)\> | 否 | - | 网页加载资源遇到的HTTP错误(响应码>=400)时触发该回调。 | 77| onPageBegin | Callback\<[OnPageBeginEvent](#onpagebeginevent)\> | 否 | - | 网页开始加载时触发该回调,且只在主frame触发,iframe或者frameset的内容加载时不会触发此回调。 | 78| onPageEnd | Callback\<[OnPageEndEvent](#onpageendevent)\> | 否 | - | 网页加载完成时触发该回调,且只在主frame触发。 | 79| onControllerAttached | Callback\<void\> | 否 | - | 当Controller成功绑定到Web组件时触发该回调。 | 80| onLoadIntercept | [OnLoadInterceptCallback](#onloadinterceptcallback) | 否 | - | 当Web组件加载url之前触发该回调,用于判断是否阻止此次访问。默认允许加载。 | 81| onProgressChange | Callback\<[OnProgressChangeEvent](../../apis-arkweb/arkts-basic-components-web-i.md#onprogresschangeevent12)\> | 否 | - | 网页加载进度变化时触发该回调。 | 82 83## AtomicServiceWebController 84 85通过AtomicServiceWebController可以控制AtomicServiceWeb组件各种行为。一个AtomicServiceWebController对象只能控制一个AtomicServiceWeb组件,且必须在AtomicServiceWeb组件和AtomicServiceWebController绑定后,才能调用AtomicServiceWebController上的方法。 86 87**装饰器类型:** @Observed 88 89**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 90 91**系统能力:** SystemCapability.ArkUI.ArkUI.Full 92 93### getUserAgent 94 95getUserAgent(): string 96 97获取当前默认用户代理。 98 99**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 100 101**系统能力:** SystemCapability.ArkUI.ArkUI.Full 102 103**返回值:** 104 105| 类型 | 说明 | 106|--------|---------| 107| string | 默认用户代理。默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../../web/web-default-userAgent.md)。 | 108 109**错误码:** 110 111以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md)。 112 113| 错误码ID | 错误信息 | 114|----------|--------------------------------------------------------------------------------------------------| 115| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 116 117### getCustomUserAgent 118 119getCustomUserAgent(): string 120 121获取自定义用户代理。 122 123**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 124 125**系统能力:** SystemCapability.ArkUI.ArkUI.Full 126 127**返回值:** 128 129| 类型 | 说明 | 130|--------|------------| 131| string | 用户自定义代理信息。默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../../web/web-default-userAgent.md)。 | 132 133**错误码:** 134 135以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md). 136 137| 错误码ID | 错误信息 | 138|----------|--------------------------------------------------------------------------------------------------| 139| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 140 141### setCustomUserAgent 142 143setCustomUserAgent(userAgent: string): void 144 145设置自定义用户代理,会覆盖系统的用户代理。 146 147建议在onControllerAttached回调事件中设置User-Agent,设置方式请参考示例。不建议将User-Agent设置在onLoadIntercept回调事件中,会概率性出现设置失败。 148 149> **说明:** 150> 151>当Web组件src设置了url,且未在onControllerAttached回调事件中设置User-Agent。再调用setCustomUserAgent方法时,可能会出现加载的页面与实际设置User-Agent不符的异常现象。 152 153**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 154 155**系统能力:** SystemCapability.ArkUI.ArkUI.Full 156 157**参数:** 158 159| 参数名 | 类型 | 必填 | 说明 | 160|-----------|--------|----|--------------------------------------------------------------------------| 161| userAgent | string | 是 | 用户自定义代理信息。建议先使用[getUserAgent](#getuseragent)获取当前默认用户代理,在此基础上追加自定义用户代理信息。 | 162 163**错误码:** 164 165以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md). 166 167| 错误码ID | 错误信息 | 168|----------|--------------------------------------------------------------------------------------------------| 169| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 170| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 171 172### refresh 173 174refresh(): void 175 176调用此接口通知AtomicServiceWeb组件刷新网页。 177 178**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 179 180**系统能力:** SystemCapability.ArkUI.ArkUI.Full 181 182**错误码:** 183 184以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md). 185 186| 错误码ID | 错误信息 | 187|----------|--------------------------------------------------------------------------------------------------| 188| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 189 190### forward 191 192forward(): void 193 194按照历史栈,前进一个页面。一般结合[accessForward](#accessforward)一起使用。 195 196**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 197 198**系统能力:** SystemCapability.ArkUI.ArkUI.Full 199 200**错误码:** 201 202以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md). 203 204| 错误码ID | 错误信息 | 205|----------|--------------------------------------------------------------------------------------------------| 206| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 207 208### backward 209 210backward(): void 211 212按照历史栈,后退一个页面。一般结合[accessBackward](#accessbackward)一起使用。 213 214**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 215 216**系统能力:** SystemCapability.ArkUI.ArkUI.Full 217 218**错误码:** 219 220以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md). 221 222| 错误码ID | 错误信息 | 223|----------|--------------------------------------------------------------------------------------------------| 224| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 225 226### accessForward 227 228accessForward(): boolean 229 230当前页面是否可前进,即当前页面是否有前进历史记录。 231 232**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 233 234**系统能力:** SystemCapability.ArkUI.ArkUI.Full 235 236**返回值:** 237 238| 类型 | 说明 | 239|---------|-----------------------| 240| boolean | 可以前进返回true,否则返回false。 | 241 242**错误码:** 243 244以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md). 245 246| 错误码ID | 错误信息 | 247|----------|--------------------------------------------------------------------------------------------------| 248| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 249 250### accessBackward 251 252accessBackward(): boolean 253 254当前页面是否可后退,即当前页面是否有返回历史记录。 255 256**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 257 258**系统能力:** SystemCapability.ArkUI.ArkUI.Full 259 260**返回值:** 261 262| 类型 | 说明 | 263|---------|-----------------------| 264| boolean | 可以后退返回true,否则返回false。 | 265 266**错误码:** 267 268以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md). 269 270| 错误码ID | 错误信息 | 271|----------|--------------------------------------------------------------------------------------------------| 272| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 273 274### accessStep 275 276accessStep(step: number): boolean 277 278当前页面是否可前进或者后退给定的step步。 279 280**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 281 282**系统能力:** SystemCapability.ArkUI.ArkUI.Full 283 284**参数:** 285 286| 参数名 | 类型 | 必填 | 说明 | 287|------|--------|----|-----------------------| 288| step | number | 是 | 要跳转的步数,正数代表前进,负数代表后退。 | 289 290**返回值:** 291 292| 类型 | 说明 | 293|---------|-----------| 294| boolean | 页面是否可前进或者后退给定的step步。返回true表示可以前进或者后退,返回false表示不可以前进或后退。 | 295 296**错误码:** 297 298以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md). 299 300| 错误码ID | 错误信息 | 301|----------|--------------------------------------------------------------------------------------------------| 302| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 303| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 304 305### loadUrl 306 307loadUrl(url: string | Resource, headers?: Array\<WebHeader>): void 308 309加载指定的URL。 310 311**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 312 313**系统能力:** SystemCapability.ArkUI.ArkUI.Full 314 315**参数:** 316 317| 参数名 | 类型 | 必填 | 说明 | 318|---------|---------------------------------|----|:---------------| 319| url | string \| [Resource](../../apis-arkui/arkui-ts/ts-types.md#resource) | 是 | 需要加载的 URL。 | 320| headers | Array\<[WebHeader](#webheader)> | 否 | URL的附加HTTP请求头。 | 321 322**错误码:** 323 324以下错误码的详细介绍请参见[错误码](../../apis-arkweb/errorcode-webview.md). 325 326| 错误码ID | 错误信息 | 327|----------|--------------------------------------------------------------------------------------------------| 328| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 329| 17100001 | Init error. The AtomicServiceWebController must be associated with a AtomicServiceWeb component. | 330| 17100002 | Invalid url. | 331| 17100003 | Invalid resource path or file type. | 332 333## WebHeader 334 335Web组件返回的请求/响应头对象。 336 337**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 338 339**系统能力:** SystemCapability.ArkUI.ArkUI.Full 340 341| 名称 | 类型 | 只读 | 可选 | 说明 | 342|-------------|--------|----|----|---------------| 343| headerKey | string | 否 | 否 | 请求/响应头的key。 | 344| headerValue | string | 否 | 否 | 请求/响应头的value。 | 345 346## OnMessageEvent 347 348定义页面回退或销毁时触发该回调。 349 350**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 351 352**系统能力:** SystemCapability.ArkUI.ArkUI.Full 353 354| 名称 | 类型 | 必填 | 说明 | 355|------|----------|----|-------| 356| data | object[] | 是 | 消息列表。 | 357 358## OnErrorReceiveEvent 359 360定义网页加载遇到错误时触发该回调。 361 362**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 363 364**系统能力:** SystemCapability.ArkUI.ArkUI.Full 365 366| 名称 | 类型 | 必填 | 说明 | 367|---------|---------------------------------------------------------------------------------------|----|-----------------| 368| request | [WebResourceRequest](../../apis-arkweb/arkts-basic-components-web-WebResourceRequest.md) | 是 | 网页请求的封装信息。 | 369| error | [WebResourceError](../../apis-arkweb/arkts-basic-components-web-WebResourceError.md) | 是 | 网页加载资源错误的封装信息 。 | 370 371## OnHttpErrorReceiveEvent 372 373定义网页收到加载资源加载HTTP错误时触发。 374 375**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 376 377**系统能力:** SystemCapability.ArkUI.ArkUI.Full 378 379| 名称 | 类型 | 必填 | 说明 | 380|----------|-----------------------------------------------------------------------------------------|----|------------| 381| request | [WebResourceRequest](../../apis-arkweb/arkts-basic-components-web-WebResourceRequest.md) | 是 | 网页请求的封装信息。 | 382| response | [WebResourceResponse](../../apis-arkweb/arkts-basic-components-web-WebResourceResponse.md) | 是 | 资源响应的封装信息。 | 383 384## OnPageBeginEvent 385 386定义网页加载开始时触发的函数。 387 388**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 389 390**系统能力:** SystemCapability.ArkUI.ArkUI.Full 391 392| 名称 | 类型 | 必填 | 说明 | 393|-----|--------|----|-----------| 394| url | string | 是 | 页面的URL地址。 | 395 396## OnPageEndEvent 397 398定义网页加载结束时触发的函数。 399 400**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 401 402**系统能力:** SystemCapability.ArkUI.ArkUI.Full 403 404| 名称 | 类型 | 必填 | 说明 | 405|-----|--------|----|-----------| 406| url | string | 是 | 页面的URL地址。 | 407 408## OnLoadInterceptEvent 409 410当资源加载被拦截时,加载拦截事件。 411 412**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 413 414**系统能力:** SystemCapability.ArkUI.ArkUI.Full 415 416| 名称 | 类型 | 必填 | 说明 | 417| -------------- | ---- | ---- | ---------------------------------------- | 418| data | [WebResourceRequest](../../apis-arkweb/arkts-basic-components-web-WebResourceRequest.md) | 是 | 网页请求的封装信息。 | 419 420## OnProgressChangeEvent 421 422定义网页加载进度变化时触发该回调。 423 424**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 425 426**系统能力:** SystemCapability.ArkUI.ArkUI.Full 427 428| 名称 | 类型 | 必填 | 说明 | 429| -------------- | ---- | ---- | ---------------------------------------- | 430| newProgress | number | 是 | 新的加载进度,取值范围为0到100的整数。 | 431 432## OnLoadInterceptCallback 433 434type OnLoadInterceptCallback = (event: OnLoadInterceptEvent) => boolean 435 436资源加载被拦截时触发该回调。 437 438**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 439 440**系统能力:** SystemCapability.ArkUI.ArkUI.Full 441 442**参数:** 443 444| 参数名 | 类型 | 必填 | 说明 | 445|------|--------|----|-----------------------| 446| event | OnLoadInterceptEvent | 是 | 当资源加载被拦截时,加载拦截事件。 | 447 448**返回值:** 449 450| 类型 | 说明 | 451|---------|-----------| 452| boolean | 返回资源是否被拦截 | 453 454## 事件 455 456不支持[通用事件](ts-component-general-events.md) 457 458## 示例 459 460### 示例1 461 462加载本地网页。 463 464```ts 465// xxx.ets 466import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI'; 467 468@Entry 469@Component 470struct WebComponent { 471 @State controller: AtomicServiceWebController = new AtomicServiceWebController(); 472 473 build() { 474 Column() { 475 AtomicServiceWeb({ src: $rawfile("index.html"), controller: this.controller }) 476 } 477 } 478} 479``` 480 481### 示例2 482 483加载在线网页。 484 485```ts 486// xxx.ets 487import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI'; 488 489@Entry 490@Component 491struct WebComponent { 492 @State controller: AtomicServiceWebController = new AtomicServiceWebController(); 493 494 build() { 495 Column() { 496 AtomicServiceWeb({ src: 'https://www.example.com', controller: this.controller }) 497 } 498 } 499} 500``` 501 502### 示例3 503 504NavDestination容器中加载网页。 505 506```ts 507// xxx.ets 508import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI'; 509 510@Builder 511export function WebComponentBuilder(name: string, param: Object) { 512 WebComponent() 513} 514 515@Component 516struct WebComponent { 517 navPathStack: NavPathStack = new NavPathStack(); 518 @State controller: AtomicServiceWebController = new AtomicServiceWebController(); 519 520 build() { 521 NavDestination() { 522 AtomicServiceWeb({ src: $rawfile("index.html"), controller: this.controller, navPathStack: this.navPathStack }) 523 } 524 .onReady((context: NavDestinationContext) => { 525 this.navPathStack = context.pathStack; 526 }) 527 } 528} 529``` 530 531### 示例4 532 533设置onMessage()事件回调。 534 535```ts 536// xxx.ets 537import { AtomicServiceWeb, AtomicServiceWebController, OnMessageEvent } from '@kit.ArkUI'; 538 539@Entry 540@Component 541struct WebComponent { 542 @State controller: AtomicServiceWebController = new AtomicServiceWebController(); 543 544 build() { 545 Column() { 546 AtomicServiceWeb({ 547 src: $rawfile("index.html"), 548 controller: this.controller, 549 // H5页面点击“发送消息”后,再点击“返回上一页”,触发该回调 550 onMessage: (event: OnMessageEvent) => { 551 console.info(`[AtomicServiceWebLog] onMessage data = ${JSON.stringify(event.data)}`); 552 } 553 }) 554 } 555 } 556} 557``` 558 559```html 560// index.html 561<!DOCTYPE html> 562<html> 563<meta charset="utf-8"> 564<!-- 引入JS SDK文件 --> 565<script src="../js/atomicservice-sdk.js" type="text/javascript"></script> 566<body> 567<h1>JS SDK - postMessage()</h1> 568<br/> 569<button type="button" onclick="postMessage({ name: 'Jerry', age: 18 });">发送消息</button> 570<br/> 571<button type="button" onclick="back();">返回上一页</button> 572</body> 573<script type="text/javascript"> 574 function postMessage(data) { 575 // JS SDK提供的发送消息接口 576 has.asWeb.postMessage({ 577 data: data, 578 callback: (err, res) => { 579 if (err) { 580 console.error(`[AtomicServiceWebLog H5] postMessage error err. Code: ${err.code}, message: ${err.message}`); 581 } else { 582 console.info(`[AtomicServiceWebLog H5] postMessage success res = ${JSON.stringify(res)}`); 583 } 584 } 585 }); 586 } 587 588 function back() { 589 // JS SDK提供的Router路由回退接口 590 has.router.back({ 591 delta: 1 592 }); 593 } 594</script> 595</html> 596``` 597 598### 示例5 599 600设置网页加载事件回调。 601 602```ts 603// xxx.ets 604import { 605 AtomicServiceWeb, 606 AtomicServiceWebController, 607 OnErrorReceiveEvent, 608 OnHttpErrorReceiveEvent, 609 OnPageBeginEvent, 610 OnPageEndEvent 611} from '@kit.ArkUI'; 612 613@Entry 614@Component 615struct WebComponent { 616 @State controller: AtomicServiceWebController = new AtomicServiceWebController(); 617 618 build() { 619 Column() { 620 AtomicServiceWeb({ 621 src: $rawfile('index.html'), 622 controller: this.controller, 623 // 网页加载遇到错误时触发该回调 624 onErrorReceive: (event: OnErrorReceiveEvent) => { 625 console.info(`AtomicServiceWebLog onErrorReceive event = ${JSON.stringify({ 626 requestUrl: event.request?.getRequestUrl(), 627 requestMethod: event.request?.getRequestMethod(), 628 errorCode: event.error?.getErrorCode(), 629 errorInfo: event.error?.getErrorInfo() 630 })}`); 631 }, 632 // 网页加载遇到HTTP资源加载错误时触发该回调 633 onHttpErrorReceive: (event: OnHttpErrorReceiveEvent) => { 634 console.info(`AtomicServiceWebLog onHttpErrorReceive event = ${JSON.stringify({ 635 requestUrl: event.request?.getRequestUrl(), 636 requestMethod: event.request?.getRequestMethod(), 637 responseCode: event.response?.getResponseCode(), 638 responseData: event.response?.getResponseData(), 639 })}`); 640 }, 641 // 页面开始加载,触发该回调 642 onPageBegin: (event: OnPageBeginEvent) => { 643 console.info(`AtomicServiceWebLog onPageBegin event = ${JSON.stringify({ 644 url: event.url 645 })}`); 646 }, 647 // 页面加载完成,触发该回调 648 onPageEnd: (event: OnPageEndEvent) => { 649 console.info(`AtomicServiceWebLog onPageEnd event = ${JSON.stringify({ 650 url: event.url 651 })}`); 652 } 653 }) 654 } 655 } 656} 657``` 658 659### 示例6 660 661AtomicServiceWeb跟AtomicServiceWebController的使用示例。 662 663```ts 664// xxx.ets 665import { 666 AtomicServiceWeb, 667 AtomicServiceWebController, 668 OnErrorReceiveEvent, 669 OnHttpErrorReceiveEvent, 670 OnPageBeginEvent, 671 OnPageEndEvent, 672 OnMessageEvent, 673 OnLoadInterceptEvent, 674 OnProgressChangeEvent 675} from '@kit.ArkUI'; 676 677@Entry 678@Component 679struct WebComponent { 680 @State darkMode: WebDarkMode = WebDarkMode.On; 681 @State forceDarkAccess: boolean = true; 682 @State mixedMode: MixedMode = MixedMode.None; 683 @State controller: AtomicServiceWebController = new AtomicServiceWebController(); 684 @State num: number = 1; 685 686 build() { 687 Column() { 688 Button('accessForward').onClick(() => { 689 console.info(`AtomicServiceWebLog accessForward = ${this.controller.accessForward()}`); 690 }) 691 Button('accessBackward').onClick(() => { 692 console.info(`AtomicServiceWebLog accessBackward = ${this.controller.accessBackward()}`); 693 }) 694 Button('accessStep').onClick(() => { 695 console.info(`AtomicServiceWebLog accessStep = ${this.controller.accessStep(1)}`); 696 }) 697 Button('forward').onClick(() => { 698 console.info(`AtomicServiceWebLog forward = ${this.controller.forward()}`); 699 }) 700 Button('backward').onClick(() => { 701 console.info(`AtomicServiceWebLog backward = ${this.controller.backward()}`); 702 }) 703 Button('refresh').onClick(() => { 704 console.info(`AtomicServiceWebLog refresh = ${this.controller.refresh()}`); 705 }) 706 Button('loadUrl').onClick(() => { 707 console.info(`AtomicServiceWebLog loadUrl = ${this.controller.loadUrl('https://www.baidu.com/')}`); 708 }) 709 Button('深色模式').onClick(() => { 710 this.forceDarkAccess = !this.forceDarkAccess; 711 }) 712 Button('mixedMode').onClick(() => { 713 this.mixedMode = this.mixedMode == MixedMode.None ? MixedMode.All : MixedMode.None; 714 }) 715 Button('点击').onClick(() => { 716 console.info(`AtomicServiceWebLog getUserAgent = ${this.controller.getUserAgent()}`); 717 console.info(`AtomicServiceWebLog getCustomUserAgent = ${this.controller.getCustomUserAgent()}`); 718 this.controller.setCustomUserAgent('test' + this.num++); 719 720 console.info(`AtomicServiceWebLog getUserAgent after set = ${this.controller.getUserAgent()}`); 721 console.info(`AtomicServiceWebLog getCustomUserAgent after set = ${this.controller.getCustomUserAgent()}`); 722 }) 723 AtomicServiceWeb({ 724 src: 'https://www.example.com', 725 mixedMode: this.mixedMode, 726 darkMode: this.darkMode, 727 forceDarkAccess: this.forceDarkAccess, 728 controller: this.controller, 729 onControllerAttached: () => { 730 console.info("AtomicServiceWebLog onControllerAttached call back success"); 731 }, 732 onLoadIntercept: (event: OnLoadInterceptEvent) => { 733 console.info("AtomicServiceWebLog onLoadIntercept call back success " + JSON.stringify({ 734 getRequestUrl: event.data.getRequestUrl(), 735 getRequestMethod: event.data.getRequestMethod(), 736 getRequestHeader: event.data.getRequestHeader(), 737 isRequestGesture: event.data.isRequestGesture(), 738 isMainFrame: event.data.isMainFrame(), 739 isRedirect: event.data.isRedirect(), 740 })) 741 return false; 742 }, 743 onProgressChange: (event: OnProgressChangeEvent) => { 744 console.info("AtomicServiceWebLog onProgressChange call back success " + JSON.stringify(event)); 745 }, 746 onMessage: (event: OnMessageEvent) => { 747 console.info("onMessage call back success " + JSON.stringify(event)); 748 }, 749 onPageBegin: (event: OnPageBeginEvent) => { 750 console.info("onPageBegin call back success " + JSON.stringify(event)); 751 }, 752 onPageEnd: (event: OnPageEndEvent) => { 753 console.info("onPageEnd call back success " + JSON.stringify(event)); 754 }, 755 onHttpErrorReceive: (event: OnHttpErrorReceiveEvent) => { 756 console.info("onHttpErrorReceive call back success " + JSON.stringify(event)); 757 }, 758 onErrorReceive: (event: OnErrorReceiveEvent) => { 759 console.info("onErrorReceive call back success " + JSON.stringify(event)); 760 } 761 }) 762 } 763 } 764} 765``` 766 767### 示例7 768 769设置嵌套滚动。 770 771```ts 772import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI'; 773 774@Entry 775@Component 776struct AtomicServiceNestedScroll { 777 @State controller: AtomicServiceWebController = new AtomicServiceWebController(); 778 @State mode: string = 'PARALLEL模式(点击切换)'; 779 @State nestedScroll: NestedScrollOptions | NestedScrollOptionsExt = { 780 scrollForward: NestedScrollMode.PARALLEL, 781 scrollBackward: NestedScrollMode.PARALLEL 782 }; 783 784 build() { 785 Scroll() { 786 Column() { 787 Text("嵌套AsWeb-头部") 788 .height("15%") 789 .width("100%") 790 .fontSize(30) 791 .backgroundColor(Color.Yellow) 792 Button(this.mode) 793 .margin({ top: 10, bottom: 10 }) 794 .onClick(() => { 795 if (!(this.nestedScroll as NestedScrollOptions).scrollForward) { 796 this.mode = 'SELF_FIRST模式(点击切换)'; 797 this.nestedScroll = { 798 scrollForward: NestedScrollMode.SELF_FIRST, 799 scrollBackward: NestedScrollMode.SELF_FIRST 800 } 801 } else { 802 this.mode = 'PARENT_FIRST模式(点击切换)'; 803 this.nestedScroll = { 804 scrollUp: NestedScrollMode.PARENT_FIRST, 805 scrollDown: NestedScrollMode.PARENT_FIRST 806 } 807 } 808 }) 809 AtomicServiceWeb({ 810 src: 'https://www.example.com', 811 controller: this.controller, 812 nestedScroll: this.nestedScroll 813 }) 814 Text("嵌套AsWeb-尾部") 815 .height("15%") 816 .width("100%") 817 .fontSize(30) 818 .backgroundColor(Color.Yellow) 819 } 820 } 821 } 822} 823``` 824