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