1# Class (WebviewController) 2<!--Kit: ArkWeb--> 3<!--Subsystem: Web--> 4<!--Owner: @yp99ustc; @aohui; @zourongchun--> 5<!--Designer: @LongLie; @yaomingliu; @zhufenghao--> 6<!--Tester: @ghiker--> 7<!--Adviser: @HelloCrease--> 8 9通过WebviewController可以控制Web组件各种行为(包括页面导航、生命周期状态、JavaScript交互等行为)。一个WebviewController对象只能控制一个Web组件,且必须在Web组件和WebviewController绑定后,才能调用WebviewController上的方法(静态方法除外)。 10 11> **说明:** 12> 13> - 本模块首批接口从API version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 14> 15> - 本Class首批接口从API version 9开始支持。 16> 17> - 示例效果请以真机运行为准,当前DevEco Studio预览器不支持。 18 19## 导入模块 20 21```ts 22import { webview } from '@kit.ArkWeb'; 23``` 24 25## constructor<sup>11+</sup> 26 27constructor(webTag?: string) 28 29用于创建 WebviewController 对象的构造函数。 30 31> **说明:** 32> 33> 不传参:new webview.WebviewController()表示构造函数为空,不使用C API时不需要传参。 34> 35> 传参且参数是合法字符串:new webview.WebviewController("xxx"),用于开发者区分多实例,并调用对应实例下的方法。 36> 37> 传入参数为空:new webview.WebviewController("")或new webview.WebviewController(undefined),该场景下参数无意义,无法区分多个实例,直接返回undefined,需要开发者判断返回值是否正常。 38> 39> Web组件销毁后会解绑WebViewController,之后调用WebviewController的非静态方法会抛出17100001异常,应注意调用时机和捕获异常,防止进程异常退出。 40 41**系统能力:** SystemCapability.Web.Webview.Core 42 43**参数:** 44 45| 参数名 | 类型 | 必填 | 说明 | 46| ---------- | ------ | ---- | -------------------------------- | 47| webTag | string | 否 | 指定了 Web 组件的名称。 | 48 49**示例:** 50 51```ts 52// xxx.ets 53import { webview } from '@kit.ArkWeb'; 54import { BusinessError } from '@kit.BasicServicesKit'; 55 56class WebObj { 57 constructor() { 58 } 59 60 webTest(): string { 61 console.info('Web test'); 62 return "Web test"; 63 } 64 65 webString(): void { 66 console.info('Web test toString'); 67 } 68} 69 70@Entry 71@Component 72struct WebComponent { 73 controller: webview.WebviewController = new webview.WebviewController() 74 @State webTestObj: WebObj = new WebObj(); 75 76 build() { 77 Column() { 78 Button('refresh') 79 .onClick(() => { 80 try { 81 this.controller.refresh(); 82 } catch (error) { 83 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 84 } 85 }) 86 Button('deleteJavaScriptRegister') 87 .onClick(() => { 88 try { 89 this.controller.deleteJavaScriptRegister("objTestName"); 90 } catch (error) { 91 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 92 } 93 }) 94 Web({ src: '', controller: this.controller }) 95 .javaScriptAccess(true) 96 .onControllerAttached(() => { 97 this.controller.loadUrl($rawfile("index.html")); 98 this.controller.registerJavaScriptProxy(this.webTestObj, "objTestName", ["webTest", "webString"]); 99 }) 100 } 101 } 102} 103``` 104 105加载的html文件。 106```html 107<!-- index.html --> 108<!DOCTYPE html> 109<html> 110 <head> 111 <meta charset="utf-8"> 112 </head> 113 <body> 114 <button type="button" onclick="htmlTest()">Click Me!</button> 115 <p id="demo"></p> 116 <p id="webDemo"></p> 117 <script type="text/javascript"> 118 function htmlTest() { 119 // This function call expects to return "Web test" 120 let webStr = objTestName.webTest(); 121 document.getElementById("webDemo").innerHTML=webStr; 122 console.info('objTestName.webTest result:'+ webStr) 123 } 124 </script> 125 </body> 126</html> 127``` 128 129## initializeWebEngine 130 131static initializeWebEngine(): void 132 133在 Web 组件初始化之前,通过此接口加载 Web 引擎的动态库文件,以提高启动性能。自动预连接历史访问过的高频网站。 134 135> **说明:** 136> 137> - initializeWebEngine不支持在异步线程中调用,否则会造成崩溃。 138> - initializeWebEngine全局生效,在整个APP生命周期中调用一次即可,不需要重复调用。 139 140**系统能力:** SystemCapability.Web.Webview.Core 141 142**示例:** 143 144本示例以EntryAbility为例,描述了在 Ability 创建阶段完成 Web 组件动态库加载的功能。 145 146```ts 147// xxx.ets 148import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 149import { webview } from '@kit.ArkWeb'; 150 151export default class EntryAbility extends UIAbility { 152 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 153 console.info("EntryAbility onCreate") 154 webview.WebviewController.initializeWebEngine() 155 console.info("EntryAbility onCreate done") 156 } 157} 158``` 159 160## setHttpDns<sup>10+</sup> 161 162static setHttpDns(secureDnsMode:SecureDnsMode, secureDnsConfig:string): void 163 164设置Web组件是否使用HTTPDNS解析DNS。 165 166**系统能力:** SystemCapability.Web.Webview.Core 167 168**参数:** 169 170| 参数名 | 类型 | 必填 | 说明 | 171| ------------------ | ------- | ---- | ------------- | 172| secureDnsMode | [SecureDnsMode](./arkts-apis-webview-e.md#securednsmode10) | 是 | 使用HTTPDNS的模式。| 173| secureDnsConfig | string | 是 | HTTPDNS server的配置,必须是https协议并且只允许配置一个server。 | 174 175**错误码:** 176 177以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 178 179| 错误码ID | 错误信息 | 180| -------- | ----------------------- | 181| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. | 182 183**示例:** 184 185```ts 186// xxx.ets 187import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 188import { webview } from '@kit.ArkWeb'; 189import { BusinessError } from '@kit.BasicServicesKit'; 190 191export default class EntryAbility extends UIAbility { 192 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 193 console.info("EntryAbility onCreate") 194 try { 195 webview.WebviewController.setHttpDns(webview.SecureDnsMode.AUTO, "https://example1.test") 196 } catch (error) { 197 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 198 } 199 200 AppStorage.setOrCreate("abilityWant", want); 201 console.info("EntryAbility onCreate done") 202 } 203} 204``` 205 206## setWebDebuggingAccess 207 208static setWebDebuggingAccess(webDebuggingAccess: boolean): void 209 210设置是否启用网页调试功能。详情请参考[DevTools工具](../../web/web-debugging-with-devtools.md)。 211 212安全提示:启用网页调试功能可以让用户检查修改Web页面内部状态,存在安全隐患,不建议在应用正式发布版本中启用。 213 214**系统能力:** SystemCapability.Web.Webview.Core 215 216**参数:** 217 218| 参数名 | 类型 | 必填 | 说明 | 219| ------------------ | ------- | ---- | ------------- | 220| webDebuggingAccess | boolean | 是 | 设置是否启用网页调试功能。<br>true表示启用网页调试功能。false表示不启用网页调试功能。<br>默认值:false。 | 221 222**错误码:** 223 224以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 225 226| 错误码ID | 错误信息 | 227| -------- | ------------------------------------------------------------ | 228| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 229 230**示例:** 231 232```ts 233// xxx.ets 234import { webview } from '@kit.ArkWeb'; 235import { BusinessError } from '@kit.BasicServicesKit'; 236 237@Entry 238@Component 239struct WebComponent { 240 controller: webview.WebviewController = new webview.WebviewController(); 241 242 aboutToAppear(): void { 243 try { 244 webview.WebviewController.setWebDebuggingAccess(true); 245 } catch (error) { 246 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 247 } 248 } 249 250 build() { 251 Column() { 252 Web({ src: 'www.example.com', controller: this.controller }) 253 } 254 } 255} 256``` 257 258## loadUrl 259 260loadUrl(url: string | Resource, headers?: Array\<WebHeader>): void 261 262加载指定的URL。 263 264**系统能力:** SystemCapability.Web.Webview.Core 265 266**参数:** 267 268| 参数名 | 类型 | 必填 | 说明 | 269| ------- | ---------------- | ---- | :-------------------- | 270| url | string \| Resource | 是 | 需要加载的 URL。 | 271| headers | Array\<[WebHeader](./arkts-apis-webview-i.md#webheader)> | 否 | URL的附加HTTP请求头。<br>默认值: [] | 272 273**错误码:** 274 275以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 276 277| 错误码ID | 错误信息 | 278| -------- | ------------------------------------------------------------ | 279| 17100001 | Init error. The WebviewController must be associated with a Web component. | 280| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048. | 281| 17100003 | Invalid resource path or file type. | 282| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 283 284**示例:** 285 286```ts 287// xxx.ets 288import { webview } from '@kit.ArkWeb'; 289import { BusinessError } from '@kit.BasicServicesKit'; 290 291@Entry 292@Component 293struct WebComponent { 294 controller: webview.WebviewController = new webview.WebviewController(); 295 296 build() { 297 Column() { 298 Button('loadUrl') 299 .onClick(() => { 300 try { 301 // 需要加载的URL是string类型。 302 this.controller.loadUrl('www.example.com'); 303 } catch (error) { 304 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 305 } 306 }) 307 Web({ src: 'www.example.com', controller: this.controller }) 308 } 309 } 310} 311``` 312 313```ts 314// xxx.ets 315import { webview } from '@kit.ArkWeb'; 316import { BusinessError } from '@kit.BasicServicesKit'; 317 318@Entry 319@Component 320struct WebComponent { 321 controller: webview.WebviewController = new webview.WebviewController(); 322 323 build() { 324 Column() { 325 Button('loadUrl') 326 .onClick(() => { 327 try { 328 // 带参数headers。 329 this.controller.loadUrl('www.example.com', [{ headerKey: "headerKey", headerValue: "headerValue" }]); 330 } catch (error) { 331 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 332 } 333 }) 334 Web({ src: 'www.example.com', controller: this.controller }) 335 } 336 } 337} 338``` 339 340加载本地网页,加载本地资源文件有三种方式。 341 3421.$rawfile方式。 343```ts 344// xxx.ets 345import { webview } from '@kit.ArkWeb'; 346import { BusinessError } from '@kit.BasicServicesKit'; 347 348@Entry 349@Component 350struct WebComponent { 351 controller: webview.WebviewController = new webview.WebviewController(); 352 353 build() { 354 Column() { 355 Button('loadUrl') 356 .onClick(() => { 357 try { 358 // 通过$rawfile加载本地资源文件。 359 this.controller.loadUrl($rawfile('index.html')); 360 } catch (error) { 361 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 362 } 363 }) 364 Web({ src: 'www.example.com', controller: this.controller }) 365 } 366 } 367} 368``` 369 3702.resources协议,适用Webview加载带有"#"路由的链接。 371```ts 372// xxx.ets 373import { webview } from '@kit.ArkWeb'; 374import { BusinessError } from '@kit.BasicServicesKit'; 375 376@Entry 377@Component 378struct WebComponent { 379 controller: webview.WebviewController = new webview.WebviewController(); 380 381 build() { 382 Column() { 383 Button('loadUrl') 384 .onClick(() => { 385 try { 386 // 通过resource协议加载本地资源文件。 387 this.controller.loadUrl("resource://rawfile/index.html"); 388 } catch (error) { 389 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 390 } 391 }) 392 Web({ src: 'www.example.com', controller: this.controller }) 393 } 394 } 395} 396``` 397 3983.通过沙箱路径加载本地文件,可以参考[web](../../web/web-page-loading-with-web-components.md#加载本地页面)加载沙箱路径的示例代码。 399 400加载的html文件。 401```html 402<!-- index.html --> 403<!DOCTYPE html> 404<html> 405 <body> 406 <p>Hello World</p> 407 </body> 408</html> 409``` 410 411## loadData 412 413loadData(data: string, mimeType: string, encoding: string, baseUrl?: string, historyUrl?: string): void 414 415加载指定的数据。 416 417baseUrl与historyUrl同时为空的情况下: 418 419encoding如果为非base64(包括空值),则假定数据对安全URL字符范围内的八位字节使用ASCII编码,对该范围外的八位字节使用URL的标准%xx十六进制编码。 420 421data数据必须使用base64编码或将内容中的任何#字符编码为%23。否则#将被视为内容的结尾而剩余的文本将被用作文档片段标识符。 422 423> **说明:** 424> 425> - 若加载本地图片,可以给baseUrl或historyUrl任一参数赋值空格,详情请参考示例代码。 426> 427> - 加载本地图片场景,baseUrl和historyUrl不能同时为空,否则图片无法成功加载。 428> 429> - 若html中的富文本中带有注入#等特殊字符,建议将baseUrl和historyUrl两个参数的值设置为"空格"。 430> 431> - 加载文字场景,需主动设置`<meta name="viewport" content="width=device-width, initial-scale=1.0" charset="utf-8">`避免文本字体大小不一致。 432 433**系统能力:** SystemCapability.Web.Webview.Core 434 435**参数:** 436 437| 参数名 | 类型 | 必填 | 说明 | 438| ---------- | ------ | ---- | ------------------------------------------------------------ | 439| data | string | 是 | 按照"base64"或者"URL"编码后的一段字符串。 | 440| mimeType | string | 是 | 媒体类型(MIME)。 | 441| encoding | string | 是 | 编码类型,具体为"base64"或者"URL"编码。 | 442| baseUrl | string | 否 | 指定的一个URL路径("http"/"https"/"data"协议),并由Web组件赋值给`window.origin`。当加载大量html文件时,需设置为"data"。 | 443| historyUrl | string | 否 | 用作历史记录所使用的URL。非空时,历史记录以此URL进行管理。当baseUrl为空时,此属性无效。 | 444 445**错误码:** 446 447以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 448 449| 错误码ID | 错误信息 | 450| -------- | ------------------------------------------------------------ | 451| 17100001 | Init error. The WebviewController must be associated with a Web component. | 452| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 453 454**示例:** 455 456baseUrl与historyUrl同时为空。 457```ts 458// xxx.ets 459import { webview } from '@kit.ArkWeb'; 460import { BusinessError } from '@kit.BasicServicesKit'; 461 462@Entry 463@Component 464struct WebComponent { 465 controller: webview.WebviewController = new webview.WebviewController(); 466 467 build() { 468 Column() { 469 Button('loadData') 470 .onClick(() => { 471 try { 472 this.controller.loadData( 473 "<html><body bgcolor=\"white\">Source:<pre>source</pre></body></html>", 474 "text/html", 475 // UTF-8为charset。 476 "UTF-8" 477 ); 478 } catch (error) { 479 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 480 } 481 }) 482 Web({ src: 'www.example.com', controller: this.controller }) 483 } 484 } 485} 486``` 487 488```ts 489// xxx.ets 490import { webview } from '@kit.ArkWeb'; 491import { BusinessError } from '@kit.BasicServicesKit'; 492 493@Entry 494@Component 495struct WebComponent { 496 controller: webview.WebviewController = new webview.WebviewController(); 497 498 build() { 499 Column() { 500 Button('loadData') 501 .onClick(() => { 502 try { 503 this.controller.loadData( 504 // Coding tests通过base64编码后的字符串。 505 "Q29kaW5nIHRlc3Rz", 506 "text/html", 507 "base64" 508 ); 509 } catch (error) { 510 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 511 } 512 }) 513 Web({ src: 'www.example.com', controller: this.controller }) 514 } 515 } 516} 517``` 518 519指定baseURL。 520```ts 521// xxx.ets 522import { webview } from '@kit.ArkWeb'; 523import { BusinessError } from '@kit.BasicServicesKit'; 524 525@Entry 526@Component 527struct WebComponent { 528 controller: webview.WebviewController = new webview.WebviewController(); 529 530 build() { 531 Column() { 532 Button('loadData') 533 .onClick(() => { 534 try { 535 this.controller.loadData( 536 "<img src=aa/bb.jpg>", // 会尝试从"https://xxx.com/" + "aa/bb.jpg"加载该图片 537 "text/html", 538 "UTF-8", 539 "https://xxx.com/", 540 "about:blank" 541 ); 542 } catch (error) { 543 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 544 } 545 }) 546 Web({ src: 'www.example.com', controller: this.controller }) 547 } 548 } 549} 550``` 551 552加载本地资源。 553```ts 554// xxx.ets 555import { webview } from '@kit.ArkWeb'; 556import { BusinessError } from '@kit.BasicServicesKit'; 557 558@Entry 559@Component 560struct WebComponent { 561 controller: webview.WebviewController = new webview.WebviewController(); 562 updataContent: string = '<body><div><image src="resource://rawfile/xxx.png" alt="image -- end" width="500" height="250"></image></div></body>' 563 564 build() { 565 Column() { 566 Button('loadData') 567 .onClick(() => { 568 try { 569 // UTF-8为charset。 570 this.controller.loadData(this.updataContent, "text/html", "UTF-8", " ", " "); 571 } catch (error) { 572 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 573 } 574 }) 575 Web({ src: 'www.example.com', controller: this.controller }) 576 } 577 } 578} 579``` 580 581加载沙箱图片。 582```ts 583// xxx.ets 584import { webview } from '@kit.ArkWeb'; 585import { BusinessError } from '@kit.BasicServicesKit'; 586 587@Entry 588@Component 589struct WebComponent { 590 controller: webview.WebviewController = new webview.WebviewController(); 591 592 build() { 593 Column() { 594 Button('loadData') 595 .onClick(() => { 596 try { 597 this.controller.loadData( 598 "<img src=bb.jpg>", // 尝试从"file:///xxx/" + "bb.jpg"加载该图片。 599 "text/html", 600 "UTF-8", 601 // 加载本地应用沙箱内的图片路径,请将路径改为实际使用的沙箱路径。 602 "file:///data/storage/el2/base/haps/entry/files/data/.cache_dir/", 603 "" 604 ); 605 } catch (error) { 606 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 607 } 608 }) 609 Web({ src: 'www.example.com', controller: this.controller }) 610 .fileAccess(true) // 为了加载应用沙箱内的图片,需要启用文件访问功能。 611 } 612 } 613} 614``` 615 616## accessForward 617 618accessForward(): boolean 619 620当前页面是否可前进,即当前页面是否有前进历史记录。 621 622可以结合使用[getBackForwardEntries](#getbackforwardentries)来获取当前WebView的历史信息列表,以及使用[accessStep](#accessstep)来判断是否可以按照给定的步数前进或后退。 623 624**系统能力:** SystemCapability.Web.Webview.Core 625 626**返回值:** 627 628| 类型 | 说明 | 629| ------- | --------------------------------- | 630| boolean | 可以前进返回true,否则返回false。 | 631 632**错误码:** 633 634以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 635 636| 错误码ID | 错误信息 | 637| -------- | ------------------------------------------------------------ | 638| 17100001 | Init error. The WebviewController must be associated with a Web component. | 639 640**示例:** 641 642```ts 643// xxx.ets 644import { webview } from '@kit.ArkWeb'; 645import { BusinessError } from '@kit.BasicServicesKit'; 646 647@Entry 648@Component 649struct WebComponent { 650 controller: webview.WebviewController = new webview.WebviewController(); 651 652 build() { 653 Column() { 654 Button('accessForward') 655 .onClick(() => { 656 try { 657 let result = this.controller.accessForward(); 658 console.info('result:' + result); 659 } catch (error) { 660 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 661 } 662 }) 663 Web({ src: 'www.example.com', controller: this.controller }) 664 } 665 } 666} 667``` 668 669## forward 670 671forward(): void 672 673按照历史栈,前进一个页面。一般结合accessForward一起使用。 674 675**系统能力:** SystemCapability.Web.Webview.Core 676 677**错误码:** 678 679以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 680 681| 错误码ID | 错误信息 | 682| -------- | ------------------------------------------------------------ | 683| 17100001 | Init error. The WebviewController must be associated with a Web component. | 684 685**示例:** 686 687```ts 688// xxx.ets 689import { webview } from '@kit.ArkWeb'; 690import { BusinessError } from '@kit.BasicServicesKit'; 691 692@Entry 693@Component 694struct WebComponent { 695 controller: webview.WebviewController = new webview.WebviewController(); 696 697 build() { 698 Column() { 699 Button('forward') 700 .onClick(() => { 701 try { 702 this.controller.forward(); 703 } catch (error) { 704 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 705 } 706 }) 707 Web({ src: 'www.example.com', controller: this.controller }) 708 } 709 } 710} 711``` 712 713## accessBackward 714 715accessBackward(): boolean 716 717当前页面是否可后退,即当前页面是否有返回历史记录。 718 719可以结合使用[getBackForwardEntries](#getbackforwardentries)来获取当前WebView的历史信息列表,以及使用[accessStep](#accessstep)来判断是否可以按照给定的步数前进或后退。 720 721> **说明:** 722> 723> 在Web组件首次加载过程中调用[setCustomUserAgent](#setcustomuseragent10),可能会导致在当前存在多个历史节点的情况下,获取的accessBackward实际为false,即没有后退节点。建议先调用setCustomUserAgent方法设置UserAgent,再通过loadUrl加载具体页面。 724> 725> 该现象是由于在Web组件首次加载时,调用[setCustomUserAgent](#setcustomuseragent10)会导致组件重新加载并保持初始历史节点的状态。随后新增的节点将替换初始历史节点,不会生成新的历史节点,导致accessBackward为false。 726 727**系统能力:** SystemCapability.Web.Webview.Core 728 729**返回值:** 730 731| 类型 | 说明 | 732| ------- | -------------------------------- | 733| boolean | 当前页面可以后退返回true,否则返回false。 | 734 735**错误码:** 736 737以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 738 739| 错误码ID | 错误信息 | 740| -------- | ------------------------------------------------------------ | 741| 17100001 | Init error. The WebviewController must be associated with a Web component. | 742 743**示例:** 744 745```ts 746// xxx.ets 747import { webview } from '@kit.ArkWeb'; 748import { BusinessError } from '@kit.BasicServicesKit'; 749 750@Entry 751@Component 752struct WebComponent { 753 controller: webview.WebviewController = new webview.WebviewController(); 754 755 build() { 756 Column() { 757 Button('accessBackward') 758 .onClick(() => { 759 try { 760 let result = this.controller.accessBackward(); 761 console.info('result:' + result); 762 } catch (error) { 763 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 764 } 765 }) 766 Web({ src: 'www.example.com', controller: this.controller }) 767 } 768 } 769} 770``` 771 772## backward 773 774backward(): void 775 776按照历史栈,后退一个页面。一般结合[accessBackward](#accessbackward)一起使用。 777 778**系统能力:** SystemCapability.Web.Webview.Core 779 780**错误码:** 781 782以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 783 784| 错误码ID | 错误信息 | 785| -------- | ------------------------------------------------------------ | 786| 17100001 | Init error. The WebviewController must be associated with a Web component. | 787 788**示例:** 789 790```ts 791// xxx.ets 792import { webview } from '@kit.ArkWeb'; 793import { BusinessError } from '@kit.BasicServicesKit'; 794 795@Entry 796@Component 797struct WebComponent { 798 controller: webview.WebviewController = new webview.WebviewController(); 799 800 build() { 801 Column() { 802 Button('backward') 803 .onClick(() => { 804 try { 805 this.controller.backward(); 806 } catch (error) { 807 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 808 } 809 }) 810 Web({ src: 'www.example.com', controller: this.controller }) 811 } 812 } 813} 814``` 815 816## onActive 817 818onActive(): void 819 820调用此接口通知Web组件进入前台激活状态。 821<br />激活状态是应用与用户互动的状态。应用会保持这种状态,直到发生某些事件(例如收到来电或设备屏幕关闭)时将焦点从应用移开。 822 823**系统能力:** SystemCapability.Web.Webview.Core 824 825**错误码:** 826 827以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 828 829| 错误码ID | 错误信息 | 830| -------- | ------------------------------------------------------------ | 831| 17100001 | Init error. The WebviewController must be associated with a Web component. | 832 833**示例:** 834 835```ts 836// xxx.ets 837import { webview } from '@kit.ArkWeb'; 838import { BusinessError } from '@kit.BasicServicesKit'; 839 840@Entry 841@Component 842struct WebComponent { 843 controller: webview.WebviewController = new webview.WebviewController(); 844 845 build() { 846 Column() { 847 Button('onActive') 848 .onClick(() => { 849 try { 850 this.controller.onActive(); 851 } catch (error) { 852 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 853 } 854 }) 855 Web({ src: 'www.example.com', controller: this.controller }) 856 } 857 } 858} 859``` 860 861## onInactive 862 863onInactive(): void 864 865调用此接口通知Web组件进入未激活状态。开发者可以在此回调中实现应用失去焦点时应表现的恰当行为。 866 867此状态下会尽可能的暂停任何可以安全暂停的内容,例如动画和地理位置。但不会暂停JavaScript,要全局暂停JavaScript,请使用[pauseAllTimers](#pausealltimers12)。要重新激活Web组件,请调用[onActive](#onactive)。 868 869**系统能力:** SystemCapability.Web.Webview.Core 870 871**错误码:** 872 873以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 874 875| 错误码ID | 错误信息 | 876| -------- | ------------------------------------------------------------ | 877| 17100001 | Init error. The WebviewController must be associated with a Web component. | 878 879**示例:** 880 881```ts 882// xxx.ets 883import { webview } from '@kit.ArkWeb'; 884import { BusinessError } from '@kit.BasicServicesKit'; 885 886@Entry 887@Component 888struct WebComponent { 889 controller: webview.WebviewController = new webview.WebviewController(); 890 891 build() { 892 Column() { 893 Button('onInactive') 894 .onClick(() => { 895 try { 896 this.controller.onInactive(); 897 } catch (error) { 898 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 899 } 900 }) 901 Web({ src: 'www.example.com', controller: this.controller }) 902 } 903 } 904} 905``` 906 907## refresh 908 909refresh(): void 910 911调用此接口通知Web组件刷新网页。 912 913**系统能力:** SystemCapability.Web.Webview.Core 914 915**错误码:** 916 917以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 918 919| 错误码ID | 错误信息 | 920| -------- | ------------------------------------------------------------ | 921| 17100001 | Init error. The WebviewController must be associated with a Web component. | 922 923**示例:** 924 925```ts 926// xxx.ets 927import { webview } from '@kit.ArkWeb'; 928import { BusinessError } from '@kit.BasicServicesKit'; 929 930@Entry 931@Component 932struct WebComponent { 933 controller: webview.WebviewController = new webview.WebviewController(); 934 935 build() { 936 Column() { 937 Button('refresh') 938 .onClick(() => { 939 try { 940 this.controller.refresh(); 941 } catch (error) { 942 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 943 } 944 }) 945 Web({ src: 'www.example.com', controller: this.controller }) 946 } 947 } 948} 949``` 950 951## accessStep 952 953accessStep(step: number): boolean 954 955当前页面是否可前进或者后退给定的step步。 956 957**系统能力:** SystemCapability.Web.Webview.Core 958 959**参数:** 960 961| 参数名 | 类型 | 必填 | 说明 | 962| ------ | -------- | ---- | ------------------------------------------ | 963| step | number | 是 | 要跳转的步数,正数代表前进,负数代表后退。 | 964 965**返回值:** 966 967| 类型 | 说明 | 968| ------- | ------------------ | 969| boolean | 页面是否前进或后退。<br>返回true表示可以前进或者后退,返回false表示不可以前进或后退。 | 970 971**错误码:** 972 973以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 974 975| 错误码ID | 错误信息 | 976| -------- | ------------------------------------------------------------ | 977| 17100001 | Init error. The WebviewController must be associated with a Web component. | 978| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 979 980**示例:** 981 982```ts 983// xxx.ets 984import { webview } from '@kit.ArkWeb'; 985import { BusinessError } from '@kit.BasicServicesKit'; 986 987@Entry 988@Component 989struct WebComponent { 990 controller: webview.WebviewController = new webview.WebviewController(); 991 @State steps: number = 2; 992 993 build() { 994 Column() { 995 Button('accessStep') 996 .onClick(() => { 997 try { 998 let result = this.controller.accessStep(this.steps); 999 console.info('result:' + result); 1000 } catch (error) { 1001 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1002 } 1003 }) 1004 Web({ src: 'www.example.com', controller: this.controller }) 1005 } 1006 } 1007} 1008``` 1009 1010## clearHistory 1011 1012clearHistory(): void 1013 1014删除所有前进后退记录,不建议在onErrorReceive与onPageBegin中调用clearHistory,会造成异常退出。 1015 1016**系统能力:** SystemCapability.Web.Webview.Core 1017 1018**错误码:** 1019 1020以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 1021 1022| 错误码ID | 错误信息 | 1023| -------- | ------------------------------------------------------------ | 1024| 17100001 | Init error. The WebviewController must be associated with a Web component. | 1025 1026**示例:** 1027 1028```ts 1029// xxx.ets 1030import { webview } from '@kit.ArkWeb'; 1031import { BusinessError } from '@kit.BasicServicesKit'; 1032 1033@Entry 1034@Component 1035struct WebComponent { 1036 controller: webview.WebviewController = new webview.WebviewController(); 1037 1038 build() { 1039 Column() { 1040 Button('clearHistory') 1041 .onClick(() => { 1042 try { 1043 this.controller.clearHistory(); 1044 } catch (error) { 1045 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1046 } 1047 }) 1048 Web({ src: 'www.example.com', controller: this.controller }) 1049 } 1050 } 1051} 1052``` 1053 1054## registerJavaScriptProxy 1055 1056registerJavaScriptProxy(object: object, name: string, methodList: Array\<string>, asyncMethodList?: Array\<string>, permission?: string): void 1057 1058registerJavaScriptProxy提供了应用与Web组件加载的网页之间强大的交互能力。 1059<br>注入JavaScript对象到window对象中,并在window对象中调用该对象的方法。注册后,须调用[refresh](#refresh)接口生效。 1060<br>示例请参考[前端页面调用应用侧函数](../../web/web-in-page-app-function-invoking.md)。 1061 1062> **说明:** 1063> 1064> - registerJavaScriptProxy需要和deleteJavaScriptRegister接口配合使用,防止内存泄漏。 1065> - 请尽可能只在可信的URL及安全通信HTTPS场景下进行registerJavaScriptProxy注册。在非可信的Web组件中注入JavaScript对象,可能会导致应用被恶意攻击。 1066> - 在注册registerJavaScriptProxy后,应用会将JavaScript对象暴露给所有的页面frames。 1067> - 同一方法在同步与异步列表中重复注册,将默认异步调用。 1068> - 同步函数列表和异步函数列表不可同时为空,否则此次调用接口注册失败。 1069> - 异步的作用在于:H5线程将异步JavaScript任务提交给ETS主线程后,无需等待任务执行完成并返回结果,H5线程即可继续执行后续任务。这在执行耗时较长的JavaScript任务或ETS线程较为拥堵的情况下,可以有效减少H5线程因JavaScript任务而被阻塞的情况。然而,异步JavaScript任务无法返回值,且任务执行的顺序无法保证,因此需要根据具体情境判断是否使用同步或异步方式。 1070 1071**系统能力:** SystemCapability.Web.Webview.Core 1072 1073**参数:** 1074 1075| 参数名 | 类型 | 必填 | 说明 | 1076| ---------- | -------------- | ---- | ------------------------------------------------------------ | 1077| object | object | 是 | 参与注册的应用侧JavaScript对象。可以单独声明方法和属性,但无法同时进行注册与使用。对象只包含属性时,H5可以访问对象中的属性。对象只包含方法时,H5可以访问对象中的方法。<br>1. 方法的参数和返回类型可以为string,number,boolean。<br>2. 方法的参数和返回类型支持Dictionary,Array,最多嵌套10层,每层1w个数据。<br>3. 方法的参数和返回类型支持Object,需要在Object里添加属性methodNameListForJsProxy:[fun1, fun2],fun1和fun2为可被调用的方法。<br>4. 方法的参数支持Function,Promise,它们的Callback不能有返回值。<br>5. 方法的返回类型支持Promise,Promise的Callback不能有返回值。 | 1078| name | string | 是 | 注册对象的名称,与window中调用的对象名一致。注册后window对象可以通过此名字访问应用侧JavaScript对象。 | 1079| methodList | Array\<string> | 是 | 参与注册的应用侧JavaScript对象的同步方法。 | 1080| asyncMethodList<sup>12+</sup> | Array\<string> | 否 | 参与注册的应用侧JavaScript对象的异步方法,默认为空。异步方法无法获取返回值。 | 1081| permission<sup>12+</sup> | string | 否 | JSON字符串,默认为空,通过该字符串配置JSBridge的权限管控,可以定义object和method级别的URL白名单。<br>1. scheme(协议)和host(域名)参数不可为空,且host不支持通配符,只能填写完整的host。<br>2. 可以仅配置object级别的白名单,该白名单对所有JSBridge方法生效。<br>3. 若JSBridge方法A设置了method级别的白名单,那么方法A最终的白名单是object级别白名单与method级别白名单的交集。| 1082 1083**错误码:** 1084 1085以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 1086 1087| 错误码ID | 错误信息 | 1088| -------- | ------------------------------------------------------------ | 1089| 17100001 | Init error. The WebviewController must be associated with a Web component. | 1090| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 1091 1092**示例:** 1093 1094```ts 1095// xxx.ets 1096import { webview } from '@kit.ArkWeb'; 1097import { BusinessError } from '@kit.BasicServicesKit'; 1098 1099class TestObj { 1100 constructor() { 1101 } 1102 1103 test(testStr: string): string { 1104 console.info('Web Component str' + testStr); 1105 return testStr; 1106 } 1107 1108 toString(): void { 1109 console.info('Web Component toString'); 1110 } 1111 1112 testNumber(testNum: number): number { 1113 console.info('Web Component number' + testNum); 1114 return testNum; 1115 } 1116 1117 asyncTestBool(testBol: boolean): void { 1118 console.info('Web Component boolean' + testBol); 1119 } 1120} 1121 1122class WebObj { 1123 constructor() { 1124 } 1125 1126 webTest(): string { 1127 console.info('Web test'); 1128 return "Web test"; 1129 } 1130 1131 webString(): void { 1132 console.info('Web test toString'); 1133 } 1134} 1135 1136class AsyncObj { 1137 constructor() { 1138 } 1139 1140 asyncTest(): void { 1141 console.info('Async test'); 1142 } 1143 1144 asyncString(testStr: string): void { 1145 console.info('Web async string' + testStr); 1146 } 1147} 1148 1149@Entry 1150@Component 1151struct Index { 1152 controller: webview.WebviewController = new webview.WebviewController(); 1153 @State testObjtest: TestObj = new TestObj(); 1154 @State webTestObj: WebObj = new WebObj(); 1155 @State asyncTestObj: AsyncObj = new AsyncObj(); 1156 1157 build() { 1158 Column() { 1159 Button('refresh') 1160 .onClick(() => { 1161 try { 1162 this.controller.refresh(); 1163 } catch (error) { 1164 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1165 } 1166 }) 1167 Button('Register JavaScript To Window') 1168 .onClick(() => { 1169 try { 1170 // 同时注册同步和异步函数 1171 this.controller.registerJavaScriptProxy(this.testObjtest, "objName", ["test", "toString", "testNumber"], ["asyncTestBool"]); 1172 // 仅注册同步函数 1173 this.controller.registerJavaScriptProxy(this.webTestObj, "objTestName", ["webTest", "webString"]); 1174 // 仅注册异步函数 1175 this.controller.registerJavaScriptProxy(this.asyncTestObj, "objAsyncName", [], ["asyncTest", "asyncString"]); 1176 } catch (error) { 1177 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1178 } 1179 }) 1180 Button('deleteJavaScriptRegister') 1181 .onClick(() => { 1182 try { 1183 this.controller.deleteJavaScriptRegister("objName"); 1184 this.controller.deleteJavaScriptRegister("objTestName"); 1185 this.controller.deleteJavaScriptRegister("objAsyncName"); 1186 } catch (error) { 1187 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1188 } 1189 }) 1190 Web({ src: $rawfile('index.html'), controller: this.controller }) 1191 .javaScriptAccess(true) 1192 } 1193 } 1194} 1195``` 1196 1197加载的html文件。 1198```html 1199<!-- index.html --> 1200<!DOCTYPE html> 1201<html> 1202 <head> 1203 <meta charset="utf-8"> 1204 </head> 1205 <body> 1206 <button type="button" onclick="htmlTest()">Click Me!</button> 1207 <p id="demo"></p> 1208 <p id="webDemo"></p> 1209 <p id="asyncDemo"></p> 1210 <script type="text/javascript"> 1211 function htmlTest() { 1212 // This function call expects to return "ArkUI Web Component" 1213 let str=objName.test("webtest data"); 1214 objName.testNumber(1); 1215 objName.asyncTestBool(true); 1216 document.getElementById("demo").innerHTML=str; 1217 console.info('objName.test result:'+ str) 1218 1219 // This function call expects to return "Web test" 1220 let webStr = objTestName.webTest(); 1221 document.getElementById("webDemo").innerHTML=webStr; 1222 console.info('objTestName.webTest result:'+ webStr) 1223 1224 objAsyncName.asyncTest(); 1225 objAsyncName.asyncString("async test data"); 1226 } 1227 </script> 1228 </body> 1229</html> 1230``` 1231更多示例,请参考[前端页面调用应用侧函数](../../web/web-in-page-app-function-invoking.md)。 1232 1233## runJavaScript 1234 1235runJavaScript(script: string, callback : AsyncCallback\<string>): void 1236 1237在当前显示页面的上下文中异步执行JavaScript脚本,脚本执行的结果将通过异步回调方式返回。此方法必须在用户界面(UI)线程上使用 ,并且回调也将在用户界面(UI)线程上调用。 1238 1239> **说明:** 1240> 1241> - 跨导航操作(如loadUrl)时,JavaScript状态将不再保留。例如,调用loadUrl前定义的全局变量和函数在加载的页面中将不存在。 1242> - 建议应用程序使用registerJavaScriptProxy来确保JavaScript状态能够在页面导航间保持。 1243> - 目前不支持传递对象,支持传递结构体。 1244> - 执行异步方法无法获取返回值,需要根据具体情境判断是否使用同步或异步方式。 1245> - 前端页面传到Native的string数据类型会被视为json格式的数据,需要调用JSON.parse反序列化。 1246 1247**系统能力:** SystemCapability.Web.Webview.Core 1248 1249**参数:** 1250 1251| 参数名 | 类型 | 必填 | 说明 | 1252| -------- | -------------------- | ---- | ---------------------------- | 1253| script | string | 是 | JavaScript脚本。 | 1254| callback | AsyncCallback\<string> | 是 | 回调执行JavaScript脚本结果。JavaScript脚本若执行失败或无返回值时,返回null。 | 1255 1256**错误码:** 1257 1258以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 1259 1260| 错误码ID | 错误信息 | 1261| -------- | ------------------------------------------------------------ | 1262| 17100001 | Init error. The WebviewController must be associated with a Web component. | 1263| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 1264 1265**示例:** 1266 1267```ts 1268import { webview } from '@kit.ArkWeb'; 1269import { BusinessError } from '@kit.BasicServicesKit'; 1270 1271@Entry 1272@Component 1273struct WebComponent { 1274 controller: webview.WebviewController = new webview.WebviewController(); 1275 @State webResult: string = ''; 1276 1277 build() { 1278 Column() { 1279 Text(this.webResult).fontSize(20) 1280 Web({ src: $rawfile('index.html'), controller: this.controller }) 1281 .javaScriptAccess(true) 1282 .onPageEnd(e => { 1283 try { 1284 this.controller.runJavaScript( 1285 'test()', 1286 (error, result) => { 1287 if (error) { 1288 console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1289 return; 1290 } 1291 if (result) { 1292 this.webResult = result; 1293 console.info(`The test() return value is: ${result}`); 1294 } 1295 }); 1296 if (e) { 1297 console.info('url: ', e.url); 1298 } 1299 } catch (error) { 1300 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1301 } 1302 }) 1303 } 1304 } 1305} 1306``` 1307 1308加载的html文件。 1309```html 1310<!-- index.html --> 1311<!DOCTYPE html> 1312<html> 1313 <head> 1314 <meta charset="utf-8"> 1315 </head> 1316 <body> 1317 Hello world! 1318 <script type="text/javascript"> 1319 function test() { 1320 console.info('Ark WebComponent') 1321 return "This value is from index.html" 1322 } 1323 </script> 1324 </body> 1325</html> 1326``` 1327 1328## runJavaScript 1329 1330runJavaScript(script: string): Promise\<string> 1331 1332在当前显示页面的上下文中异步执行JavaScript脚本,脚本执行的结果将通过Promise方式返回。此方法必须在用户界面(UI)线程上使用 ,并且回调也将在用户界面(UI)线程上调用。 1333 1334> **说明:** 1335> 1336> - 跨导航操作(如loadUrl)时,JavaScript状态 将不再保留,例如,调用loadUrl前定义的全局变量和函数在加载的页面中将不存在。 1337> - 建议应用程序使用registerJavaScriptProxy来确保JavaScript状态能够在页面导航间保持。 1338> - 目前不支持传递对象,支持传递结构体。 1339> - 执行异步方法无法获取返回值,需要根据具体情境判断是否使用同步或异步方式。 1340> - 前端页面传到Native的string数据类型会被视为json格式的数据,需要调用JSON.parse反序列化。 1341 1342**系统能力:** SystemCapability.Web.Webview.Core 1343 1344**参数:** 1345 1346| 参数名 | 类型 | 必填 | 说明 | 1347| ------ | -------- | ---- | ---------------- | 1348| script | string | 是 | JavaScript脚本。 | 1349 1350**返回值:** 1351 1352| 类型 | 说明 | 1353| --------------- | --------------------------------------------------- | 1354| Promise\<string> | Promise实例,返回脚本执行的结果,执行失败返回null。 | 1355 1356**错误码:** 1357 1358以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 1359 1360| 错误码ID | 错误信息 | 1361| -------- | ------------------------------------------------------------ | 1362| 17100001 | Init error. The WebviewController must be associated with a Web component. | 1363| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 1364 1365**示例:** 1366 1367```ts 1368// xxx.ets 1369import { webview } from '@kit.ArkWeb'; 1370import { BusinessError } from '@kit.BasicServicesKit'; 1371 1372@Entry 1373@Component 1374struct WebComponent { 1375 controller: webview.WebviewController = new webview.WebviewController(); 1376 1377 build() { 1378 Column() { 1379 Web({ src: $rawfile('index.html'), controller: this.controller }) 1380 .javaScriptAccess(true) 1381 .onPageEnd(e => { 1382 try { 1383 this.controller.runJavaScript('test()') 1384 .then((result) => { 1385 console.info('result: ' + result); 1386 }) 1387 .catch((error: BusinessError) => { 1388 console.error("error: " + error); 1389 }) 1390 if (e) { 1391 console.info('url: ', e.url); 1392 } 1393 } catch (error) { 1394 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1395 } 1396 }) 1397 } 1398 } 1399} 1400``` 1401 1402加载的html文件。 1403```html 1404<!-- index.html --> 1405<!DOCTYPE html> 1406<html> 1407 <head> 1408 <meta charset="utf-8"> 1409 </head> 1410 <body> 1411 Hello world! 1412 <script type="text/javascript"> 1413 function test() { 1414 console.info('Ark WebComponent') 1415 return "This value is from index.html" 1416 } 1417 </script> 1418 </body> 1419</html> 1420``` 1421 1422## runJavaScriptExt<sup>10+</sup> 1423 1424runJavaScriptExt(script: string | ArrayBuffer, callback : AsyncCallback\<JsMessageExt>): void 1425 1426异步执行JavaScript脚本,并通过回调方式返回脚本执行的结果。runJavaScriptExt需要在loadUrl完成后,比如onPageEnd中调用。 1427 1428> **说明:** 1429> 1430> - 前端页面传到Native的string数据类型会被视为json格式的数据,需要调用JSON.parse反序列化。 1431 1432**系统能力:** SystemCapability.Web.Webview.Core 1433 1434**参数:** 1435 1436| 参数名 | 类型 | 必填 | 说明 | 1437| -------- | -------------------- | ---- | ---------------------------- | 1438| script | string \| ArrayBuffer<sup>12+</sup> | 是 | JavaScript脚本。 | 1439| callback | AsyncCallback\<[JsMessageExt](./arkts-apis-webview-JsMessageExt.md)\> | 是 | 回调执行JavaScript脚本结果。 | 1440 1441**错误码:** 1442 1443以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 1444 1445| 错误码ID | 错误信息 | 1446| -------- | ------------------------------------------------------------ | 1447| 17100001 | Init error. The WebviewController must be associated with a Web component. | 1448| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 1449 1450**示例:** 1451 1452```ts 1453import { webview } from '@kit.ArkWeb'; 1454import { BusinessError } from '@kit.BasicServicesKit'; 1455 1456@Entry 1457@Component 1458struct WebComponent { 1459 controller: webview.WebviewController = new webview.WebviewController(); 1460 @State msg1: string = ''; 1461 @State msg2: string = ''; 1462 1463 build() { 1464 Column() { 1465 Text(this.msg1).fontSize(20) 1466 Text(this.msg2).fontSize(20) 1467 Web({ src: $rawfile('index.html'), controller: this.controller }) 1468 .javaScriptAccess(true) 1469 .onPageEnd(e => { 1470 try { 1471 this.controller.runJavaScriptExt( 1472 'test()', 1473 (error, result) => { 1474 if (error) { 1475 console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`) 1476 return; 1477 } 1478 if (result) { 1479 try { 1480 let type = result.getType(); 1481 switch (type) { 1482 case webview.JsMessageType.STRING: { 1483 this.msg1 = "result type:" + typeof (result.getString()); 1484 this.msg2 = "result getString:" + ((result.getString())); 1485 break; 1486 } 1487 case webview.JsMessageType.NUMBER: { 1488 this.msg1 = "result type:" + typeof (result.getNumber()); 1489 this.msg2 = "result getNumber:" + ((result.getNumber())); 1490 break; 1491 } 1492 case webview.JsMessageType.BOOLEAN: { 1493 this.msg1 = "result type:" + typeof (result.getBoolean()); 1494 this.msg2 = "result getBoolean:" + ((result.getBoolean())); 1495 break; 1496 } 1497 case webview.JsMessageType.ARRAY_BUFFER: { 1498 this.msg1 = "result type:" + typeof (result.getArrayBuffer()); 1499 this.msg2 = "result getArrayBuffer byteLength:" + ((result.getArrayBuffer().byteLength)); 1500 break; 1501 } 1502 case webview.JsMessageType.ARRAY: { 1503 this.msg1 = "result type:" + typeof (result.getArray()); 1504 this.msg2 = "result getArray:" + result.getArray(); 1505 break; 1506 } 1507 default: { 1508 this.msg1 = "default break, type:" + type; 1509 break; 1510 } 1511 } 1512 } 1513 catch (resError) { 1514 console.error(`ErrorCode: ${(resError as BusinessError).code}, Message: ${(resError as BusinessError).message}`); 1515 } 1516 } 1517 }); 1518 if (e) { 1519 console.info('url: ', e.url); 1520 } 1521 } catch (resError) { 1522 console.error(`ErrorCode: ${(resError as BusinessError).code}, Message: ${(resError as BusinessError).message}`); 1523 } 1524 }) 1525 } 1526 } 1527} 1528``` 1529 1530```ts 1531// 使用ArrayBuffer入参,从文件中获取JavaScript脚本数据。 1532import { webview } from '@kit.ArkWeb'; 1533import { BusinessError } from '@kit.BasicServicesKit'; 1534import { fileIo } from '@kit.CoreFileKit'; 1535import { common } from '@kit.AbilityKit'; 1536 1537@Entry 1538@Component 1539struct WebComponent { 1540 controller: webview.WebviewController = new webview.WebviewController(); 1541 @State msg1: string = '' 1542 @State msg2: string = '' 1543 1544 build() { 1545 Column() { 1546 Text(this.msg1).fontSize(20) 1547 Text(this.msg2).fontSize(20) 1548 Button('runJavaScriptExt') 1549 .onClick(() => { 1550 try { 1551 let uiContext : UIContext = this.getUIContext(); 1552 let context : Context | undefined = uiContext.getHostContext() as common.UIAbilityContext; 1553 let filePath = context!.filesDir + 'test.txt'; 1554 // 新建并打开文件。 1555 let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); 1556 // 写入一段内容至文件。 1557 fileIo.writeSync(file.fd, "test()"); 1558 // 从文件中读取内容。 1559 let arrayBuffer: ArrayBuffer = new ArrayBuffer(6); 1560 fileIo.readSync(file.fd, arrayBuffer, { offset: 0, length: arrayBuffer.byteLength }); 1561 // 关闭文件。 1562 fileIo.closeSync(file); 1563 this.controller.runJavaScriptExt( 1564 arrayBuffer, 1565 (error, result) => { 1566 if (error) { 1567 console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`) 1568 return; 1569 } 1570 if (result) { 1571 try { 1572 let type = result.getType(); 1573 switch (type) { 1574 case webview.JsMessageType.STRING: { 1575 this.msg1 = "result type:" + typeof (result.getString()); 1576 this.msg2 = "result getString:" + ((result.getString())); 1577 break; 1578 } 1579 case webview.JsMessageType.NUMBER: { 1580 this.msg1 = "result type:" + typeof (result.getNumber()); 1581 this.msg2 = "result getNumber:" + ((result.getNumber())); 1582 break; 1583 } 1584 case webview.JsMessageType.BOOLEAN: { 1585 this.msg1 = "result type:" + typeof (result.getBoolean()); 1586 this.msg2 = "result getBoolean:" + ((result.getBoolean())); 1587 break; 1588 } 1589 case webview.JsMessageType.ARRAY_BUFFER: { 1590 this.msg1 = "result type:" + typeof (result.getArrayBuffer()); 1591 this.msg2 = "result getArrayBuffer byteLength:" + ((result.getArrayBuffer().byteLength)); 1592 break; 1593 } 1594 case webview.JsMessageType.ARRAY: { 1595 this.msg1 = "result type:" + typeof (result.getArray()); 1596 this.msg2 = "result getArray:" + result.getArray(); 1597 break; 1598 } 1599 default: { 1600 this.msg1 = "default break, type:" + type; 1601 break; 1602 } 1603 } 1604 } 1605 catch (resError) { 1606 console.error(`ErrorCode: ${(resError as BusinessError).code}, Message: ${(resError as BusinessError).message}`); 1607 } 1608 } 1609 }); 1610 } catch (resError) { 1611 console.error(`ErrorCode: ${(resError as BusinessError).code}, Message: ${(resError as BusinessError).message}`); 1612 } 1613 }) 1614 Web({ src: $rawfile('index.html'), controller: this.controller }) 1615 .javaScriptAccess(true) 1616 } 1617 } 1618} 1619``` 1620 1621加载的html文件。 1622```html 1623<!-- index.html --> 1624<!DOCTYPE html> 1625<html lang="en-gb"> 1626<body> 1627<h1>run JavaScript Ext demo</h1> 1628</body> 1629<script type="text/javascript"> 1630function test() { 1631 return "hello, world"; 1632} 1633</script> 1634</html> 1635``` 1636 1637## runJavaScriptExt<sup>10+</sup> 1638 1639runJavaScriptExt(script: string | ArrayBuffer): Promise\<JsMessageExt> 1640 1641异步执行JavaScript脚本,并通过Promise方式返回脚本执行的结果。runJavaScriptExt需要在loadUrl完成后,比如onPageEnd中调用。 1642 1643> **说明:** 1644> 1645> - 前端页面传到Native的string数据类型会被视为json格式的数据,需要调用JSON.parse反序列化。 1646 1647**系统能力:** SystemCapability.Web.Webview.Core 1648 1649**参数:** 1650 1651| 参数名 | 类型 | 必填 | 说明 | 1652| ------ | -------- | ---- | ---------------- | 1653| script | string \| ArrayBuffer<sup>12+</sup> | 是 | JavaScript脚本。 | 1654 1655**返回值:** 1656 1657| 类型 | 说明 | 1658| --------------- | --------------------------------------------------- | 1659| Promise\<[JsMessageExt](./arkts-apis-webview-JsMessageExt.md)> | Promise实例,返回脚本执行的结果。 | 1660 1661**错误码:** 1662 1663以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 1664 1665| 错误码ID | 错误信息 | 1666| -------- | ------------------------------------------------------------ | 1667| 17100001 | Init error. The WebviewController must be associated with a Web component. | 1668| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 1669 1670**示例:** 1671 1672```ts 1673// xxx.ets 1674import { webview } from '@kit.ArkWeb'; 1675import { BusinessError } from '@kit.BasicServicesKit'; 1676 1677@Entry 1678@Component 1679struct WebComponent { 1680 controller: webview.WebviewController = new webview.WebviewController(); 1681 @State webResult: string = ''; 1682 @State msg1: string = ''; 1683 @State msg2: string = ''; 1684 1685 build() { 1686 Column() { 1687 Text(this.webResult).fontSize(20) 1688 Text(this.msg1).fontSize(20) 1689 Text(this.msg2).fontSize(20) 1690 Web({ src: $rawfile('index.html'), controller: this.controller }) 1691 .javaScriptAccess(true) 1692 .onPageEnd(() => { 1693 this.controller.runJavaScriptExt('test()') 1694 .then((result) => { 1695 try { 1696 let type = result.getType(); 1697 switch (type) { 1698 case webview.JsMessageType.STRING: { 1699 this.msg1 = "result type:" + typeof (result.getString()); 1700 this.msg2 = "result getString:" + ((result.getString())); 1701 break; 1702 } 1703 case webview.JsMessageType.NUMBER: { 1704 this.msg1 = "result type:" + typeof (result.getNumber()); 1705 this.msg2 = "result getNumber:" + ((result.getNumber())); 1706 break; 1707 } 1708 case webview.JsMessageType.BOOLEAN: { 1709 this.msg1 = "result type:" + typeof (result.getBoolean()); 1710 this.msg2 = "result getBoolean:" + ((result.getBoolean())); 1711 break; 1712 } 1713 case webview.JsMessageType.ARRAY_BUFFER: { 1714 this.msg1 = "result type:" + typeof (result.getArrayBuffer()); 1715 this.msg2 = "result getArrayBuffer byteLength:" + ((result.getArrayBuffer().byteLength)); 1716 break; 1717 } 1718 case webview.JsMessageType.ARRAY: { 1719 this.msg1 = "result type:" + typeof (result.getArray()); 1720 this.msg2 = "result getArray:" + result.getArray(); 1721 break; 1722 } 1723 default: { 1724 this.msg1 = "default break, type:" + type; 1725 break; 1726 } 1727 } 1728 } 1729 catch (resError) { 1730 console.error(`ErrorCode: ${(resError as BusinessError).code}, Message: ${(resError as BusinessError).message}`); 1731 } 1732 }).catch((error: BusinessError) => { 1733 console.error("error: " + error); 1734 }) 1735 }) 1736 } 1737 } 1738} 1739``` 1740 1741```ts 1742// 使用ArrayBuffer入参,从文件中获取JavaScript脚本数据。 1743import { webview } from '@kit.ArkWeb'; 1744import { BusinessError } from '@kit.BasicServicesKit'; 1745import { fileIo } from '@kit.CoreFileKit'; 1746import { common } from '@kit.AbilityKit'; 1747 1748@Entry 1749@Component 1750struct WebComponent { 1751 controller: webview.WebviewController = new webview.WebviewController(); 1752 @State msg1: string = ''; 1753 @State msg2: string = ''; 1754 1755 build() { 1756 Column() { 1757 Text(this.msg1).fontSize(20) 1758 Text(this.msg2).fontSize(20) 1759 Button('runJavaScriptExt') 1760 .onClick(() => { 1761 try { 1762 let uiContext : UIContext = this.getUIContext(); 1763 let context : Context | undefined = uiContext.getHostContext() as common.UIAbilityContext; 1764 let filePath = context!.filesDir + 'test.txt'; 1765 // 新建并打开文件。 1766 let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); 1767 // 写入一段内容至文件。 1768 fileIo.writeSync(file.fd, "test()"); 1769 // 从文件中读取内容。 1770 let arrayBuffer: ArrayBuffer = new ArrayBuffer(6); 1771 fileIo.readSync(file.fd, arrayBuffer, { offset: 0, length: arrayBuffer.byteLength }); 1772 // 关闭文件。 1773 fileIo.closeSync(file); 1774 this.controller.runJavaScriptExt(arrayBuffer) 1775 .then((result) => { 1776 try { 1777 let type = result.getType(); 1778 switch (type) { 1779 case webview.JsMessageType.STRING: { 1780 this.msg1 = "result type:" + typeof (result.getString()); 1781 this.msg2 = "result getString:" + ((result.getString())); 1782 break; 1783 } 1784 case webview.JsMessageType.NUMBER: { 1785 this.msg1 = "result type:" + typeof (result.getNumber()); 1786 this.msg2 = "result getNumber:" + ((result.getNumber())); 1787 break; 1788 } 1789 case webview.JsMessageType.BOOLEAN: { 1790 this.msg1 = "result type:" + typeof (result.getBoolean()); 1791 this.msg2 = "result getBoolean:" + ((result.getBoolean())); 1792 break; 1793 } 1794 case webview.JsMessageType.ARRAY_BUFFER: { 1795 this.msg1 = "result type:" + typeof (result.getArrayBuffer()); 1796 this.msg2 = "result getArrayBuffer byteLength:" + ((result.getArrayBuffer().byteLength)); 1797 break; 1798 } 1799 case webview.JsMessageType.ARRAY: { 1800 this.msg1 = "result type:" + typeof (result.getArray()); 1801 this.msg2 = "result getArray:" + result.getArray(); 1802 break; 1803 } 1804 default: { 1805 this.msg1 = "default break, type:" + type; 1806 break; 1807 } 1808 } 1809 } 1810 catch (resError) { 1811 console.error(`ErrorCode: ${(resError as BusinessError).code}, Message: ${(resError as BusinessError).message}`); 1812 } 1813 }) 1814 .catch((error: BusinessError) => { 1815 console.error("error: " + error); 1816 }) 1817 } catch (error) { 1818 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1819 } 1820 }) 1821 Web({ src: $rawfile('index.html'), controller: this.controller }) 1822 .javaScriptAccess(true) 1823 } 1824 } 1825} 1826``` 1827 1828加载的html文件。 1829```html 1830<!-- index.html --> 1831<!DOCTYPE html> 1832<html lang="en-gb"> 1833<body> 1834<h1>run JavaScript Ext demo</h1> 1835</body> 1836<script type="text/javascript"> 1837function test() { 1838 return "hello, world"; 1839} 1840</script> 1841</html> 1842``` 1843 1844## deleteJavaScriptRegister 1845 1846deleteJavaScriptRegister(name: string): void 1847 1848删除通过registerJavaScriptProxy注册到window上的指定name的应用侧JavaScript对象。删除后,须调用[refresh](#refresh)接口。 1849 1850**系统能力:** SystemCapability.Web.Webview.Core 1851 1852**参数:** 1853 1854| 参数名 | 类型 | 必填 | 说明 | 1855| ------ | -------- | ---- | ---- | 1856| name | string | 是 | 注册对象的名称,可在网页侧JavaScript中通过此名称调用应用侧JavaScript对象。 | 1857 1858**错误码:** 1859 1860以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 1861 1862| 错误码ID | 错误信息 | 1863| -------- | ------------------------------------------------------------ | 1864| 17100001 | Init error. The WebviewController must be associated with a Web component. | 1865| 17100008 | Failed to delete JavaScriptProxy because it does not exist. | 1866| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 1867 1868**示例:** 1869 1870```ts 1871// xxx.ets 1872import { webview } from '@kit.ArkWeb'; 1873import { BusinessError } from '@kit.BasicServicesKit'; 1874 1875class TestObj { 1876 constructor() { 1877 } 1878 1879 test(): string { 1880 return "ArkUI Web Component"; 1881 } 1882 1883 toString(): void { 1884 console.info('Web Component toString'); 1885 } 1886} 1887 1888@Entry 1889@Component 1890struct WebComponent { 1891 controller: webview.WebviewController = new webview.WebviewController(); 1892 @State testObjtest: TestObj = new TestObj(); 1893 @State name: string = 'objName'; 1894 build() { 1895 Column() { 1896 Button('refresh') 1897 .onClick(() => { 1898 try { 1899 this.controller.refresh(); 1900 } catch (error) { 1901 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1902 } 1903 }) 1904 Button('Register JavaScript To Window') 1905 .onClick(() => { 1906 try { 1907 this.controller.registerJavaScriptProxy(this.testObjtest, this.name, ["test", "toString"]); 1908 } catch (error) { 1909 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1910 } 1911 }) 1912 Button('deleteJavaScriptRegister') 1913 .onClick(() => { 1914 try { 1915 this.controller.deleteJavaScriptRegister(this.name); 1916 } catch (error) { 1917 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1918 } 1919 }) 1920 Web({ src: $rawfile('index.html'), controller: this.controller }) 1921 .javaScriptAccess(true) 1922 } 1923 } 1924} 1925``` 1926 1927加载的html文件。 1928```html 1929<!-- index.html --> 1930<!DOCTYPE html> 1931<html> 1932 <head> 1933 <meta charset="utf-8"> 1934 </head> 1935 <body> 1936 <button type="button" onclick="htmlTest()">Click Me!</button> 1937 <p id="demo"></p> 1938 <script type="text/javascript"> 1939 function htmlTest() { 1940 let str=objName.test(); 1941 document.getElementById("demo").innerHTML=str; 1942 console.info('objName.test result:'+ str) 1943 } 1944 </script> 1945 </body> 1946</html> 1947``` 1948 1949## zoom 1950 1951zoom(factor: number): void 1952 1953调整当前网页的缩放比例,[zoomAccess](arkts-basic-components-web-attributes.md#zoomaccess)需为true。 1954 1955**系统能力:** SystemCapability.Web.Webview.Core 1956 1957**参数:** 1958 1959| 参数名 | 类型 | 必填 | 说明 | 1960| ------ | -------- | ---- | ------------------------------------------------------------ | 1961| factor | number | 是 | 基于当前网页所需调整的相对缩放比例,入参要求大于0,当入参为1时为默认加载网页的缩放比例,入参小于1为缩小,入参大于1为放大。<br>取值范围:(0,100]。 | 1962 1963**错误码:** 1964 1965以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 1966 1967| 错误码ID | 错误信息 | 1968| -------- | ------------------------------------------------------------ | 1969| 17100001 | Init error. The WebviewController must be associated with a Web component. | 1970| 17100004 | Function not enabled. | 1971| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 1972 1973**示例:** 1974 1975```ts 1976// xxx.ets 1977import { webview } from '@kit.ArkWeb'; 1978import { BusinessError } from '@kit.BasicServicesKit'; 1979 1980@Entry 1981@Component 1982struct WebComponent { 1983 controller: webview.WebviewController = new webview.WebviewController(); 1984 @State factor: number = 2; 1985 1986 build() { 1987 Column() { 1988 Button('zoom') 1989 .onClick(() => { 1990 try { 1991 this.controller.zoom(this.factor); 1992 } catch (error) { 1993 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 1994 } 1995 }) 1996 Web({ src: 'www.example.com', controller: this.controller }) 1997 .zoomAccess(true) 1998 } 1999 } 2000} 2001``` 2002 2003## searchAllAsync 2004 2005searchAllAsync(searchString: string): void 2006 2007异步查找网页中所有匹配关键字'searchString'的内容并高亮,结果通过[onSearchResultReceive](./arkts-basic-components-web-events.md#onsearchresultreceive9)异步返回。 2008 2009**系统能力:** SystemCapability.Web.Webview.Core 2010 2011**参数:** 2012 2013| 参数名 | 类型 | 必填 | 说明 | 2014| ------------ | -------- | ---- | -------------- | 2015| searchString | string | 是 | 查找的关键字。 | 2016 2017**错误码:** 2018 2019以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2020 2021| 错误码ID | 错误信息 | 2022| -------- | ------------------------------------------------------------ | 2023| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2024| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 2025 2026**示例:** 2027 2028```ts 2029// xxx.ets 2030import { webview } from '@kit.ArkWeb'; 2031import { BusinessError } from '@kit.BasicServicesKit'; 2032 2033@Entry 2034@Component 2035struct WebComponent { 2036 controller: webview.WebviewController = new webview.WebviewController(); 2037 @State searchString: string = "Hello World"; 2038 2039 build() { 2040 Column() { 2041 Button('searchString') 2042 .onClick(() => { 2043 try { 2044 this.controller.searchAllAsync(this.searchString); 2045 } catch (error) { 2046 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2047 } 2048 }) 2049 Web({ src: $rawfile('index.html'), controller: this.controller }) 2050 .onSearchResultReceive(ret => { 2051 if (ret) { 2052 console.info("on search result receive:" + "[cur]" + ret.activeMatchOrdinal + 2053 "[total]" + ret.numberOfMatches + "[isDone]" + ret.isDoneCounting); 2054 } 2055 }) 2056 } 2057 } 2058} 2059``` 2060 2061加载的html文件。 2062```html 2063<!-- index.html --> 2064<!DOCTYPE html> 2065<html> 2066 <body> 2067 <p>Hello World Highlight Hello World</p> 2068 </body> 2069</html> 2070``` 2071 2072## clearMatches 2073 2074clearMatches(): void 2075 2076清除所有通过[searchAllAsync](#searchallasync)匹配到的高亮字符查找结果。 2077 2078**系统能力:** SystemCapability.Web.Webview.Core 2079 2080**错误码:** 2081 2082以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2083 2084| 错误码ID | 错误信息 | 2085| -------- | ------------------------------------------------------------ | 2086| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2087 2088**示例:** 2089 2090```ts 2091// xxx.ets 2092import { webview } from '@kit.ArkWeb'; 2093import { BusinessError } from '@kit.BasicServicesKit'; 2094 2095@Entry 2096@Component 2097struct WebComponent { 2098 controller: webview.WebviewController = new webview.WebviewController(); 2099 2100 build() { 2101 Column() { 2102 Button('clearMatches') 2103 .onClick(() => { 2104 try { 2105 this.controller.clearMatches(); 2106 } catch (error) { 2107 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2108 } 2109 }) 2110 Web({ src: $rawfile('index.html'), controller: this.controller }) 2111 } 2112 } 2113} 2114``` 2115 2116加载的html文件,请参考[searchAllAsync](#searchallasync)接口下加载的html文件。 2117 2118## searchNext 2119 2120searchNext(forward: boolean): void 2121 2122滚动到下一个匹配的查找结果并高亮。 2123 2124**系统能力:** SystemCapability.Web.Webview.Core 2125 2126**参数:** 2127 2128| 参数名 | 类型 | 必填 | 说明 | 2129| ------- | -------- | ---- | ---------------------- | 2130| forward | boolean | 是 | 从前向后或者逆向查找方式。<br>true表示从前向后查找,false表示从后向前查找。 | 2131 2132**错误码:** 2133 2134以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2135 2136| 错误码ID | 错误信息 | 2137| -------- | ------------------------------------------------------------ | 2138| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2139| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 2140 2141**示例:** 2142 2143```ts 2144// xxx.ets 2145import { webview } from '@kit.ArkWeb'; 2146import { BusinessError } from '@kit.BasicServicesKit'; 2147 2148@Entry 2149@Component 2150struct WebComponent { 2151 controller: webview.WebviewController = new webview.WebviewController(); 2152 2153 build() { 2154 Column() { 2155 Button('searchNext') 2156 .onClick(() => { 2157 try { 2158 this.controller.searchNext(true); 2159 } catch (error) { 2160 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2161 } 2162 }) 2163 Web({ src: $rawfile('index.html'), controller: this.controller }) 2164 } 2165 } 2166} 2167``` 2168 2169加载的html文件,请参考[searchAllAsync](#searchallasync)接口下加载的html文件。 2170 2171## clearSslCache 2172 2173clearSslCache(): void 2174 2175清除Web组件记录的SSL证书错误事件对应的用户操作行为。 2176 2177**系统能力:** SystemCapability.Web.Webview.Core 2178 2179**错误码:** 2180 2181以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2182 2183| 错误码ID | 错误信息 | 2184| -------- | ------------------------------------------------------------ | 2185| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2186 2187**示例:** 2188 2189```ts 2190// xxx.ets 2191import { webview } from '@kit.ArkWeb'; 2192import { BusinessError } from '@kit.BasicServicesKit'; 2193 2194@Entry 2195@Component 2196struct WebComponent { 2197 controller: webview.WebviewController = new webview.WebviewController(); 2198 2199 build() { 2200 Column() { 2201 Button('clearSslCache') 2202 .onClick(() => { 2203 try { 2204 this.controller.clearSslCache(); 2205 } catch (error) { 2206 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2207 } 2208 }) 2209 Web({ src: 'www.example.com', controller: this.controller }) 2210 } 2211 } 2212} 2213``` 2214 2215## clearClientAuthenticationCache 2216 2217clearClientAuthenticationCache(): void 2218 2219清除Web组件记录的客户端证书请求事件对应的用户操作行为。 2220 2221**系统能力:** SystemCapability.Web.Webview.Core 2222 2223**错误码:** 2224 2225以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2226 2227| 错误码ID | 错误信息 | 2228| -------- | ------------------------------------------------------------ | 2229| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2230 2231**示例:** 2232 2233```ts 2234// xxx.ets 2235import { webview } from '@kit.ArkWeb'; 2236import { BusinessError } from '@kit.BasicServicesKit'; 2237 2238@Entry 2239@Component 2240struct WebComponent { 2241 controller: webview.WebviewController = new webview.WebviewController(); 2242 2243 build() { 2244 Column() { 2245 Button('clearClientAuthenticationCache') 2246 .onClick(() => { 2247 try { 2248 this.controller.clearClientAuthenticationCache(); 2249 } catch (error) { 2250 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2251 } 2252 }) 2253 Web({ src: 'www.example.com', controller: this.controller }) 2254 } 2255 } 2256} 2257``` 2258 2259## createWebMessagePorts 2260 2261createWebMessagePorts(isExtentionType?: boolean): Array\<WebMessagePort> 2262 2263创建Web消息端口。 2264 2265**系统能力:** SystemCapability.Web.Webview.Core 2266 2267**参数:** 2268 2269| 参数名 | 类型 | 必填 | 说明 | 2270| ------ | ---------------------- | ---- | :------------------------------| 2271| isExtentionType<sup>10+</sup> | boolean | 否 | 是否使用扩展增强接口。<br>true表示使用扩展增强接口,false表示不使用扩展增强接口。<br>默认值:false。 | 2272 2273**返回值:** 2274 2275| 类型 | 说明 | 2276| ---------------------- | ----------------- | 2277| Array\<[WebMessagePort](./arkts-apis-webview-WebMessagePort.md)> | web消息端口列表。 | 2278 2279**错误码:** 2280 2281以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2282 2283| 错误码ID | 错误信息 | 2284| -------- | ------------------------------------------------------------ | 2285| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2286| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 2287 2288**示例:** 2289 2290完整示例代码参考[onMessageEventExt](./arkts-apis-webview-WebMessagePort.md#onmessageeventext10)。 2291 2292## postMessage 2293 2294postMessage(name: string, ports: Array\<WebMessagePort>, uri: string): void 2295 2296发送Web消息端口到HTML。 2297 2298**系统能力:** SystemCapability.Web.Webview.Core 2299 2300**参数:** 2301 2302| 参数名 | 类型 | 必填 | 说明 | 2303| ------ | ---------------------- | ---- | :------------------------------- | 2304| name | string | 是 | 要发送的消息名称。 | 2305| ports | Array\<[WebMessagePort](./arkts-apis-webview-WebMessagePort.md)> | 是 | 要发送的消息端口。 | 2306| uri | string | 是 | 接收该消息的URI。 | 2307 2308**错误码:** 2309 2310以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2311 2312| 错误码ID | 错误信息 | 2313| -------- | ------------------------------------------------------------ | 2314| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2315| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 2316 2317**示例:** 2318 2319```ts 2320// xxx.ets 2321import { webview } from '@kit.ArkWeb'; 2322import { BusinessError } from '@kit.BasicServicesKit'; 2323 2324@Entry 2325@Component 2326struct WebComponent { 2327 controller: webview.WebviewController = new webview.WebviewController(); 2328 ports: webview.WebMessagePort[] = []; 2329 @State sendFromEts: string = 'Send this message from ets to HTML'; 2330 @State receivedFromHtml: string = 'Display received message send from HTML'; 2331 2332 build() { 2333 Column() { 2334 // 展示接收到的来自HTML的内容 2335 Text(this.receivedFromHtml) 2336 // 输入框的内容发送到html 2337 TextInput({ placeholder: 'Send this message from ets to HTML' }) 2338 .onChange((value: string) => { 2339 this.sendFromEts = value; 2340 }) 2341 2342 Button('postMessage') 2343 .onClick(() => { 2344 try { 2345 // 1、创建两个消息端口。 2346 this.ports = this.controller.createWebMessagePorts(); 2347 // 2、在应用侧的消息端口(如端口1)上注册回调事件。 2348 this.ports[1].onMessageEvent((result: webview.WebMessage) => { 2349 let msg = 'Got msg from HTML:'; 2350 if (typeof (result) == "string") { 2351 console.info("received string message from html5, string is:" + result); 2352 msg = msg + result; 2353 } else if (typeof (result) == "object") { 2354 if (result instanceof ArrayBuffer) { 2355 console.info("received arraybuffer from html5, length is:" + result.byteLength); 2356 msg = msg + "length is " + result.byteLength; 2357 } else { 2358 console.info("not support"); 2359 } 2360 } else { 2361 console.info("not support"); 2362 } 2363 this.receivedFromHtml = msg; 2364 }) 2365 // 3、将另一个消息端口(如端口0)发送到HTML侧,由HTML侧保存并使用。 2366 this.controller.postMessage('__init_port__', [this.ports[0]], '*'); 2367 } catch (error) { 2368 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2369 } 2370 }) 2371 2372 // 4、使用应用侧的端口给另一个已经发送到html的端口发送消息。 2373 Button('SendDataToHTML') 2374 .onClick(() => { 2375 try { 2376 if (this.ports && this.ports[1]) { 2377 this.ports[1].postMessageEvent(this.sendFromEts); 2378 } else { 2379 console.error(`ports is null, Please initialize first`); 2380 } 2381 } catch (error) { 2382 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2383 } 2384 }) 2385 Web({ src: $rawfile('index.html'), controller: this.controller }) 2386 } 2387 } 2388} 2389``` 2390 2391加载的html文件。 2392```html 2393<!--index.html--> 2394<!DOCTYPE html> 2395<html> 2396<head> 2397 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 2398 <title>WebView Message Port Demo</title> 2399</head> 2400 2401 <body> 2402 <h1>WebView Message Port Demo</h1> 2403 <div> 2404 <input type="button" value="SendToEts" onclick="PostMsgToEts(msgFromJS.value);"/><br/> 2405 <input id="msgFromJS" type="text" value="send this message from HTML to ets"/><br/> 2406 </div> 2407 <p class="output">display received message send from ets</p> 2408 </body> 2409 <script src="xxx.js"></script> 2410</html> 2411``` 2412 2413<!--code_no_check--> 2414```js 2415//xxx.js 2416var h5Port; 2417var output = document.querySelector('.output'); 2418window.addEventListener('message', function (event) { 2419 if (event.data == '__init_port__') { 2420 if (event.ports[0] != null) { 2421 h5Port = event.ports[0]; // 1. 保存从ets侧发送过来的端口 2422 h5Port.onmessage = function (event) { 2423 // 2. 接收ets侧发送过来的消息. 2424 var msg = 'Got message from ets:'; 2425 var result = event.data; 2426 if (typeof(result) == "string") { 2427 console.info("received string message from html5, string is:" + result); 2428 msg = msg + result; 2429 } else if (typeof(result) == "object") { 2430 if (result instanceof ArrayBuffer) { 2431 console.info("received arraybuffer from html5, length is:" + result.byteLength); 2432 msg = msg + "length is " + result.byteLength; 2433 } else { 2434 console.info("not support"); 2435 } 2436 } else { 2437 console.info("not support"); 2438 } 2439 output.innerHTML = msg; 2440 } 2441 } 2442 } 2443}) 2444 2445// 3. 使用h5Port往ets侧发送消息. 2446function PostMsgToEts(data) { 2447 if (h5Port) { 2448 h5Port.postMessage(data); 2449 } else { 2450 console.error("h5Port is null, Please initialize first"); 2451 } 2452} 2453``` 2454 2455## requestFocus 2456 2457requestFocus(): void 2458 2459使当前web页面获取焦点。 2460 2461**系统能力:** SystemCapability.Web.Webview.Core 2462 2463**错误码:** 2464 2465以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2466 2467| 错误码ID | 错误信息 | 2468| -------- | ------------------------------------------------------------ | 2469| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2470 2471**示例:** 2472 2473```ts 2474// xxx.ets 2475import { webview } from '@kit.ArkWeb'; 2476import { BusinessError } from '@kit.BasicServicesKit'; 2477 2478@Entry 2479@Component 2480struct WebComponent { 2481 controller: webview.WebviewController = new webview.WebviewController(); 2482 2483 build() { 2484 Column() { 2485 Button('requestFocus') 2486 .onClick(() => { 2487 try { 2488 this.controller.requestFocus(); 2489 } catch (error) { 2490 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2491 } 2492 }); 2493 Web({ src: 'www.example.com', controller: this.controller }) 2494 } 2495 } 2496} 2497``` 2498 2499## zoomIn 2500 2501zoomIn(): void 2502 2503调用此接口将当前网页进行放大,比例为25%。 2504 2505**系统能力:** SystemCapability.Web.Webview.Core 2506 2507**错误码:** 2508 2509以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2510 2511| 错误码ID | 错误信息 | 2512| -------- | ------------------------------------------------------------ | 2513| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2514| 17100004 | Function not enabled. | 2515 2516**示例:** 2517 2518```ts 2519// xxx.ets 2520import { webview } from '@kit.ArkWeb'; 2521import { BusinessError } from '@kit.BasicServicesKit'; 2522 2523@Entry 2524@Component 2525struct WebComponent { 2526 controller: webview.WebviewController = new webview.WebviewController(); 2527 2528 build() { 2529 Column() { 2530 Button('zoomIn') 2531 .onClick(() => { 2532 try { 2533 this.controller.zoomIn(); 2534 } catch (error) { 2535 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2536 } 2537 }) 2538 Web({ src: 'www.example.com', controller: this.controller }) 2539 } 2540 } 2541} 2542``` 2543 2544## zoomOut 2545 2546zoomOut(): void 2547 2548调用此接口将当前网页进行缩小,比例为20%。 2549 2550**系统能力:** SystemCapability.Web.Webview.Core 2551 2552**错误码:** 2553 2554以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2555 2556| 错误码ID | 错误信息 | 2557| -------- | ------------------------------------------------------------ | 2558| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2559| 17100004 | Function not enabled. | 2560 2561**示例:** 2562 2563```ts 2564// xxx.ets 2565import { webview } from '@kit.ArkWeb'; 2566import { BusinessError } from '@kit.BasicServicesKit'; 2567 2568@Entry 2569@Component 2570struct WebComponent { 2571 controller: webview.WebviewController = new webview.WebviewController(); 2572 2573 build() { 2574 Column() { 2575 Button('zoomOut') 2576 .onClick(() => { 2577 try { 2578 this.controller.zoomOut(); 2579 } catch (error) { 2580 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2581 } 2582 }) 2583 Web({ src: 'www.example.com', controller: this.controller }) 2584 } 2585 } 2586} 2587``` 2588 2589## getWebId 2590 2591getWebId(): number 2592 2593获取当前Web组件的索引值,用于多个Web组件的管理。 2594 2595**系统能力:** SystemCapability.Web.Webview.Core 2596 2597**返回值:** 2598 2599| 类型 | 说明 | 2600| ------ | --------------------- | 2601| number | 当前Web组件的索引值。 | 2602 2603**错误码:** 2604 2605以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2606 2607| 错误码ID | 错误信息 | 2608| -------- | ------------------------------------------------------------ | 2609| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2610 2611**示例:** 2612 2613```ts 2614// xxx.ets 2615import { webview } from '@kit.ArkWeb'; 2616import { BusinessError } from '@kit.BasicServicesKit'; 2617 2618@Entry 2619@Component 2620struct WebComponent { 2621 controller: webview.WebviewController = new webview.WebviewController(); 2622 2623 build() { 2624 Column() { 2625 Button('getWebId') 2626 .onClick(() => { 2627 try { 2628 let id = this.controller.getWebId(); 2629 console.info("id: " + id); 2630 } catch (error) { 2631 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2632 } 2633 }) 2634 Web({ src: 'www.example.com', controller: this.controller }) 2635 } 2636 } 2637} 2638``` 2639 2640## getUserAgent 2641 2642getUserAgent(): string 2643 2644获取当前默认用户代理。 2645 2646默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../web/web-default-userAgent.md) 2647 2648**系统能力:** SystemCapability.Web.Webview.Core 2649 2650**返回值:** 2651 2652| 类型 | 说明 | 2653| ------ | -------------- | 2654| string | 默认用户代理。 | 2655 2656**错误码:** 2657 2658以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2659 2660| 错误码ID | 错误信息 | 2661| -------- | ------------------------------------------------------------ | 2662| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2663 2664**示例:** 2665 2666```ts 2667// xxx.ets 2668import { webview } from '@kit.ArkWeb'; 2669import { BusinessError } from '@kit.BasicServicesKit'; 2670 2671@Entry 2672@Component 2673struct WebComponent { 2674 controller: webview.WebviewController = new webview.WebviewController(); 2675 2676 build() { 2677 Column() { 2678 Button('getUserAgent') 2679 .onClick(() => { 2680 try { 2681 let userAgent = this.controller.getUserAgent(); 2682 console.info("userAgent: " + userAgent); 2683 } catch (error) { 2684 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2685 } 2686 }) 2687 Web({ src: 'www.example.com', controller: this.controller }) 2688 } 2689 } 2690} 2691``` 2692 2693支持开发者基于默认的User-Agent去定制User-Agent。 2694```ts 2695// xxx.ets 2696import { webview } from '@kit.ArkWeb'; 2697import { BusinessError } from '@kit.BasicServicesKit'; 2698 2699@Entry 2700@Component 2701struct WebComponent { 2702 controller: webview.WebviewController = new webview.WebviewController(); 2703 @State ua: string = ""; 2704 2705 aboutToAppear(): void { 2706 webview.once('webInited', () => { 2707 try { 2708 // 应用侧用法示例,定制User-Agent。 2709 this.ua = this.controller.getUserAgent() + 'xxx'; 2710 this.controller.setCustomUserAgent(this.ua); 2711 } catch (error) { 2712 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2713 } 2714 }) 2715 } 2716 2717 build() { 2718 Column() { 2719 Web({ src: 'www.example.com', controller: this.controller }) 2720 } 2721 } 2722} 2723``` 2724 2725## getTitle 2726 2727getTitle(): string 2728 2729获取当前网页的标题。 2730 2731**系统能力:** SystemCapability.Web.Webview.Core 2732 2733**返回值:** 2734 2735| 类型 | 说明 | 2736| ------ | -------------------- | 2737| string | 当前网页的标题。 | 2738 2739**错误码:** 2740 2741以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2742 2743| 错误码ID | 错误信息 | 2744| -------- | ------------------------------------------------------------ | 2745| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2746 2747**示例:** 2748 2749```ts 2750// xxx.ets 2751import { webview } from '@kit.ArkWeb'; 2752import { BusinessError } from '@kit.BasicServicesKit'; 2753 2754@Entry 2755@Component 2756struct WebComponent { 2757 controller: webview.WebviewController = new webview.WebviewController(); 2758 2759 build() { 2760 Column() { 2761 Button('getTitle') 2762 .onClick(() => { 2763 try { 2764 let title = this.controller.getTitle(); 2765 console.info("title: " + title); 2766 } catch (error) { 2767 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2768 } 2769 }) 2770 Web({ src: 'www.example.com', controller: this.controller }) 2771 } 2772 } 2773} 2774``` 2775 2776## getPageHeight 2777 2778getPageHeight(): number 2779 2780获取当前网页的页面高度。 2781 2782**系统能力:** SystemCapability.Web.Webview.Core 2783 2784**返回值:** 2785 2786| 类型 | 说明 | 2787| ------ | -------------------- | 2788| number | 当前网页的页面高度。单位:vp。 | 2789 2790**错误码:** 2791 2792以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2793 2794| 错误码ID | 错误信息 | 2795| -------- | ------------------------------------------------------------ | 2796| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2797 2798**示例:** 2799 2800```ts 2801// xxx.ets 2802import { webview } from '@kit.ArkWeb'; 2803import { BusinessError } from '@kit.BasicServicesKit'; 2804 2805@Entry 2806@Component 2807struct WebComponent { 2808 controller: webview.WebviewController = new webview.WebviewController(); 2809 2810 build() { 2811 Column() { 2812 Button('getPageHeight') 2813 .onClick(() => { 2814 try { 2815 let pageHeight = this.controller.getPageHeight(); 2816 console.log("pageHeight : " + pageHeight); 2817 } catch (error) { 2818 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2819 } 2820 }) 2821 Web({ src: 'www.example.com', controller: this.controller }) 2822 } 2823 } 2824} 2825``` 2826 2827## storeWebArchive 2828 2829storeWebArchive(baseName: string, autoName: boolean, callback: AsyncCallback\<string>): void 2830 2831以回调方式异步保存当前页面。 2832 2833**系统能力:** SystemCapability.Web.Webview.Core 2834 2835**参数:** 2836 2837| 参数名 | 类型 | 必填 | 说明 | 2838| -------- | --------------------- | ---- | ------------------------------------------------------------ | 2839| baseName | string | 是 | 生成的离线网页存储位置,该值不能为空。 | 2840| autoName | boolean | 是 | 决定是否自动生成文件名。<br>false表示按baseName的文件名存储,true表示根据当前Url自动生成文件名,并按baseName的文件目录存储。 | 2841| callback | AsyncCallback\<string> | 是 | 返回文件存储路径,保存网页失败会返回null。 | 2842 2843**错误码:** 2844 2845以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2846 2847| 错误码ID | 错误信息 | 2848| -------- | ------------------------------------------------------------ | 2849| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. | 2850| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2851| 17100003 | Invalid resource path or file type. | 2852 2853**示例:** 2854 2855```ts 2856// xxx.ets 2857import { webview } from '@kit.ArkWeb'; 2858import { BusinessError } from '@kit.BasicServicesKit'; 2859 2860@Entry 2861@Component 2862struct WebComponent { 2863 controller: webview.WebviewController = new webview.WebviewController(); 2864 2865 build() { 2866 Column() { 2867 Button('storeWebArchive') 2868 .onClick(() => { 2869 try { 2870 this.controller.storeWebArchive("/data/storage/el2/base/", true, (error, filename) => { 2871 if (error) { 2872 console.error(`save web archive error, ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2873 return; 2874 } 2875 if (filename != null) { 2876 console.info(`save web archive success: ${filename}`); 2877 } 2878 }); 2879 } catch (error) { 2880 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2881 } 2882 }) 2883 Web({ src: 'www.example.com', controller: this.controller }) 2884 } 2885 } 2886} 2887``` 2888 2889## storeWebArchive 2890 2891storeWebArchive(baseName: string, autoName: boolean): Promise\<string> 2892 2893以Promise方式异步保存当前页面。 2894 2895**系统能力:** SystemCapability.Web.Webview.Core 2896 2897**参数:** 2898 2899| 参数名 | 类型 | 必填 | 说明 | 2900| -------- | -------- | ---- | ------------------------------------------------------------ | 2901| baseName | string | 是 | 生成的离线网页存储位置,该值不能为空。 | 2902| autoName | boolean | 是 | 决定是否自动生成文件名。<br>false表示按baseName的文件名存储,true表示根据当前Url自动生成文件名,并按baseName的文件目录存储。 | 2903 2904**返回值:** 2905 2906| 类型 | 说明 | 2907| --------------- | ----------------------------------------------------- | 2908| Promise\<string> | Promise实例,保存成功返回文件路径,保存失败返回null。 | 2909 2910**错误码:** 2911 2912以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2913 2914| 错误码ID | 错误信息 | 2915| -------- | ------------------------------------------------------------ | 2916| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. | 2917| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2918| 17100003 | Invalid resource path or file type. | 2919 2920**示例:** 2921 2922```ts 2923// xxx.ets 2924import { webview } from '@kit.ArkWeb'; 2925import { BusinessError } from '@kit.BasicServicesKit'; 2926 2927@Entry 2928@Component 2929struct WebComponent { 2930 controller: webview.WebviewController = new webview.WebviewController(); 2931 2932 build() { 2933 Column() { 2934 Button('storeWebArchive') 2935 .onClick(() => { 2936 try { 2937 this.controller.storeWebArchive("/data/storage/el2/base/", true) 2938 .then(filename => { 2939 if (filename != null) { 2940 console.info(`save web archive success: ${filename}`) 2941 } 2942 }) 2943 .catch((error: BusinessError) => { 2944 console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); 2945 }) 2946 } catch (error) { 2947 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2948 } 2949 }) 2950 Web({ src: 'www.example.com', controller: this.controller }) 2951 } 2952 } 2953} 2954``` 2955 2956## getUrl 2957 2958getUrl(): string 2959 2960获取当前页面的url地址。 2961 2962**系统能力:** SystemCapability.Web.Webview.Core 2963 2964**返回值:** 2965 2966| 类型 | 说明 | 2967| ------ | ------------------- | 2968| string | 当前页面的url地址。 | 2969 2970**错误码:** 2971 2972以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 2973 2974| 错误码ID | 错误信息 | 2975| -------- | ------------------------------------------------------------ | 2976| 17100001 | Init error. The WebviewController must be associated with a Web component. | 2977 2978**示例:** 2979 2980```ts 2981// xxx.ets 2982import { webview } from '@kit.ArkWeb'; 2983import { BusinessError } from '@kit.BasicServicesKit'; 2984 2985@Entry 2986@Component 2987struct WebComponent { 2988 controller: webview.WebviewController = new webview.WebviewController(); 2989 2990 build() { 2991 Column() { 2992 Button('getUrl') 2993 .onClick(() => { 2994 try { 2995 let url = this.controller.getUrl(); 2996 console.info("url: " + url); 2997 } catch (error) { 2998 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 2999 } 3000 }) 3001 Web({ src: 'www.example.com', controller: this.controller }) 3002 } 3003 } 3004} 3005``` 3006 3007## stop 3008 3009stop(): void 3010 3011停止页面加载。 3012 3013**系统能力:** SystemCapability.Web.Webview.Core 3014 3015**错误码:** 3016 3017以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3018 3019| 错误码ID | 错误信息 | 3020| -------- | ------------------------------------------------------------ | 3021| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3022 3023**示例:** 3024 3025```ts 3026// xxx.ets 3027import { webview } from '@kit.ArkWeb'; 3028import { BusinessError } from '@kit.BasicServicesKit'; 3029 3030@Entry 3031@Component 3032struct WebComponent { 3033 controller: webview.WebviewController = new webview.WebviewController(); 3034 3035 build() { 3036 Column() { 3037 Button('stop') 3038 .onClick(() => { 3039 try { 3040 this.controller.stop(); 3041 } catch (error) { 3042 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3043 } 3044 }); 3045 Web({ src: 'www.example.com', controller: this.controller }) 3046 } 3047 } 3048} 3049``` 3050 3051## backOrForward 3052 3053backOrForward(step: number): void 3054 3055按照历史栈,前进或者后退指定步长的页面,当历史栈中不存在对应步长的页面时,不会进行页面跳转。 3056 3057前进或者后退页面时,直接使用已加载过的网页,无需重新加载网页。 3058 3059**系统能力:** SystemCapability.Web.Webview.Core 3060 3061**参数:** 3062 3063| 参数名 | 类型 | 必填 | 说明 | 3064| ------ | -------- | ---- | ---------------------- | 3065| step | number | 是 | 需要前进或后退的步长。 | 3066 3067**错误码:** 3068 3069以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3070 3071| 错误码ID | 错误信息 | 3072| -------- | ------------------------------------------------------------ | 3073| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3074| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 3075 3076**示例:** 3077 3078```ts 3079// xxx.ets 3080import { webview } from '@kit.ArkWeb'; 3081import { BusinessError } from '@kit.BasicServicesKit'; 3082 3083@Entry 3084@Component 3085struct WebComponent { 3086 controller: webview.WebviewController = new webview.WebviewController(); 3087 @State step: number = -2; 3088 3089 build() { 3090 Column() { 3091 Button('backOrForward') 3092 .onClick(() => { 3093 try { 3094 this.controller.backOrForward(this.step); 3095 } catch (error) { 3096 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3097 } 3098 }) 3099 Web({ src: 'www.example.com', controller: this.controller }) 3100 } 3101 } 3102} 3103``` 3104 3105## scrollTo 3106 3107scrollTo(x:number, y:number, duration?:number): void 3108 3109在指定时间内,将页面滚动到指定的绝对位置。 3110 3111**系统能力:** SystemCapability.Web.Webview.Core 3112 3113**参数:** 3114 3115| 参数名 | 类型 | 必填 | 说明 | 3116| ------ | -------- | ---- | ---------------------- | 3117| x | number | 是 | 绝对位置的水平坐标,当传入数值为负数时,按照传入0处理。<br>单位:vp。 | 3118| y | number | 是 | 绝对位置的垂直坐标,当传入数值为负数时,按照传入0处理。<br>单位:vp。| 3119| duration<sup>14+</sup> | number | 否 | 滚动动画时间。<br>单位:ms。<br>不传入为无动画,当传入数值为负数或传入0时,按照不传入处理。 | 3120 3121**错误码:** 3122 3123以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3124 3125| 错误码ID | 错误信息 | 3126| -------- | ------------------------------------------------------------ | 3127| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3128| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 3129 3130**示例:** 3131 3132```ts 3133// xxx.ets 3134import { webview } from '@kit.ArkWeb'; 3135import { BusinessError } from '@kit.BasicServicesKit'; 3136 3137@Entry 3138@Component 3139struct WebComponent { 3140 controller: webview.WebviewController = new webview.WebviewController(); 3141 3142 build() { 3143 Column() { 3144 Button('scrollTo') 3145 .onClick(() => { 3146 try { 3147 this.controller.scrollTo(50, 50, 500); 3148 } catch (error) { 3149 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3150 } 3151 }) 3152 Button('stopScroll') 3153 .onClick(() => { 3154 try { 3155 this.controller.scrollBy(0, 0, 1); //如果想停止当前scroll产生的动画,可再次生成一个1ms的动画去打断该动画。 3156 } catch (error) { 3157 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3158 } 3159 }) 3160 Web({ src: $rawfile('index.html'), controller: this.controller }) 3161 } 3162 } 3163} 3164``` 3165 3166加载的html文件。 3167```html 3168<!--index.html--> 3169<!DOCTYPE html> 3170<html> 3171<head> 3172 <title>Demo</title> 3173 <style> 3174 body { 3175 width:2000px; 3176 height:2000px; 3177 padding-right:170px; 3178 padding-left:170px; 3179 border:5px solid blueviolet; 3180 } 3181 </style> 3182</head> 3183<body> 3184Scroll Test 3185</body> 3186</html> 3187``` 3188 3189## scrollBy 3190 3191scrollBy(deltaX:number, deltaY:number,duration?:number): void 3192 3193在指定时间内将页面滚动指定的偏移量。 3194 3195**系统能力:** SystemCapability.Web.Webview.Core 3196 3197**参数:** 3198 3199| 参数名 | 类型 | 必填 | 说明 | 3200| ------ | -------- | ---- | ---------------------- | 3201| deltaX | number | 是 | 水平偏移量,其中水平向右为正方向。<br>单位:vp。 | 3202| deltaY | number | 是 | 垂直偏移量,其中垂直向下为正方向。<br>单位:vp。 | 3203| duration<sup>14+</sup> | number | 否 | 滚动动画时间。<br>单位:ms。<br>不传入为无动画,当传入数值为负数或传入0时,按照不传入处理。 | 3204 3205**错误码:** 3206 3207以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3208 3209| 错误码ID | 错误信息 | 3210| -------- | ------------------------------------------------------------ | 3211| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3212| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 3213 3214> **说明:** 3215> 3216> 嵌套滚动场景中,调用scrollBy不会触发父组件的嵌套滚动。 3217 3218**示例:** 3219 3220```ts 3221// xxx.ets 3222import { webview } from '@kit.ArkWeb'; 3223import { BusinessError } from '@kit.BasicServicesKit'; 3224 3225@Entry 3226@Component 3227struct WebComponent { 3228 controller: webview.WebviewController = new webview.WebviewController(); 3229 3230 build() { 3231 Column() { 3232 Button('scrollBy') 3233 .onClick(() => { 3234 try { 3235 this.controller.scrollBy(50, 50, 500); 3236 } catch (error) { 3237 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3238 } 3239 }) 3240 Button('stopScroll') 3241 .onClick(() => { 3242 try { 3243 this.controller.scrollBy(0, 0, 1); //如果想停止当前scroll产生的动画,可再次生成一个1ms的动画去打断该动画。 3244 } catch (error) { 3245 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3246 } 3247 }) 3248 Web({ src: $rawfile('index.html'), controller: this.controller }) 3249 } 3250 } 3251} 3252``` 3253 3254加载的html文件。 3255```html 3256<!--index.html--> 3257<!DOCTYPE html> 3258<html> 3259<head> 3260 <title>Demo</title> 3261 <style> 3262 body { 3263 width:2000px; 3264 height:2000px; 3265 padding-right:170px; 3266 padding-left:170px; 3267 border:5px solid blueviolet; 3268 } 3269 </style> 3270</head> 3271<body> 3272Scroll Test 3273</body> 3274</html> 3275``` 3276## scrollByWithResult<sup>12+</sup> 3277 3278scrollByWithResult(deltaX: number, deltaY: number): boolean 3279 3280将页面滚动指定的偏移量,返回值表示此次滚动是否执行成功。 3281 3282**系统能力:** SystemCapability.Web.Webview.Core 3283 3284**参数:** 3285 3286| 参数名 | 类型 | 必填 | 说明 | 3287| ------ | -------- | ---- | ---------------------- | 3288| deltaX | number | 是 | 水平偏移量,其中水平向右为正方向。 <br>单位:vp。 | 3289| deltaY | number | 是 | 垂直偏移量,其中垂直向下为正方向。 <br>单位:vp。 | 3290 3291**返回值:** 3292 3293| 类型 | 说明 | 3294| ------- | --------------------------------------- | 3295| boolean | true表示当前网页可以滑动,false表示当前网页不可以滑动。<br>默认为false。 | 3296 3297**错误码:** 3298 3299以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3300 3301| 错误码ID | 错误信息 | 3302| -------- | ------------------------------------------------------------ | 3303| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3304| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 3305 3306> **说明:** 3307> 3308> - 返回值场景:Web页面处于触摸中状态时,返回false,否则返回true。 3309> - 同层渲染场景中,Web的同层渲染区域处于触摸中状态时,返回值为true。 3310> - 嵌套滚动场景中,调用scrollByWithResult不会触发父组件的嵌套滚动。 3311> - 此接口不保证滑动帧率性能。 3312 3313**示例:** 3314 3315```ts 3316// xxx.ets 3317import { webview } from '@kit.ArkWeb'; 3318import { BusinessError } from '@kit.BasicServicesKit'; 3319 3320@Entry 3321@Component 3322struct WebComponent { 3323 controller: webview.WebviewController = new webview.WebviewController(); 3324 3325 build() { 3326 Column() { 3327 Button('scrollByWithResult') 3328 .onClick(() => { 3329 try { 3330 let result = this.controller.scrollByWithResult(50, 50); 3331 console.info("original result: " + result); 3332 } catch (error) { 3333 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3334 } 3335 }) 3336 Web({ src: $rawfile('index.html'), controller: this.controller }) 3337 } 3338 } 3339} 3340``` 3341 3342加载的html文件。 3343```html 3344<!--index.html--> 3345<!DOCTYPE html> 3346<html> 3347<head> 3348 <title>Demo</title> 3349 <style> 3350 body { 3351 width:2000px; 3352 height:2000px; 3353 padding-right:170px; 3354 padding-left:170px; 3355 border:5px solid blueviolet; 3356 } 3357 </style> 3358</head> 3359<body> 3360Scroll Test 3361</body> 3362</html> 3363``` 3364## slideScroll 3365 3366slideScroll(vx:number, vy:number): void 3367 3368按照指定速度模拟对页面的轻扫滚动动作。 3369 3370**系统能力:** SystemCapability.Web.Webview.Core 3371 3372**参数:** 3373 3374| 参数名 | 类型 | 必填 | 说明 | 3375| ------ | -------- | ---- | ---------------------- | 3376| vx | number | 是 | 轻扫滚动的水平速度分量,其中水平向右为速度正方向。<br>单位:vp/ms。 | 3377| vy | number | 是 | 轻扫滚动的垂直速度分量,其中垂直向下为速度正方向。<br>单位:vp/ms。 | 3378 3379**错误码:** 3380 3381以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3382 3383| 错误码ID | 错误信息 | 3384| -------- | ------------------------------------------------------------ | 3385| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3386| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 3387 3388**示例:** 3389 3390```ts 3391// xxx.ets 3392import { webview } from '@kit.ArkWeb'; 3393import { BusinessError } from '@kit.BasicServicesKit'; 3394 3395@Entry 3396@Component 3397struct WebComponent { 3398 controller: webview.WebviewController = new webview.WebviewController(); 3399 3400 build() { 3401 Column() { 3402 Button('slideScroll') 3403 .onClick(() => { 3404 try { 3405 this.controller.slideScroll(500, 500); 3406 } catch (error) { 3407 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3408 } 3409 }) 3410 Web({ src: $rawfile('index.html'), controller: this.controller }) 3411 } 3412 } 3413} 3414``` 3415 3416加载的html文件。 3417```html 3418<!--index.html--> 3419<!DOCTYPE html> 3420<html> 3421<head> 3422 <title>Demo</title> 3423 <style> 3424 body { 3425 width:3000px; 3426 height:3000px; 3427 padding-right:170px; 3428 padding-left:170px; 3429 border:5px solid blueviolet; 3430 } 3431 </style> 3432</head> 3433<body> 3434Scroll Test 3435</body> 3436</html> 3437``` 3438 3439## getOriginalUrl 3440 3441getOriginalUrl(): string 3442 3443获取当前页面的原始url地址。 3444风险提示:如果想获取url来做JavascriptProxy通信接口认证,请使用[getLastJavascriptProxyCallingFrameUrl<sup>12+</sup>](#getlastjavascriptproxycallingframeurl12) 3445 3446**系统能力:** SystemCapability.Web.Webview.Core 3447 3448**返回值:** 3449 3450| 类型 | 说明 | 3451| ------ | ----------------------- | 3452| string | 当前页面的原始url地址。 | 3453 3454**错误码:** 3455 3456以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3457 3458| 错误码ID | 错误信息 | 3459| -------- | ------------------------------------------------------------ | 3460| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3461 3462**示例:** 3463 3464```ts 3465// xxx.ets 3466import { webview } from '@kit.ArkWeb'; 3467import { BusinessError } from '@kit.BasicServicesKit'; 3468 3469@Entry 3470@Component 3471struct WebComponent { 3472 controller: webview.WebviewController = new webview.WebviewController(); 3473 3474 build() { 3475 Column() { 3476 Button('getOrgUrl') 3477 .onClick(() => { 3478 try { 3479 let url = this.controller.getOriginalUrl(); 3480 console.info("original url: " + url); 3481 } catch (error) { 3482 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3483 } 3484 }) 3485 Web({ src: 'www.example.com', controller: this.controller }) 3486 } 3487 } 3488} 3489``` 3490 3491## getFavicon 3492 3493getFavicon(): image.PixelMap 3494 3495获取页面的favicon图标。 3496 3497**系统能力:** SystemCapability.Web.Webview.Core 3498 3499**返回值:** 3500 3501| 类型 | 说明 | 3502| -------------------------------------- | ------------------------------- | 3503| image.[PixelMap](../apis-image-kit/arkts-apis-image-PixelMap.md) | 页面favicon图标的PixelMap对象。 | 3504 3505**错误码:** 3506 3507以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3508 3509| 错误码ID | 错误信息 | 3510| -------- | ------------------------------------------------------------ | 3511| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3512 3513**示例:** 3514 3515```ts 3516// xxx.ets 3517import { webview } from '@kit.ArkWeb'; 3518import { BusinessError } from '@kit.BasicServicesKit'; 3519import { image } from '@kit.ImageKit'; 3520 3521@Entry 3522@Component 3523struct WebComponent { 3524 controller: webview.WebviewController = new webview.WebviewController(); 3525 @State pixelmap: image.PixelMap | undefined = undefined; 3526 3527 build() { 3528 Column() { 3529 Button('getFavicon') 3530 .onClick(() => { 3531 try { 3532 this.pixelmap = this.controller.getFavicon(); 3533 } catch (error) { 3534 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3535 } 3536 }) 3537 Web({ src: 'www.example.com', controller: this.controller }) 3538 } 3539 } 3540} 3541``` 3542 3543## setNetworkAvailable 3544 3545setNetworkAvailable(enable: boolean): void 3546 3547设置JavaScript中的`window.navigator.onLine`属性。 3548 3549**系统能力:** SystemCapability.Web.Webview.Core 3550 3551**参数:** 3552 3553| 参数名 | 类型 | 必填 | 说明 | 3554| ------ | ------- | ---- | --------------------------------- | 3555| enable | boolean | 是 | 设置JavaScript中的`window.navigator.onLine`属性。<br>true表示设置JavaScript中的`window.navigator.onLine`属性为true,false表示设置JavaScript中的`window.navigator.onLine`属性为false。<br>默认值:true。 | 3556 3557**错误码:** 3558 3559以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3560 3561| 错误码ID | 错误信息 | 3562| -------- | ------------------------------------------------------------ | 3563| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3564| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 3565 3566**示例:** 3567 3568```ts 3569// xxx.ets 3570import { webview } from '@kit.ArkWeb'; 3571import { BusinessError } from '@kit.BasicServicesKit'; 3572 3573@Entry 3574@Component 3575struct WebComponent { 3576 controller: webview.WebviewController = new webview.WebviewController(); 3577 3578 build() { 3579 Column() { 3580 Button('setNetworkAvailable') 3581 .onClick(() => { 3582 try { 3583 this.controller.setNetworkAvailable(true); 3584 } catch (error) { 3585 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3586 } 3587 }) 3588 Web({ src: $rawfile('index.html'), controller: this.controller }) 3589 } 3590 } 3591} 3592``` 3593 3594加载的html文件。 3595```html 3596<!-- index.html --> 3597<!DOCTYPE html> 3598<html> 3599<body> 3600<h1>online 属性</h1> 3601<p id="demo"></p> 3602<button onclick="func()">click</button> 3603<script> 3604 // 检测浏览器是否在线。 3605 var online1 = navigator.onLine; 3606 document.getElementById("demo").innerHTML = "浏览器在线:" + online1; 3607 3608 function func(){ 3609 var online2 = navigator.onLine; 3610 document.getElementById("demo").innerHTML = "浏览器在线:" + online2; 3611 } 3612</script> 3613</body> 3614</html> 3615``` 3616 3617## hasImage 3618 3619hasImage(callback: AsyncCallback\<boolean>): void 3620 3621通过Callback方式异步查找当前页面是否存在图像。 3622 3623**系统能力:** SystemCapability.Web.Webview.Core 3624 3625**参数:** 3626 3627| 参数名 | 类型 | 必填 | 说明 | 3628| -------- | ----------------------- | ---- | -------------------------- | 3629| callback | AsyncCallback\<boolean> | 是 | 返回查找页面是否存在图像。<br> true表示页面存在图像;false表示页面不存在图像。 | 3630 3631**错误码:** 3632 3633以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3634 3635| 错误码ID | 错误信息 | 3636| -------- | ------------------------------------------------------------ | 3637| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3638| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 3639 3640**示例:** 3641 3642```ts 3643// xxx.ets 3644import { webview } from '@kit.ArkWeb'; 3645import { BusinessError } from '@kit.BasicServicesKit'; 3646 3647@Entry 3648@Component 3649struct WebComponent { 3650 controller: webview.WebviewController = new webview.WebviewController(); 3651 3652 build() { 3653 Column() { 3654 Button('hasImageCb') 3655 .onClick(() => { 3656 try { 3657 this.controller.hasImage((error, data) => { 3658 if (error) { 3659 console.error(`hasImage error, ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3660 return; 3661 } 3662 console.info("hasImage: " + data); 3663 }); 3664 } catch (error) { 3665 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3666 } 3667 }) 3668 Web({ src: 'www.example.com', controller: this.controller }) 3669 } 3670 } 3671} 3672``` 3673 3674## hasImage 3675 3676hasImage(): Promise\<boolean> 3677 3678通过Promise方式异步查找当前页面是否存在图像。 3679 3680**系统能力:** SystemCapability.Web.Webview.Core 3681 3682**返回值:** 3683 3684| 类型 | 说明 | 3685| ----------------- | --------------------------------------- | 3686| Promise\<boolean> | Promise实例,返回查找页面是否存在图像。<br> true表示页面存在图像;false表示页面不存在图像。 | 3687 3688**错误码:** 3689 3690以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3691 3692| 错误码ID | 错误信息 | 3693| -------- | ------------------------------------------------------------ | 3694| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3695| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. | 3696 3697**示例:** 3698 3699```ts 3700// xxx.ets 3701import { webview } from '@kit.ArkWeb'; 3702import { BusinessError } from '@kit.BasicServicesKit'; 3703 3704@Entry 3705@Component 3706struct WebComponent { 3707 controller: webview.WebviewController = new webview.WebviewController(); 3708 3709 build() { 3710 Column() { 3711 Button('hasImagePm') 3712 .onClick(() => { 3713 try { 3714 this.controller.hasImage().then((data) => { 3715 console.info('hasImage: ' + data); 3716 }).catch((error: BusinessError) => { 3717 console.error("error: " + error); 3718 }) 3719 } catch (error) { 3720 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3721 } 3722 }) 3723 Web({ src: 'www.example.com', controller: this.controller }) 3724 } 3725 } 3726} 3727``` 3728 3729## removeCache 3730 3731removeCache(clearRom: boolean): void 3732 3733清除应用中的资源缓存文件,此方法将会清除同一应用中所有Webview的缓存文件。 3734 3735> **说明:** 3736> 3737> 可以通过在data/storage/el2/base/cache/web/Cache目录下查看Webview的缓存。 3738 3739**系统能力:** SystemCapability.Web.Webview.Core 3740 3741**参数:** 3742 3743| 参数名 | 类型 | 必填 | 说明 | 3744| -------- | ------- | ---- | -------------------------------------------------------- | 3745| clearRom | boolean | 是 | 设置为true时同时清除ROM和RAM中的缓存,设置为false时只清除RAM中的缓存。 | 3746 3747**错误码:** 3748 3749以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3750 3751| 错误码ID | 错误信息 | 3752| -------- | ------------------------------------------------------------ | 3753| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3754| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 3755 3756**示例:** 3757 3758```ts 3759// xxx.ets 3760import { webview } from '@kit.ArkWeb'; 3761import { BusinessError } from '@kit.BasicServicesKit'; 3762 3763@Entry 3764@Component 3765struct WebComponent { 3766 controller: webview.WebviewController = new webview.WebviewController(); 3767 3768 build() { 3769 Column() { 3770 Button('removeCache') 3771 .onClick(() => { 3772 try { 3773 this.controller.removeCache(false); 3774 } catch (error) { 3775 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3776 } 3777 }) 3778 Web({ src: 'www.example.com', controller: this.controller }) 3779 } 3780 } 3781} 3782``` 3783 3784## removeAllCache<sup>18+</sup> 3785 3786static removeAllCache(clearRom: boolean): void 3787 3788清除应用中的资源缓存文件,此方法将会清除同一应用中所有Webview的缓存文件。 3789 3790> **说明:** 3791> 3792> 可以通过在data/app/el2/100/base/\<applicationPackageName\>/cache/web/目录下查看Webview的缓存。 3793 3794**系统能力:** SystemCapability.Web.Webview.Core 3795 3796**参数:** 3797 3798| 参数名 | 类型 | 必填 | 说明 | 3799| -------- | ------- | ---- | -------------------------------------------------------- | 3800| clearRom | boolean | 是 | 设置为true时同时清除ROM和RAM中的缓存,设置为false时只清除RAM中的缓存。 | 3801 3802**错误码:** 3803 3804以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3805 3806| 错误码ID | 错误信息 | 3807| -------- | ------------------------------------------------------------ | 3808| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 3809 3810**示例:** 3811 3812```ts 3813// xxx.ets 3814import { webview } from '@kit.ArkWeb'; 3815import { BusinessError } from '@kit.BasicServicesKit'; 3816 3817@Entry 3818@Component 3819struct WebComponent { 3820 controller: webview.WebviewController = new webview.WebviewController(); 3821 3822 build() { 3823 Column() { 3824 Button('removeAllCache') 3825 .onClick(() => { 3826 try { 3827 webview.WebviewController.removeAllCache(false); 3828 } catch (error) { 3829 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3830 } 3831 }) 3832 Web({ src: 'www.example.com', controller: this.controller }) 3833 } 3834 } 3835} 3836``` 3837 3838## pageUp 3839 3840pageUp(top: boolean): void 3841 3842将Webview的内容向上滚动半个视框大小或者跳转到页面最顶部,通过top入参控制。 3843 3844**系统能力:** SystemCapability.Web.Webview.Core 3845 3846**参数:** 3847 3848| 参数名 | 类型 | 必填 | 说明 | 3849| ------ | ------- | ---- | ------------------------------------------------------------ | 3850| top | boolean | 是 | 是否跳转到页面最顶部。<br>false表示将页面内容向上滚动半个视框大小,true表示跳转到页面最顶部。 | 3851 3852**错误码:** 3853 3854以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3855 3856| 错误码ID | 错误信息 | 3857| -------- | ------------------------------------------------------------ | 3858| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3859| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 3860 3861**示例:** 3862 3863```ts 3864// xxx.ets 3865import { webview } from '@kit.ArkWeb'; 3866import { BusinessError } from '@kit.BasicServicesKit'; 3867 3868@Entry 3869@Component 3870struct WebComponent { 3871 controller: webview.WebviewController = new webview.WebviewController(); 3872 3873 build() { 3874 Column() { 3875 Button('pageUp') 3876 .onClick(() => { 3877 try { 3878 this.controller.pageUp(false); 3879 } catch (error) { 3880 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3881 } 3882 }) 3883 Web({ src: $rawfile("index.html"), controller: this.controller }) 3884 } 3885 } 3886} 3887``` 3888```html 3889<!-- index.html --> 3890<!DOCTYPE html> 3891<html> 3892<head> 3893 <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1.0"> 3894 <style> 3895 .blue { 3896 background-color: lightblue; 3897 } 3898 .green { 3899 background-color: lightgreen; 3900 } 3901 .blue, .green { 3902 font-size:16px; 3903 height:200px; 3904 text-align: center; /* 水平居中 */ 3905 line-height: 200px; /* 垂直居中(值等于容器高度) */ 3906 } 3907 </style> 3908</head> 3909<body> 3910<div class="blue" >webArea</div> 3911<div class="green">webArea</div> 3912<div class="blue">webArea</div> 3913<div class="green">webArea</div> 3914<div class="blue">webArea</div> 3915<div class="green">webArea</div> 3916<div class="blue">webArea</div> 3917</body> 3918</html> 3919``` 3920 3921## pageDown 3922 3923pageDown(bottom: boolean): void 3924 3925将Webview的内容向下滚动半个视框大小或者跳转到页面最底部,通过bottom入参控制。 3926 3927**系统能力:** SystemCapability.Web.Webview.Core 3928 3929**参数:** 3930 3931| 参数名 | 类型 | 必填 | 说明 | 3932| ------ | ------- | ---- | ------------------------------------------------------------ | 3933| bottom | boolean | 是 | 是否跳转到页面最底部。<br>false时表示将页面内容向下滚动半个视框大小,true表示跳转到页面最底部。 | 3934 3935**错误码:** 3936 3937以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 3938 3939| 错误码ID | 错误信息 | 3940| -------- | ------------------------------------------------------------ | 3941| 17100001 | Init error. The WebviewController must be associated with a Web component. | 3942| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 3943 3944**示例:** 3945 3946```ts 3947// xxx.ets 3948import { webview } from '@kit.ArkWeb'; 3949import { BusinessError } from '@kit.BasicServicesKit'; 3950 3951@Entry 3952@Component 3953struct WebComponent { 3954 controller: webview.WebviewController = new webview.WebviewController(); 3955 3956 build() { 3957 Column() { 3958 Button('pageDown') 3959 .onClick(() => { 3960 try { 3961 this.controller.pageDown(false); 3962 } catch (error) { 3963 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 3964 } 3965 }) 3966 Web({ src: $rawfile("index.html"), controller: this.controller }) 3967 } 3968 } 3969} 3970``` 3971 3972加载的html文件。 3973 3974```html 3975<!-- index.html --> 3976<!DOCTYPE html> 3977<html> 3978<head> 3979 <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1.0"> 3980 <style> 3981 .blue { 3982 background-color: lightblue; 3983 } 3984 .green { 3985 background-color: lightgreen; 3986 } 3987 .blue, .green { 3988 font-size:16px; 3989 height:200px; 3990 text-align: center; /* 水平居中 */ 3991 line-height: 200px; /* 垂直居中(值等于容器高度) */ 3992 } 3993 </style> 3994</head> 3995<body> 3996<div class="blue" >webArea</div> 3997<div class="green">webArea</div> 3998<div class="blue">webArea</div> 3999<div class="green">webArea</div> 4000<div class="blue">webArea</div> 4001<div class="green">webArea</div> 4002<div class="blue">webArea</div> 4003</body> 4004</html> 4005``` 4006 4007## getBackForwardEntries 4008 4009getBackForwardEntries(): BackForwardList 4010 4011获取当前Webview的历史信息列表。 4012 4013> **说明:** 4014> 4015> [onLoadIntercept](./arkts-basic-components-web-events.md#onloadintercept10)在加载开始的时候触发,该时刻还未生成历史节点,所以在onLoadIntercept中调用getBackForwardEntries拿到的历史栈不包括当前正在加载中的跳转。 4016 4017**系统能力:** SystemCapability.Web.Webview.Core 4018 4019**返回值:** 4020 4021| 类型 | 说明 | 4022| ----------------------------------- | --------------------------- | 4023| [BackForwardList](./arkts-apis-webview-BackForwardList.md) | 当前Webview的历史信息列表。 | 4024 4025**错误码:** 4026 4027以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4028 4029| 错误码ID | 错误信息 | 4030| -------- | ------------------------------------------------------------ | 4031| 17100001 | Init error. The WebviewController must be associated with a Web component. | 4032 4033**示例:** 4034 4035```ts 4036// xxx.ets 4037import { webview } from '@kit.ArkWeb'; 4038import { BusinessError } from '@kit.BasicServicesKit'; 4039 4040@Entry 4041@Component 4042struct WebComponent { 4043 controller: webview.WebviewController = new webview.WebviewController(); 4044 4045 build() { 4046 Column() { 4047 Button('getBackForwardEntries') 4048 .onClick(() => { 4049 try { 4050 let list = this.controller.getBackForwardEntries() 4051 } catch (error) { 4052 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 4053 } 4054 }) 4055 Web({ src: 'www.example.com', controller: this.controller }) 4056 } 4057 } 4058} 4059``` 4060 4061## serializeWebState 4062 4063serializeWebState(): Uint8Array 4064 4065将当前Webview的页面状态历史记录信息序列化。 4066 4067**系统能力:** SystemCapability.Web.Webview.Core 4068 4069**返回值:** 4070 4071| 类型 | 说明 | 4072| ---------- | --------------------------------------------- | 4073| Uint8Array | 当前Webview的页面状态历史记录序列化后的数据。 | 4074 4075**错误码:** 4076 4077以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4078 4079| 错误码ID | 错误信息 | 4080| -------- | ------------------------------------------------------------ | 4081| 17100001 | Init error. The WebviewController must be associated with a Web component. | 4082 4083**示例:** 4084 40851.对文件的操作需要导入文件管理模块,详情请参考[文件管理](../apis-core-file-kit/js-apis-file-fs.md)。 4086```ts 4087// xxx.ets 4088import { webview } from '@kit.ArkWeb'; 4089import { BusinessError } from '@kit.BasicServicesKit'; 4090import { fileIo } from '@kit.CoreFileKit'; 4091 4092@Entry 4093@Component 4094struct WebComponent { 4095 controller: webview.WebviewController = new webview.WebviewController(); 4096 4097 build() { 4098 Column() { 4099 Button('serializeWebState') 4100 .onClick(() => { 4101 try { 4102 let state = this.controller.serializeWebState(); 4103 let path:string | undefined = AppStorage.get("cacheDir"); 4104 if (path) { 4105 path += '/WebState'; 4106 // 以同步方法打开文件。 4107 let file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); 4108 fileIo.writeSync(file.fd, state.buffer); 4109 fileIo.closeSync(file.fd); 4110 } 4111 } catch (error) { 4112 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 4113 } 4114 }) 4115 Web({ src: 'www.example.com', controller: this.controller }) 4116 } 4117 } 4118} 4119``` 4120 41212.修改EntryAbility.ets。 4122获取应用缓存文件路径。 4123```ts 4124// xxx.ets 4125import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 4126 4127export default class EntryAbility extends UIAbility { 4128 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 4129 // 通过在AppStorage对象上绑定cacheDir,可以实现UIAbility组件与Page之间的数据同步。 4130 AppStorage.setOrCreate("cacheDir", this.context.cacheDir); 4131 } 4132} 4133``` 4134 4135## restoreWebState 4136 4137restoreWebState(state: Uint8Array): void 4138 4139当前Webview从序列化数据中恢复页面状态历史记录。 4140 4141如果state过大,可能会导致异常。建议state大于512k时,放弃恢复页面状态历史记录。 4142 4143**系统能力:** SystemCapability.Web.Webview.Core 4144 4145**参数:** 4146 4147| 参数名 | 类型 | 必填 | 说明 | 4148| ------ | ---------- | ---- | ---------------------------- | 4149| state | Uint8Array | 是 | 页面状态历史记录序列化数据。 | 4150 4151**错误码:** 4152 4153以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4154 4155| 错误码ID | 错误信息 | 4156| -------- | ------------------------------------------------------------ | 4157| 17100001 | Init error. The WebviewController must be associated with a Web component. | 4158| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 4159 4160**示例:** 4161 41621.对文件的操作需要导入文件管理模块,详情请参考[文件管理](../apis-core-file-kit/js-apis-file-fs.md)。 4163```ts 4164// xxx.ets 4165import { webview } from '@kit.ArkWeb'; 4166import { BusinessError } from '@kit.BasicServicesKit'; 4167import { fileIo } from '@kit.CoreFileKit'; 4168 4169@Entry 4170@Component 4171struct WebComponent { 4172 controller: webview.WebviewController = new webview.WebviewController(); 4173 4174 build() { 4175 Column() { 4176 Button('RestoreWebState') 4177 .onClick(() => { 4178 try { 4179 let path: string | undefined = AppStorage.get("cacheDir"); 4180 if (path) { 4181 path += '/WebState'; 4182 // 以同步方法打开文件。 4183 let file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE); 4184 let stat = fileIo.statSync(path); 4185 let size = stat.size; 4186 let buf = new ArrayBuffer(size); 4187 fileIo.read(file.fd, buf, (err, readLen) => { 4188 if (err) { 4189 console.error("console error with error message: " + err.message + ", error code: " + err.code); 4190 } else { 4191 console.info("read file data succeed"); 4192 this.controller.restoreWebState(new Uint8Array(buf.slice(0, readLen))); 4193 fileIo.closeSync(file); 4194 } 4195 }); 4196 } 4197 } catch (error) { 4198 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 4199 } 4200 }) 4201 Web({ src: 'www.example.com', controller: this.controller }) 4202 } 4203 } 4204} 4205``` 4206 42072.修改EntryAbility.ets。 4208获取应用缓存文件路径。 4209```ts 4210// xxx.ets 4211import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 4212 4213export default class EntryAbility extends UIAbility { 4214 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 4215 // 通过在AppStorage对象上绑定cacheDir,可以实现UIAbility组件与Page之间的数据同步。 4216 AppStorage.setOrCreate("cacheDir", this.context.cacheDir); 4217 } 4218} 4219``` 4220 4221## customizeSchemes 4222 4223static customizeSchemes(schemes: Array\<WebCustomScheme\>): void 4224 4225对Web内核赋予自定义协议url的跨域请求与fetch请求的权限。当Web在跨域fetch自定义协议url时,该fetch请求可被[onInterceptRequest](./arkts-basic-components-web-events.md#oninterceptrequest9)事件接口所拦截,从而开发者可以进一步处理该请求。建议在任何Web组件初始化之前调用该接口。 4226 4227**系统能力:** SystemCapability.Web.Webview.Core 4228 4229**参数:** 4230 4231| 参数名 | 类型 | 必填 | 说明 | 4232| -------- | ------- | ---- | -------------------------------------- | 4233| schemes | Array\<[WebCustomScheme](./arkts-apis-webview-i.md#webcustomscheme)\> | 是 | 自定义协议配置,最多支持同时配置10个自定义协议。 | 4234 4235**错误码:** 4236 4237以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4238 4239| 错误码ID | 错误信息 | 4240| -------- | ------------------------------------------------------------ | 4241| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 4242| 17100020 | Failed to register custom schemes. | 4243 4244**示例:** 4245 4246```ts 4247// xxx.ets 4248import { webview } from '@kit.ArkWeb'; 4249import { BusinessError } from '@kit.BasicServicesKit'; 4250 4251@Entry 4252@Component 4253struct WebComponent { 4254 controller: webview.WebviewController = new webview.WebviewController(); 4255 responseWeb: WebResourceResponse = new WebResourceResponse(); 4256 scheme1: webview.WebCustomScheme = { schemeName: "name1", isSupportCORS: true, isSupportFetch: true }; 4257 scheme2: webview.WebCustomScheme = { schemeName: "name2", isSupportCORS: true, isSupportFetch: true }; 4258 scheme3: webview.WebCustomScheme = { schemeName: "name3", isSupportCORS: true, isSupportFetch: true }; 4259 4260 aboutToAppear(): void { 4261 try { 4262 webview.WebviewController.customizeSchemes([this.scheme1, this.scheme2, this.scheme3]); 4263 } catch (error) { 4264 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 4265 } 4266 } 4267 4268 build() { 4269 Column() { 4270 Web({ src: 'www.example.com', controller: this.controller }) 4271 .onInterceptRequest((event) => { 4272 if (event) { 4273 console.info('url:' + event.request.getRequestUrl()); 4274 } 4275 return this.responseWeb; 4276 }) 4277 } 4278 } 4279} 4280``` 4281 4282## getCertificate<sup>10+</sup> 4283 4284getCertificate(): Promise<Array<cert.X509Cert>> 4285 4286获取当前网站的证书信息。使用Web组件加载https网站,会进行SSL证书校验,该接口会通过Promise异步返回当前网站的X509格式证书(X509Cert证书类型定义见[X509Cert](../apis-device-certificate-kit/js-apis-cert.md#x509cert)定义),便于开发者展示网站证书信息。 4287 4288**系统能力:** SystemCapability.Web.Webview.Core 4289 4290**返回值:** 4291 4292| 类型 | 说明 | 4293| ---------- | --------------------------------------------- | 4294| Promise<Array<cert.X509Cert>> | Promise实例,用于获取当前加载的https网站的X509格式证书数组。 | 4295 4296**错误码:** 4297 4298以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4299 4300| 错误码ID | 错误信息 | 4301| -------- | ------------------------------------------------------------ | 4302| 17100001 | Init error. The WebviewController must be associated with a web component. | 4303 4304**示例:** 4305 4306```ts 4307// xxx.ets 4308import { webview } from '@kit.ArkWeb'; 4309import { BusinessError } from '@kit.BasicServicesKit'; 4310import { cert } from '@kit.DeviceCertificateKit'; 4311 4312function Uint8ArrayToString(dataArray: Uint8Array) { 4313 let dataString = ''; 4314 for (let i = 0; i < dataArray.length; i++) { 4315 dataString += String.fromCharCode(dataArray[i]); 4316 } 4317 return dataString; 4318} 4319 4320function ParseX509CertInfo(x509CertArray: Array<cert.X509Cert>) { 4321 let res: string = 'getCertificate success: len = ' + x509CertArray.length; 4322 for (let i = 0; i < x509CertArray.length; i++) { 4323 res += ', index = ' + i + ', issuer name = ' 4324 + Uint8ArrayToString(x509CertArray[i].getIssuerName().data) + ', subject name = ' 4325 + Uint8ArrayToString(x509CertArray[i].getSubjectName().data) + ', valid start = ' 4326 + x509CertArray[i].getNotBeforeTime() 4327 + ', valid end = ' + x509CertArray[i].getNotAfterTime(); 4328 } 4329 return res; 4330} 4331 4332@Entry 4333@Component 4334struct Index { 4335 // outputStr在UI界面显示调试信息 4336 @State outputStr: string = ''; 4337 webviewCtl: webview.WebviewController = new webview.WebviewController(); 4338 4339 build() { 4340 Row() { 4341 Column() { 4342 List({ space: 20, initialIndex: 0 }) { 4343 ListItem() { 4344 Button() { 4345 Text('load bad ssl') 4346 .fontSize(10) 4347 .fontWeight(FontWeight.Bold) 4348 } 4349 .type(ButtonType.Capsule) 4350 .onClick(() => { 4351 // 加载一个过期的证书网站,查看获取到的证书信息 4352 this.webviewCtl.loadUrl('https://expired.badssl.com'); 4353 }) 4354 .height(50) 4355 } 4356 4357 ListItem() { 4358 Button() { 4359 Text('load example') 4360 .fontSize(10) 4361 .fontWeight(FontWeight.Bold) 4362 } 4363 .type(ButtonType.Capsule) 4364 .onClick(() => { 4365 // 加载一个https网站,查看网站的证书信息 4366 this.webviewCtl.loadUrl('https://www.example.com'); 4367 }) 4368 .height(50) 4369 } 4370 4371 ListItem() { 4372 Button() { 4373 Text('getCertificate Promise') 4374 .fontSize(10) 4375 .fontWeight(FontWeight.Bold) 4376 } 4377 .type(ButtonType.Capsule) 4378 .onClick(() => { 4379 try { 4380 this.webviewCtl.getCertificate().then((x509CertArray: Array<cert.X509Cert>) => { 4381 this.outputStr = ParseX509CertInfo(x509CertArray); 4382 }) 4383 } catch (error) { 4384 this.outputStr = 'getCertificate failed: ' + (error as BusinessError).code + ", errMsg: " + (error as BusinessError).message; 4385 } 4386 }) 4387 .height(50) 4388 } 4389 4390 ListItem() { 4391 Button() { 4392 Text('getCertificate AsyncCallback') 4393 .fontSize(10) 4394 .fontWeight(FontWeight.Bold) 4395 } 4396 .type(ButtonType.Capsule) 4397 .onClick(() => { 4398 try { 4399 this.webviewCtl.getCertificate((error: BusinessError, x509CertArray: Array<cert.X509Cert>) => { 4400 if (error) { 4401 this.outputStr = 'getCertificate failed: ' + error.code + ", errMsg: " + error.message; 4402 } else { 4403 this.outputStr = ParseX509CertInfo(x509CertArray); 4404 } 4405 }) 4406 } catch (error) { 4407 this.outputStr = 'getCertificate failed: ' + (error as BusinessError).code + ", errMsg: " + (error as BusinessError).message; 4408 } 4409 }) 4410 .height(50) 4411 } 4412 } 4413 .listDirection(Axis.Horizontal) 4414 .height('10%') 4415 4416 Text(this.outputStr) 4417 .width('100%') 4418 .fontSize(10) 4419 4420 Web({ src: 'https://www.example.com', controller: this.webviewCtl }) 4421 .fileAccess(true) 4422 .javaScriptAccess(true) 4423 .domStorageAccess(true) 4424 .onlineImageAccess(true) 4425 .onPageEnd((e) => { 4426 if (e) { 4427 this.outputStr = 'onPageEnd : url = ' + e.url; 4428 } 4429 }) 4430 .onSslErrorEventReceive((e) => { 4431 // 忽略ssl证书错误,便于测试一些证书过期的网站,如:https://expired.badssl.com 4432 e.handler.handleConfirm(); 4433 }) 4434 .width('100%') 4435 .height('70%') 4436 } 4437 .height('100%') 4438 } 4439 } 4440} 4441``` 4442 4443## getCertificate<sup>10+</sup> 4444 4445getCertificate(callback: AsyncCallback<Array<cert.X509Cert>>): void 4446 4447获取当前网站的证书信息。使用Web组件加载https网站,会进行SSL证书校验,该接口会通过AsyncCallback异步返回当前网站的X509格式证书(X509Cert证书类型定义见[X509Cert定义](../apis-device-certificate-kit/js-apis-cert.md)),便于开发者展示网站证书信息。 4448 4449**系统能力:** SystemCapability.Web.Webview.Core 4450 4451**参数:** 4452 4453| 参数名 | 类型 | 必填 | 说明 | 4454| -------- | ---------------------------- | ---- | ---------------------------------------- | 4455| callback | AsyncCallback<Array<cert.X509Cert>> | 是 | 通过AsyncCallback异步返回当前网站的X509格式证书。 | 4456 4457**错误码:** 4458 4459以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4460 4461| 错误码ID | 错误信息 | 4462| -------- | ------------------------------------------------------------ | 4463| 17100001 | Init error. The WebviewController must be associated with a web component. | 4464| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 4465 4466**示例:** 4467 4468```ts 4469// xxx.ets 4470import { webview } from '@kit.ArkWeb'; 4471import { BusinessError } from '@kit.BasicServicesKit'; 4472import { cert } from '@kit.DeviceCertificateKit'; 4473 4474function Uint8ArrayToString(dataArray: Uint8Array) { 4475 let dataString = ''; 4476 for (let i = 0; i < dataArray.length; i++) { 4477 dataString += String.fromCharCode(dataArray[i]); 4478 } 4479 return dataString; 4480} 4481 4482function ParseX509CertInfo(x509CertArray: Array<cert.X509Cert>) { 4483 let res: string = 'getCertificate success: len = ' + x509CertArray.length; 4484 for (let i = 0; i < x509CertArray.length; i++) { 4485 res += ', index = ' + i + ', issuer name = ' 4486 + Uint8ArrayToString(x509CertArray[i].getIssuerName().data) + ', subject name = ' 4487 + Uint8ArrayToString(x509CertArray[i].getSubjectName().data) + ', valid start = ' 4488 + x509CertArray[i].getNotBeforeTime() 4489 + ', valid end = ' + x509CertArray[i].getNotAfterTime(); 4490 } 4491 return res; 4492} 4493 4494@Entry 4495@Component 4496struct Index { 4497 // outputStr在UI界面显示调试信息 4498 @State outputStr: string = ''; 4499 webviewCtl: webview.WebviewController = new webview.WebviewController(); 4500 4501 build() { 4502 Row() { 4503 Column() { 4504 List({ space: 20, initialIndex: 0 }) { 4505 ListItem() { 4506 Button() { 4507 Text('load bad ssl') 4508 .fontSize(10) 4509 .fontWeight(FontWeight.Bold) 4510 } 4511 .type(ButtonType.Capsule) 4512 .onClick(() => { 4513 // 加载一个过期的证书网站,查看获取到的证书信息 4514 this.webviewCtl.loadUrl('https://expired.badssl.com'); 4515 }) 4516 .height(50) 4517 } 4518 4519 ListItem() { 4520 Button() { 4521 Text('load example') 4522 .fontSize(10) 4523 .fontWeight(FontWeight.Bold) 4524 } 4525 .type(ButtonType.Capsule) 4526 .onClick(() => { 4527 // 加载一个https网站,查看网站的证书信息 4528 this.webviewCtl.loadUrl('https://www.example.com'); 4529 }) 4530 .height(50) 4531 } 4532 4533 ListItem() { 4534 Button() { 4535 Text('getCertificate Promise') 4536 .fontSize(10) 4537 .fontWeight(FontWeight.Bold) 4538 } 4539 .type(ButtonType.Capsule) 4540 .onClick(() => { 4541 try { 4542 this.webviewCtl.getCertificate().then((x509CertArray: Array<cert.X509Cert>) => { 4543 this.outputStr = ParseX509CertInfo(x509CertArray); 4544 }) 4545 } catch (error) { 4546 this.outputStr = 'getCertificate failed: ' + (error as BusinessError).code + ", errMsg: " + (error as BusinessError).message; 4547 } 4548 }) 4549 .height(50) 4550 } 4551 4552 ListItem() { 4553 Button() { 4554 Text('getCertificate AsyncCallback') 4555 .fontSize(10) 4556 .fontWeight(FontWeight.Bold) 4557 } 4558 .type(ButtonType.Capsule) 4559 .onClick(() => { 4560 try { 4561 this.webviewCtl.getCertificate((error: BusinessError, x509CertArray: Array<cert.X509Cert>) => { 4562 if (error) { 4563 this.outputStr = 'getCertificate failed: ' + error.code + ", errMsg: " + error.message; 4564 } else { 4565 this.outputStr = ParseX509CertInfo(x509CertArray); 4566 } 4567 }) 4568 } catch (error) { 4569 this.outputStr = 'getCertificate failed: ' + (error as BusinessError).code + ", errMsg: " + (error as BusinessError).message; 4570 } 4571 }) 4572 .height(50) 4573 } 4574 } 4575 .listDirection(Axis.Horizontal) 4576 .height('10%') 4577 4578 Text(this.outputStr) 4579 .width('100%') 4580 .fontSize(10) 4581 4582 Web({ src: 'https://www.example.com', controller: this.webviewCtl }) 4583 .fileAccess(true) 4584 .javaScriptAccess(true) 4585 .domStorageAccess(true) 4586 .onlineImageAccess(true) 4587 .onPageEnd((e) => { 4588 if (e) { 4589 this.outputStr = 'onPageEnd : url = ' + e.url; 4590 } 4591 }) 4592 .onSslErrorEventReceive((e) => { 4593 // 忽略ssl证书错误,便于测试一些证书过期的网站,如:https://expired.badssl.com 4594 e.handler.handleConfirm(); 4595 }) 4596 .width('100%') 4597 .height('70%') 4598 } 4599 .height('100%') 4600 } 4601 } 4602} 4603``` 4604 4605## setAudioMuted<sup>10+</sup> 4606 4607setAudioMuted(mute: boolean): void 4608 4609设置网页静音。 4610 4611**系统能力:** SystemCapability.Web.Webview.Core 4612 4613**参数:** 4614 4615| 参数名 | 类型 | 必填 | 说明 | 4616| -------- | ------- | ---- | -------------------------------------- | 4617| mute | boolean | 是 | 表示是否将网页设置为静音状态。<br>true表示将网页设置为静音状态,false表示将网页取消静音状态。 | 4618 4619**错误码:** 4620 4621以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4622 4623| 错误码ID | 错误信息 | 4624| -------- | ------------------------------------------------------------ | 4625| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 4626| 17100001 | Init error. The WebviewController must be associated with a Web component. | 4627 4628**示例:** 4629 4630```ts 4631// xxx.ets 4632import { webview } from '@kit.ArkWeb'; 4633 4634@Entry 4635@Component 4636struct WebComponent { 4637 controller: webview.WebviewController = new webview.WebviewController(); 4638 @State muted: boolean = false; 4639 4640 build() { 4641 Column() { 4642 Button("Toggle Mute") 4643 .onClick(event => { 4644 if (event) { 4645 this.muted = !this.muted; 4646 this.controller.setAudioMuted(this.muted); 4647 } 4648 }) 4649 Web({ src: 'www.example.com', controller: this.controller }) 4650 } 4651 } 4652} 4653``` 4654 4655## prefetchPage<sup>10+</sup> 4656 4657prefetchPage(url: string, additionalHeaders?: Array\<WebHeader>): void 4658 4659在预测到将要加载的页面之前调用,提前下载页面所需的资源,包括主资源子资源,但不会执行网页JavaScript代码或呈现网页,以加快加载速度。 4660 4661> **说明:** 4662> 4663> - 下载的页面资源,会缓存五分钟左右,超过这段时间Web组件会自动释放。 4664> 4665> - prefetchPage对302重定向页面同样正常预取。 4666> 4667> - 先执行prefetchPage,再加载页面时,已预取的资源将直接从缓存中加载。 4668> 4669> - 连续prefetchPage多个url只有第一个生效。 4670> 4671> - prefetchPage有时间限制,500ms内不能多次预取。 4672 4673**系统能力:** SystemCapability.Web.Webview.Core 4674 4675**参数:** 4676 4677| 参数名 | 类型 | 必填 | 说明 | 4678| ------------------| --------------------------------| ---- | ------------- | 4679| url | string | 是 | 预加载的url。| 4680| additionalHeaders | Array\<[WebHeader](./arkts-apis-webview-i.md#webheader)> | 否 | url的附加HTTP请求头。<br>默认值: [] | 4681 4682**错误码:** 4683 4684以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4685 4686| 错误码ID | 错误信息 | 4687| -------- | ------------------------------------------------------------ | 4688| 17100001 | Init error. The WebviewController must be associated with a Web component. | 4689| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048. | 4690 4691**示例:** 4692 4693```ts 4694// xxx.ets 4695import { webview } from '@kit.ArkWeb'; 4696import { BusinessError } from '@kit.BasicServicesKit'; 4697 4698@Entry 4699@Component 4700struct WebComponent { 4701 controller: webview.WebviewController = new webview.WebviewController(); 4702 4703 build() { 4704 Column() { 4705 Button('prefetchPopularPage') 4706 .onClick(() => { 4707 try { 4708 // 预加载时,需要将'https://www.example.com'替换成一个真实的网站地址。 4709 this.controller.prefetchPage('https://www.example.com'); 4710 } catch (error) { 4711 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 4712 } 4713 }) 4714 // 需要将'www.example1.com'替换成一个真实的网站地址。 4715 Web({ src: 'www.example1.com', controller: this.controller }) 4716 } 4717 } 4718} 4719``` 4720 4721## prefetchResource<sup>12+</sup> 4722 4723static prefetchResource(request: RequestInfo, additionalHeaders?: Array\<WebHeader>, cacheKey?: string, cacheValidTime?: number): void 4724 4725根据指定的请求信息和附加的http请求头去预获取资源请求,存入内存缓存,并指定其缓存key和有效期,以加快加载速度。目前仅支持Content-Type为application/x-www-form-urlencoded的post请求。最多可以预获取6个post请求。如果要预获取第7个,请通过[clearPrefetchedResource](#clearprefetchedresource12)清除不需要的post请求缓存,否则会自动清除最早预获取的post缓存。如果要使用预获取的资源缓存,开发者需要在正式发起的post请求的请求头中增加键值“ArkWebPostCacheKey”,其内容为对应缓存的cacheKey。 4726 4727**系统能力:** SystemCapability.Web.Webview.Core 4728 4729**参数:** 4730 4731| 参数名 | 类型 | 必填 | 说明 | 4732| ------------------| ------------------------------- | ---- | ------------------------------------------------------------------ | 4733| request | [RequestInfo](./arkts-apis-webview-i.md#requestinfo12) | 是 | 预获取请求的信息。 | 4734| additionalHeaders | Array\<[WebHeader](./arkts-apis-webview-i.md#webheader)> | 否 | 预获取请求的附加HTTP请求头。 | 4735| cacheKey | string | 否 | 用于后续查询预获取资源缓存的key。仅支持字母和数字,未传入或传入空则取默认值url作为key。 | 4736| cacheValidTime | number | 否 | 预获取资源缓存的有效期。<br>取值范围:(0, 2147483647]。<br>默认值:300秒。 <br>单位:秒。 | 4737 4738**错误码:** 4739 4740以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4741 4742| 错误码ID | 错误信息 | 4743| -------- | ------------------------------------------------------------ | 4744| 401 | Invalid input parameter.Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed. | 4745| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048. | 4746 4747**示例:** 4748 4749```ts 4750// xxx.ets 4751import { webview } from '@kit.ArkWeb'; 4752import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 4753 4754export default class EntryAbility extends UIAbility { 4755 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 4756 console.log("EntryAbility onCreate"); 4757 webview.WebviewController.initializeWebEngine(); 4758 // 预获取时,需要將"https://www.example1.com/post?e=f&g=h"替换成真实要访问的网站地址。 4759 webview.WebviewController.prefetchResource( 4760 { 4761 url: "https://www.example1.com/post?e=f&g=h", 4762 method: "POST", 4763 formData: "a=x&b=y", 4764 }, 4765 [{ 4766 headerKey: "c", 4767 headerValue: "z", 4768 },], 4769 "KeyX", 500); 4770 AppStorage.setOrCreate("abilityWant", want); 4771 console.log("EntryAbility onCreate done"); 4772 } 4773} 4774``` 4775 4776## clearPrefetchedResource<sup>12+</sup> 4777 4778static clearPrefetchedResource(cacheKeyList: Array\<string>): void 4779 4780根据指定的缓存key列表清除对应的预获取资源缓存。入参中的缓存key必须是[prefetchResource](#prefetchresource12)指定预获取到的资源缓存key。 4781 4782**系统能力:** SystemCapability.Web.Webview.Core 4783 4784**参数:** 4785 4786| 参数名 | 类型 | 必填 | 说明 | 4787| ------------------| ----------- | ---- | ------------------------------------------------------------------------- | 4788| cacheKeyList | Array\<string> | 是 | 用于后续查询预获取资源缓存的key。仅支持字母和数字,未传入或传入空则取默认值url作为key。 | 4789 4790**示例:** 4791 4792```ts 4793// xxx.ets 4794import { webview } from '@kit.ArkWeb'; 4795 4796@Entry 4797@Component 4798struct WebComponent { 4799 controller: webview.WebviewController = new webview.WebviewController(); 4800 4801 build() { 4802 Column() { 4803 Web({ src: "https://www.example.com/", controller: this.controller }) 4804 .onAppear(() => { 4805 // 预获取时,需要將"https://www.example1.com/post?e=f&g=h"替换成真实要访问的网站地址。 4806 webview.WebviewController.prefetchResource( 4807 { 4808 url: "https://www.example1.com/post?e=f&g=h", 4809 method: "POST", 4810 formData: "a=x&b=y", 4811 }, 4812 [{ 4813 headerKey: "c", 4814 headerValue: "z", 4815 },], 4816 "KeyX", 500); 4817 }) 4818 .onPageEnd(() => { 4819 // 清除后续不再使用的预获取缓存。 4820 webview.WebviewController.clearPrefetchedResource(["KeyX",]); 4821 }) 4822 } 4823 } 4824} 4825``` 4826 4827## prepareForPageLoad<sup>10+</sup> 4828 4829static prepareForPageLoad(url: string, preconnectable: boolean, numSockets: number): void 4830 4831预连接url,在加载url之前调用此API,对url只进行DNS解析,socket建链操作,并不获取主资源子资源。 4832 4833**系统能力:** SystemCapability.Web.Webview.Core 4834 4835**参数:** 4836 4837| 参数名 | 类型 | 必填 | 说明 | 4838| ---------------| ------- | ---- | ------------- | 4839| url | string | 是 | 预连接的url。| 4840| preconnectable | boolean | 是 | 是否进行预连接。如果preconnectable为true,则对url进行DNS解析,socket建链预连接;如果preconnectable为false,则不做任何预连接操作。| 4841| numSockets | number | 是 | 要预连接的socket数。socket数目连接需要大于0,最多允许6个连接。| 4842 4843**错误码:** 4844 4845以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4846 4847| 错误码ID | 错误信息 | 4848| -------- | ------------------------------------------------------------ | 4849| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048. | 4850| 17100013 | The number of preconnect sockets is invalid. | 4851 4852**示例:** 4853 4854```ts 4855// xxx.ets 4856import { webview } from '@kit.ArkWeb'; 4857import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 4858 4859export default class EntryAbility extends UIAbility { 4860 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 4861 console.info("EntryAbility onCreate"); 4862 webview.WebviewController.initializeWebEngine(); 4863 // 预连接时,需要將'https://www.example.com'替换成一个真实的网站地址。 4864 webview.WebviewController.prepareForPageLoad("https://www.example.com", true, 2); 4865 AppStorage.setOrCreate("abilityWant", want); 4866 console.info("EntryAbility onCreate done"); 4867 } 4868} 4869``` 4870 4871## setCustomUserAgent<sup>10+</sup> 4872 4873setCustomUserAgent(userAgent: string): void 4874 4875设置自定义用户代理,会覆盖系统的用户代理。 4876 4877当Web组件src设置了url时,建议在onControllerAttached回调事件中设置User-Agent,设置方式请参考示例。不建议将User-Agent设置在onLoadIntercept回调事件中,会概率性出现设置失败。 4878 4879当Web组件src设置为空字符串时,建议先调用setCustomUserAgent方法设置User-Agent,再通过loadUrl加载具体页面。 4880 4881默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../web/web-default-userAgent.md) 4882 4883> **说明:** 4884> 4885>当Web组件src设置了url,且未在onControllerAttached回调事件中设置User-Agent。再调用setCustomUserAgent方法时,可能会出现加载的页面与实际设置User-Agent不符的异常现象。 4886 4887**系统能力:** SystemCapability.Web.Webview.Core 4888 4889**参数:** 4890 4891| 参数名 | 类型 | 必填 | 说明 | 4892| ---------------| ------- | ---- | ------------- | 4893| userAgent | string | 是 | 用户自定义代理信息。建议先使用[getUserAgent](#getuseragent)获取当前默认用户代理,在此基础上追加自定义用户代理信息。 | 4894 4895**错误码:** 4896 4897以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4898 4899| 错误码ID | 错误信息 | 4900| -------- | ------------------------------------------------------------ | 4901| 17100001 | Init error. The WebviewController must be associated with a Web component. | 4902| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 4903 4904**示例:** 4905 4906```ts 4907// xxx.ets 4908import { webview } from '@kit.ArkWeb'; 4909import { BusinessError } from '@kit.BasicServicesKit'; 4910 4911@Entry 4912@Component 4913struct WebComponent { 4914 controller: webview.WebviewController = new webview.WebviewController(); 4915 @State customUserAgent: string = ' DemoApp'; 4916 4917 build() { 4918 Column() { 4919 Web({ src: 'www.example.com', controller: this.controller }) 4920 .onControllerAttached(() => { 4921 console.info("onControllerAttached"); 4922 try { 4923 let userAgent = this.controller.getUserAgent() + this.customUserAgent; 4924 this.controller.setCustomUserAgent(userAgent); 4925 } catch (error) { 4926 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 4927 } 4928 }) 4929 } 4930 } 4931} 4932``` 4933 4934## setDownloadDelegate<sup>11+</sup> 4935 4936setDownloadDelegate(delegate: WebDownloadDelegate): void 4937 4938为当前的Web组件设置一个WebDownloadDelegate,该delegate用来接收页面内触发的下载与下载的进展。 4939 4940**系统能力:** SystemCapability.Web.Webview.Core 4941 4942**参数:** 4943 4944| 参数名 | 类型 | 必填 | 说明 | 4945| ---------------| ------- | ---- | ------------- | 4946| delegate | [WebDownloadDelegate](./arkts-apis-webview-WebDownloadDelegate.md) | 是 | 用来接收下载进回调的委托。 | 4947 4948**错误码:** 4949 4950以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 4951 4952| 错误码ID | 错误信息 | 4953| -------- | ------------------------------------------------------------ | 4954| 17100001 | Init error. The WebviewController must be associated with a Web component. | 4955 4956**示例:** 4957 4958```ts 4959// xxx.ets 4960import { webview } from '@kit.ArkWeb'; 4961import { BusinessError } from '@kit.BasicServicesKit'; 4962 4963@Entry 4964@Component 4965struct WebComponent { 4966 controller: webview.WebviewController = new webview.WebviewController(); 4967 delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); 4968 4969 build() { 4970 Column() { 4971 Button('setDownloadDelegate') 4972 .onClick(() => { 4973 try { 4974 this.controller.setDownloadDelegate(this.delegate); 4975 } catch (error) { 4976 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 4977 } 4978 }) 4979 Web({ src: 'www.example.com', controller: this.controller }) 4980 } 4981 } 4982} 4983``` 4984 4985## startDownload<sup>11+</sup> 4986 4987startDownload(url: string): void 4988 4989使用Web组件的下载能力来下载指定的url, 比如下载网页中指定的图片。 4990 4991**系统能力:** SystemCapability.Web.Webview.Core 4992 4993**参数:** 4994 4995| 参数名 | 类型 | 必填 | 说明 | 4996| ---------------| ------- | ---- | ------------- | 4997| url | string | 是 | 下载地址。 | 4998 4999**错误码:** 5000 5001以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5002 5003| 错误码ID | 错误信息 | 5004| -------- | ------------------------------------------------------------ | 5005| 17100001 | Init error. The WebviewController must be associated with a Web component. | 5006| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048. | 5007 5008**示例:** 5009 5010```ts 5011// xxx.ets 5012import { webview } from '@kit.ArkWeb'; 5013import { BusinessError } from '@kit.BasicServicesKit'; 5014 5015@Entry 5016@Component 5017struct WebComponent { 5018 controller: webview.WebviewController = new webview.WebviewController(); 5019 delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate(); 5020 5021 build() { 5022 Column() { 5023 Button('setDownloadDelegate') 5024 .onClick(() => { 5025 try { 5026 this.controller.setDownloadDelegate(this.delegate); 5027 } catch (error) { 5028 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5029 } 5030 }) 5031 Button('startDownload') 5032 .onClick(() => { 5033 try { 5034 this.controller.startDownload('https://www.example.com'); 5035 } catch (error) { 5036 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5037 } 5038 }) 5039 Web({ src: 'www.example.com', controller: this.controller }) 5040 } 5041 } 5042} 5043``` 5044 5045## getCustomUserAgent<sup>10+</sup> 5046 5047getCustomUserAgent(): string 5048 5049获取自定义用户代理。 5050 5051默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../web/web-default-userAgent.md) 5052 5053**系统能力:** SystemCapability.Web.Webview.Core 5054 5055**返回值:** 5056 5057| 类型 | 说明 | 5058| ------ | ------------------------- | 5059| string | 用户自定义代理信息。 | 5060 5061**错误码:** 5062 5063以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5064 5065| 错误码ID | 错误信息 | 5066| -------- | ------------------------------------------------------------ | 5067| 17100001 | Init error. The WebviewController must be associated with a Web component. | 5068 5069**示例:** 5070 5071```ts 5072// xxx.ets 5073import { webview } from '@kit.ArkWeb'; 5074import { BusinessError } from '@kit.BasicServicesKit'; 5075 5076@Entry 5077@Component 5078struct WebComponent { 5079 controller: webview.WebviewController = new webview.WebviewController(); 5080 @State userAgent: string = ''; 5081 5082 build() { 5083 Column() { 5084 Button('getCustomUserAgent') 5085 .onClick(() => { 5086 try { 5087 this.userAgent = this.controller.getCustomUserAgent(); 5088 console.info("userAgent: " + this.userAgent); 5089 } catch (error) { 5090 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5091 } 5092 }) 5093 Web({ src: 'www.example.com', controller: this.controller }) 5094 } 5095 } 5096} 5097``` 5098 5099## setAppCustomUserAgent<sup>20+</sup> 5100 5101static setAppCustomUserAgent(userAgent: string): void 5102 5103设置应用级自定义用户代理,会覆盖系统的用户代理,应用内所有Web组件生效。 5104 5105当需要设置应用级自定义用户代理时,建议在Web组件创建前调用setAppCustomUserAgent方法设置User-Agent,再创建指定src的Web组件或通过[loadUrl](#loadurl)加载具体页面。 5106 5107默认User-Agent定义与使用场景,及相关User-Agent接口定义优先级请参考[User-Agent开发指导](../../web/web-default-userAgent.md)。 5108 5109**系统能力:** SystemCapability.Web.Webview.Core 5110 5111**参数:** 5112 5113| 参数名 | 类型 | 必填 | 说明 | 5114| ---------------| ------- | ---- | ------------- | 5115| userAgent | string | 是 | 用户自定义代理信息。建议先使用[getDefaultUserAgent](#getdefaultuseragent14)获取当前默认用户代理,在此基础上追加自定义用户代理信息。 | 5116 5117**示例:** 5118 5119```ts 5120// xxx.ets 5121import { webview } from '@kit.ArkWeb'; 5122import { BusinessError } from '@kit.BasicServicesKit'; 5123 5124@Entry 5125@Component 5126struct WebComponent { 5127 controller: webview.WebviewController = new webview.WebviewController(); 5128 5129 aboutToAppear(): void { 5130 try { 5131 webview.WebviewController.initializeWebEngine(); 5132 let defaultUserAgent = webview.WebviewController.getDefaultUserAgent(); 5133 let appUA = defaultUserAgent + " appUA"; 5134 webview.WebviewController.setAppCustomUserAgent(appUA); 5135 } catch (error) { 5136 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5137 } 5138 } 5139 5140 build() { 5141 Column() { 5142 Web({ src: 'www.example.com', controller: this.controller }) 5143 } 5144 } 5145} 5146``` 5147 5148## setUserAgentForHosts<sup>20+</sup> 5149 5150static setUserAgentForHosts(userAgent: string, hosts: Array\<string>): void 5151 5152针对特定网站设置自定义用户代理,会覆盖系统的用户代理,应用内所有Web组件生效。 5153 5154当需要对特定网站设置自定义用户代理时,建议在Web组件创建前调用setUserAgentForHosts方法设置User-Agent,再创建指定src的Web组件或通过[loadUrl](#loadurl)加载具体页面。 5155 5156默认User-Agent定义与使用场景,及相关User-Agent接口定义优先级请参考[User-Agent开发指导](../../web/web-default-userAgent.md)。 5157 5158**系统能力:** SystemCapability.Web.Webview.Core 5159 5160**参数:** 5161 5162| 参数名 | 类型 | 必填 | 说明 | 5163| ---------------| ------- | ---- | ------------- | 5164| userAgent | string | 是 | 用户自定义代理信息。建议先使用[getDefaultUserAgent](#getdefaultuseragent14)获取当前默认用户代理,在此基础上追加自定义用户代理信息。 | 5165| hosts | Array\<string> | 是 | 用户自定义代理的相关域名列表,每次调用时仅保留最新传入的列表,并限制最大条目数为两万,超出部分自动截断。 | 5166 5167**错误码:** 5168 5169以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5170 5171| 错误码ID | 错误信息 | 5172| -------- | ------------------------------------------------------------ | 5173| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. | 5174 5175**示例:** 5176 5177```ts 5178// xxx.ets 5179import { webview } from '@kit.ArkWeb'; 5180import { BusinessError } from '@kit.BasicServicesKit'; 5181 5182@Entry 5183@Component 5184struct WebComponent { 5185 controller: webview.WebviewController = new webview.WebviewController(); 5186 5187 aboutToAppear(): void { 5188 try { 5189 webview.WebviewController.initializeWebEngine(); 5190 let defaultUserAgent = webview.WebviewController.getDefaultUserAgent(); 5191 let appUA = defaultUserAgent + " appUA"; 5192 webview.WebviewController.setUserAgentForHosts( 5193 appUA, 5194 [ 5195 "www.example.com", 5196 "www.baidu.com" 5197 ] 5198 ); 5199 } catch (error) { 5200 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5201 } 5202 } 5203 5204 build() { 5205 Column() { 5206 Web({ src: 'www.example.com', controller: this.controller }) 5207 } 5208 } 5209} 5210``` 5211 5212## setConnectionTimeout<sup>11+</sup> 5213 5214static setConnectionTimeout(timeout: number): void 5215 5216设置网络连接超时时间,使用者可通过Web组件中的onErrorReceive方法获取超时错误码。 5217 5218**系统能力:** SystemCapability.Web.Webview.Core 5219 5220**参数:** 5221 5222| 参数名 | 类型 | 必填 | 说明 | 5223| ---------------| ------- | ---- | ------------- | 5224| timeout | number | 是 | socket连接超时时间,以秒为单位,必须为大于0的整数。 | 5225 5226**错误码:** 5227 5228以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5229 5230| 错误码ID | 错误信息 | 5231| -------- | ------------------------------------------------------------ | 5232| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. | 5233 5234**示例:** 5235 5236```ts 5237// xxx.ets 5238import { webview } from '@kit.ArkWeb'; 5239import { BusinessError } from '@kit.BasicServicesKit'; 5240 5241@Entry 5242@Component 5243struct WebComponent { 5244 controller: webview.WebviewController = new webview.WebviewController(); 5245 5246 build() { 5247 Column() { 5248 Button('setConnectionTimeout') 5249 .onClick(() => { 5250 try { 5251 webview.WebviewController.setConnectionTimeout(5); 5252 console.info("setConnectionTimeout: 5s"); 5253 } catch (error) { 5254 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5255 } 5256 }) 5257 Web({ src: 'www.example.com', controller: this.controller }) 5258 .onErrorReceive((event) => { 5259 if (event) { 5260 console.info('getErrorInfo:' + event.error.getErrorInfo()); 5261 console.info('getErrorCode:' + event.error.getErrorCode()); 5262 } 5263 }) 5264 } 5265 } 5266} 5267``` 5268 5269## warmupServiceWorker<sup>12+</sup> 5270 5271static warmupServiceWorker(url: string): void 5272 5273预热ServiceWorker,以提升首屏页面的加载速度(仅限于会使用ServiceWorker的页面)。在加载url之前调用此API。 5274 5275**系统能力:** SystemCapability.Web.Webview.Core 5276 5277**参数:** 5278 5279| 参数名 | 类型 | 必填 | 说明 | 5280| ---------------| ------- | ---- | ------------- | 5281| url | string | 是 | 需要预热ServiceWorker的url。| 5282 5283**错误码:** 5284 5285以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5286 5287| 错误码ID | 错误信息 | 5288| -------- | ------------------------------------------------------------ | 5289| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048. | 5290 5291**示例:** 5292 5293```ts 5294// xxx.ts 5295import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 5296import { hilog } from '@kit.PerformanceAnalysisKit'; 5297import { window } from '@kit.ArkUI'; 5298import { webview } from '@kit.ArkWeb'; 5299 5300export default class EntryAbility extends UIAbility { 5301 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 5302 console.info("EntryAbility onCreate"); 5303 webview.WebviewController.initializeWebEngine(); 5304 webview.WebviewController.warmupServiceWorker("https://www.example.com"); 5305 AppStorage.setOrCreate("abilityWant", want); 5306 } 5307} 5308``` 5309 5310## enableSafeBrowsing<sup>11+</sup> 5311 5312enableSafeBrowsing(enable: boolean): void 5313 5314启用检查网站安全风险的功能,非法和欺诈网站是强制启用的,不能通过此功能禁用。 5315本功能默认不生效,OpenHarmony只提供恶意网址拦截页WebUI,网址风险检测以及显示WebUI的功能由Vendor实现。推荐在WebContentsObserver中监听跳转[DidStartNavigation](https://gitcode.com/openharmony-tpc/chromium_src/blob/master/content/public/browser/web_contents_observer.h#:~:text=virtual%20void-,DidStartNavigation)、[DidRedirectNavigation](https://gitcode.com/openharmony-tpc/chromium_src/blob/master/content/public/browser/web_contents_observer.h#:~:text=virtual%20void-,DidRedirectNavigation)进行检测。 5316 5317> **说明:** 5318> 5319> 该接口不生效,调用不会产生任何实际效果。 5320 5321**系统能力:** SystemCapability.Web.Webview.Core 5322 5323**参数:** 5324 5325| 参数名 | 类型 | 必填 | 说明 | 5326| --------| ------- | ---- | ---------------------------| 5327| enable | boolean | 是 | 是否启用检查网站安全风险的功能。<br>true表示启用检查网站安全风险的功能,false表示不启用检查网站安全风险的功能。<br>默认值:false。 | 5328 5329**错误码:** 5330 5331以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5332 5333| 错误码ID | 错误信息 | 5334| -------- | ----------------------- | 5335| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 5336 5337**示例:** 5338 5339```ts 5340// xxx.ets 5341import { webview } from '@kit.ArkWeb'; 5342import { BusinessError } from '@kit.BasicServicesKit'; 5343 5344@Entry 5345@Component 5346struct WebComponent { 5347 controller: webview.WebviewController = new webview.WebviewController(); 5348 5349 build() { 5350 Column() { 5351 Button('enableSafeBrowsing') 5352 .onClick(() => { 5353 try { 5354 this.controller.enableSafeBrowsing(true); 5355 console.info("enableSafeBrowsing: true"); 5356 } catch (error) { 5357 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5358 } 5359 }) 5360 Web({ src: 'www.example.com', controller: this.controller }) 5361 } 5362 } 5363} 5364``` 5365 5366## isSafeBrowsingEnabled<sup>11+</sup> 5367 5368isSafeBrowsingEnabled(): boolean 5369 5370获取当前网页是否启用了检查网站安全风险。 5371 5372**系统能力:** SystemCapability.Web.Webview.Core 5373 5374**返回值:** 5375 5376| 类型 | 说明 | 5377| ------- | --------------------------------------- | 5378| boolean | 当前网页是否启用了检查网站安全风险的功能。<br>true表示启用了检查网站安全风险的功能,false表示未启用检查网站安全风险的功能。<br>默认值:false。 | 5379 5380**示例:** 5381 5382```ts 5383// xxx.ets 5384import { webview } from '@kit.ArkWeb'; 5385 5386@Entry 5387@Component 5388struct WebComponent { 5389 controller: webview.WebviewController = new webview.WebviewController(); 5390 5391 build() { 5392 Column() { 5393 Button('isSafeBrowsingEnabled') 5394 .onClick(() => { 5395 let result = this.controller.isSafeBrowsingEnabled(); 5396 console.info("result: " + result); 5397 }) 5398 Web({ src: 'www.example.com', controller: this.controller }) 5399 } 5400 } 5401} 5402``` 5403 5404## enableIntelligentTrackingPrevention<sup>12+</sup> 5405 5406enableIntelligentTrackingPrevention(enable: boolean): void 5407 5408启用智能防跟踪功能。 5409 5410**系统能力:** SystemCapability.Web.Webview.Core 5411 5412**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。 5413 5414**参数:** 5415 5416| 参数名 | 类型 | 必填 | 说明 | 5417| --------| ------- | ---- | ---------------------------| 5418| enable | boolean | 是 | 是否启用智能防跟踪功能。<br>true表示启用智能防跟踪功能,false表示不启用智能防跟踪功能。<br>默认值:false。 | 5419 5420**错误码:** 5421 5422以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5423 5424| 错误码ID | 错误信息 | 5425| -------- | ----------------------- | 5426| 17100001 | Init error. The WebviewController must be associated with a Web component. | 5427| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 5428| 801 | Capability not supported. | 5429 5430**示例:** 5431 5432```ts 5433// xxx.ets 5434import { webview } from '@kit.ArkWeb'; 5435import { BusinessError } from '@kit.BasicServicesKit'; 5436 5437@Entry 5438@Component 5439struct WebComponent { 5440 controller: webview.WebviewController = new webview.WebviewController(); 5441 5442 build() { 5443 Column() { 5444 Button('enableIntelligentTrackingPrevention') 5445 .onClick(() => { 5446 try { 5447 this.controller.enableIntelligentTrackingPrevention(true); 5448 console.info("enableIntelligentTrackingPrevention: true"); 5449 } catch (error) { 5450 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5451 } 5452 }) 5453 Web({ src: 'www.example.com', controller: this.controller }) 5454 } 5455 } 5456} 5457``` 5458 5459## isIntelligentTrackingPreventionEnabled<sup>12+</sup> 5460 5461isIntelligentTrackingPreventionEnabled(): boolean 5462 5463获取当前Web是否启用了智能防跟踪功能。 5464 5465**系统能力:** SystemCapability.Web.Webview.Core 5466 5467**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。 5468 5469**返回值:** 5470 5471| 类型 | 说明 | 5472| ------- | --------------------------------------- | 5473| boolean | 当前Web是否启用了智能防跟踪功能。<br>true表示启用了智能防跟踪功能,false表示未启用智能防跟踪功能。<br>默认值:false。 | 5474 5475**错误码:** 5476 5477以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5478 5479| 错误码ID | 错误信息 | 5480| -------- | ----------------------- | 5481| 17100001 | Init error. The WebviewController must be associated with a Web component. | 5482| 801 | Capability not supported. | 5483 5484**示例:** 5485 5486```ts 5487// xxx.ets 5488import { webview } from '@kit.ArkWeb'; 5489import { BusinessError } from '@kit.BasicServicesKit'; 5490 5491@Entry 5492@Component 5493struct WebComponent { 5494 controller: webview.WebviewController = new webview.WebviewController(); 5495 5496 build() { 5497 Column() { 5498 Button('isIntelligentTrackingPreventionEnabled') 5499 .onClick(() => { 5500 try { 5501 let result = this.controller.isIntelligentTrackingPreventionEnabled(); 5502 console.info("result: " + result); 5503 } catch (error) { 5504 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5505 } 5506 }) 5507 Web({ src: 'www.example.com', controller: this.controller }) 5508 } 5509 } 5510} 5511``` 5512 5513## addIntelligentTrackingPreventionBypassingList<sup>12+</sup> 5514 5515static addIntelligentTrackingPreventionBypassingList(hostList: Array\<string>): void 5516 5517添加智能防跟踪功能绕过的域名列表。 5518 5519**系统能力:** SystemCapability.Web.Webview.Core 5520 5521**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。 5522 5523**参数:** 5524 5525| 参数名 | 类型 | 必填 | 说明 | 5526| ----------- | ------------- | ---- | ------------------------ | 5527| hostList | Array\<string> | 是 | 绕过智能防跟踪功能的域名列表。 | 5528 5529**错误码:** 5530 5531以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5532 5533| 错误码ID | 错误信息 | 5534| -------- | ------------------------ | 5535| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 5536| 801 | Capability not supported. | 5537 5538**示例:** 5539 5540```ts 5541// xxx.ets 5542import { webview } from '@kit.ArkWeb'; 5543import { BusinessError } from '@kit.BasicServicesKit'; 5544 5545@Entry 5546@Component 5547struct WebComponent { 5548 controller: webview.WebviewController = new webview.WebviewController(); 5549 5550 build() { 5551 Column() { 5552 Button('addIntelligentTrackingPreventionBypassingList') 5553 .onClick(() => { 5554 try { 5555 let hostList = ["www.test1.com", "www.test2.com", "www.test3.com"]; 5556 webview.WebviewController.addIntelligentTrackingPreventionBypassingList(hostList); 5557 } catch (error) { 5558 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5559 } 5560 }) 5561 Web({ src: 'www.example.com', controller: this.controller }) 5562 } 5563 } 5564} 5565``` 5566 5567## removeIntelligentTrackingPreventionBypassingList<sup>12+</sup> 5568 5569static removeIntelligentTrackingPreventionBypassingList(hostList: Array\<string>): void 5570 5571删除通过addIntelligentTrackingPreventionBypassingList接口添加的部分域名列表。 5572 5573**系统能力:** SystemCapability.Web.Webview.Core 5574 5575**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。 5576 5577**参数:** 5578 5579| 参数名 | 类型 | 必填 | 说明 | 5580| ----------- | ------------- | ---- | ------------------------ | 5581| hostList | Array\<string> | 是 | 绕过智能防跟踪功能的域名列表。 | 5582 5583**错误码:** 5584 5585以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5586 5587| 错误码ID | 错误信息 | 5588| -------- | ------------------------ | 5589| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 5590| 801 | Capability not supported. | 5591 5592**示例:** 5593 5594```ts 5595// xxx.ets 5596import { webview } from '@kit.ArkWeb'; 5597import { BusinessError } from '@kit.BasicServicesKit'; 5598 5599@Entry 5600@Component 5601struct WebComponent { 5602 controller: webview.WebviewController = new webview.WebviewController(); 5603 5604 build() { 5605 Column() { 5606 Button('removeIntelligentTrackingPreventionBypassingList') 5607 .onClick(() => { 5608 try { 5609 let hostList = ["www.test1.com", "www.test2.com"]; 5610 webview.WebviewController.removeIntelligentTrackingPreventionBypassingList(hostList); 5611 } catch (error) { 5612 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5613 } 5614 }) 5615 Web({ src: 'www.example.com', controller: this.controller }) 5616 } 5617 } 5618} 5619``` 5620 5621## clearIntelligentTrackingPreventionBypassingList<sup>12+</sup> 5622 5623static clearIntelligentTrackingPreventionBypassingList(): void 5624 5625删除通过addIntelligentTrackingPreventionBypassingList接口添加的所有域名。 5626 5627**系统能力:** SystemCapability.Web.Webview.Core 5628 5629**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。 5630 5631**错误码:** 5632 5633以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5634 5635| 错误码ID | 错误信息 | 5636| -------- | ------------------------ | 5637| 801 | Capability not supported. | 5638 5639**示例:** 5640 5641```ts 5642// xxx.ets 5643import { webview } from '@kit.ArkWeb'; 5644 5645@Entry 5646@Component 5647struct WebComponent { 5648 controller: webview.WebviewController = new webview.WebviewController(); 5649 5650 build() { 5651 Column() { 5652 Button('clearIntelligentTrackingPreventionBypassingList') 5653 .onClick(() => { 5654 webview.WebviewController.clearIntelligentTrackingPreventionBypassingList(); 5655 }) 5656 Web({ src: 'www.example.com', controller: this.controller }) 5657 } 5658 } 5659} 5660``` 5661 5662## getDefaultUserAgent<sup>14+</sup> 5663 5664static getDefaultUserAgent(): string 5665 5666获取默认用户代理。 5667 5668此接口只允许在UI线程调用。 5669 5670默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../web/web-default-userAgent.md) 5671 5672**系统能力:** SystemCapability.Web.Webview.Core 5673 5674**返回值:** 5675 5676| 类型 | 说明 | 5677| ------ | ------------ | 5678| string | ArkWeb默认User-Agent字符串。 | 5679 5680**示例:** 5681 5682```ts 5683// xxx.ets 5684import { webview } from '@kit.ArkWeb'; 5685import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 5686 5687export default class EntryAbility extends UIAbility { 5688 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 5689 console.info("EntryAbility onCreate"); 5690 webview.WebviewController.initializeWebEngine(); 5691 let defaultUserAgent = webview.WebviewController.getDefaultUserAgent(); 5692 console.info("defaultUserAgent: " + defaultUserAgent); 5693 } 5694} 5695``` 5696 5697## enableAdsBlock<sup>12+</sup> 5698 5699enableAdsBlock(enable: boolean): void 5700 5701启用广告过滤功能。 5702 5703**系统能力:** SystemCapability.Web.Webview.Core 5704 5705**参数:** 5706 5707| 参数名 | 类型 | 必填 | 说明 | 5708| --------| ------- | ---- | ---------------------------| 5709| enable | boolean | 是 | 是否启用广告过滤功能。<br>true表示启用广告过滤功能,false表示取消广告过滤功能。<br>默认值:false。 | 5710 5711**错误码:** 5712 5713> **说明:** 5714> 5715> 从API version 18开始,在不支持广告过滤功能的设备上调用该API会抛出801异常。 5716 5717以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5718 5719| 错误码ID | 错误信息 | 5720| -------- | ----------------------- | 5721| 17100001 | Init error. The WebviewController must be associated with a Web component. | 5722| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Parameter string is too long. 3.Parameter verification failed. | 5723| 801 | Capability not supported. | 5724 5725**示例:** 5726 5727```ts 5728// xxx.ets 5729import { webview } from '@kit.ArkWeb'; 5730import { BusinessError } from '@kit.BasicServicesKit'; 5731 5732@Entry 5733@Component 5734struct WebComponent { 5735 controller: webview.WebviewController = new webview.WebviewController(); 5736 5737 build() { 5738 Column() { 5739 Button('enableAdsBlock') 5740 .onClick(() => { 5741 try { 5742 this.controller.enableAdsBlock(true); 5743 console.info("enableAdsBlock: true") 5744 } catch (error) { 5745 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5746 } 5747 }) 5748 Web({ src: 'www.example.com', controller: this.controller }) 5749 } 5750 } 5751} 5752``` 5753 5754## isAdsBlockEnabled<sup>12+</sup> 5755 5756isAdsBlockEnabled() : boolean 5757 5758查询广告过滤功能是否开启。 5759 5760**系统能力:** SystemCapability.Web.Webview.Core 5761 5762**返回值:** 5763 5764| 类型 | 说明 | 5765| ------------------------------------------------------------ | ---------------------- | 5766| boolean | 返回true代表广告过滤功能已开启,返回false代表广告过滤功能关闭。<br>默认值:false。 | 5767 5768**错误码:** 5769 5770> **说明:** 5771> 5772> 从API version 18开始,在不支持广告过滤功能的设备上调用该API会抛出801异常。 5773 5774以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5775 5776| 错误码ID | 错误信息 | 5777| -------- | ----------------------- | 5778| 801 | Capability not supported. | 5779 5780**示例:** 5781 5782```ts 5783// xxx.ets 5784import { webview } from '@kit.ArkWeb'; 5785import { BusinessError } from '@kit.BasicServicesKit'; 5786 5787@Entry 5788@Component 5789struct WebComponent { 5790 controller: webview.WebviewController = new webview.WebviewController(); 5791 5792 build() { 5793 Column() { 5794 Button('isAdsBlockEnabled') 5795 .onClick(() => { 5796 try { 5797 let isAdsBlockEnabled: boolean = this.controller.isAdsBlockEnabled(); 5798 console.info("isAdsBlockEnabled:", isAdsBlockEnabled); 5799 } catch (error) { 5800 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5801 } 5802 }) 5803 Web({ src: 'www.example.com', controller: this.controller }) 5804 } 5805 } 5806} 5807``` 5808 5809## isAdsBlockEnabledForCurPage<sup>12+</sup> 5810 5811isAdsBlockEnabledForCurPage() : boolean 5812 5813查询当前网页是否开启广告过滤功能。 5814当Web组件使能广告过滤功能后,默认所有页面都是开启广告过滤的,支持通过[addAdsBlockDisallowedList](./arkts-apis-webview-AdsBlockManager.md#addadsblockdisallowedlist12)指定域名禁用广告过滤。 5815 5816**系统能力:** SystemCapability.Web.Webview.Core 5817 5818**返回值:** 5819 5820| 类型 | 说明 | 5821| ------------------------------------------------------------ | ---------------------- | 5822| boolean | 返回true代表此网页已开启广告过滤,返回false代表当前网页已关闭广告过滤。 | 5823 5824**错误码:** 5825 5826> **说明:** 5827> 5828> 从API version 18开始,在不支持广告过滤功能的设备上调用该API会抛出801异常。 5829 5830以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5831 5832| 错误码ID | 错误信息 | 5833| -------- | ----------------------- | 5834| 801 | Capability not supported. | 5835 5836**示例:** 5837 5838```ts 5839// xxx.ets 5840import { webview } from '@kit.ArkWeb'; 5841import { BusinessError } from '@kit.BasicServicesKit'; 5842 5843@Entry 5844@Component 5845struct WebComponent { 5846 controller: webview.WebviewController = new webview.WebviewController(); 5847 5848 build() { 5849 Column() { 5850 Button('isAdsBlockEnabledForCurPage') 5851 .onClick(() => { 5852 try { 5853 let isAdsBlockEnabledForCurPage: boolean = this.controller.isAdsBlockEnabledForCurPage(); 5854 console.info("isAdsBlockEnabledForCurPage:", isAdsBlockEnabledForCurPage); 5855 } catch (error) { 5856 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5857 } 5858 }) 5859 Web({ src: 'www.example.com', controller: this.controller }) 5860 } 5861 } 5862} 5863``` 5864 5865## setRenderProcessMode<sup>12+</sup> 5866 5867static setRenderProcessMode(mode: RenderProcessMode): void 5868 5869设置ArkWeb渲染子进程模式。 5870 5871**系统能力:** SystemCapability.Web.Webview.Core 5872 5873**参数:** 5874 5875| 参数名 | 类型 | 必填 | 说明 | 5876| ----------- | ------------- | ---- | ------------------------ | 5877| mode | [RenderProcessMode](./arkts-apis-webview-e.md#renderprocessmode12)| 是 | 渲染子进程模式。<br>可以先调用[getRenderProcessMode()](#getrenderprocessmode12)查看当前设备的ArkWeb渲染子进程模式,枚举值0为单子进程模式,枚举值1为多子进程模式。<br>手机默认为单渲染子进程模式,平板和PC/2in1默认为多渲染子进程模式。<br>如果传入RenderProcessMode枚举值之外的非法数字,则默认识别为多渲染子进程模式。 | 5878 5879**错误码:** 5880 5881以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5882 5883| 错误码ID | 错误信息 | 5884| -------- | ------------------------ | 5885| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 5886 5887**示例:** 5888 5889```ts 5890// xxx.ets 5891import { webview } from '@kit.ArkWeb'; 5892import { BusinessError } from '@kit.BasicServicesKit'; 5893 5894@Entry 5895@Component 5896struct WebComponent { 5897 controller: webview.WebviewController = new webview.WebviewController(); 5898 5899 build() { 5900 Column() { 5901 Button('setRenderProcessMode') 5902 .onClick(() => { 5903 try { 5904 webview.WebviewController.setRenderProcessMode(webview.RenderProcessMode.MULTIPLE); 5905 } catch (error) { 5906 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 5907 } 5908 }) 5909 Web({ src: 'www.example.com', controller: this.controller }) 5910 } 5911 } 5912} 5913``` 5914## getRenderProcessMode<sup>12+</sup> 5915 5916static getRenderProcessMode(): RenderProcessMode 5917 5918查询ArkWeb的渲染子进程模式。 5919 5920**系统能力:** SystemCapability.Web.Webview.Core 5921 5922**返回值:** 5923 5924| 类型 | 说明 | 5925| ----------------------------------------- | ------------------------------------------------------------ | 5926| [RenderProcessMode](./arkts-apis-webview-e.md#renderprocessmode12) | 渲染子进程模式类型。<br>调用getRenderProcessMode()获取当前设备的ArkWeb渲染子进程模式,枚举值0为单子进程模式,枚举值1为多子进程模式。<br>如果获取的值不在RenderProcessMode枚举值范围内,则默认为多渲染子进程模式。 | 5927 5928 5929**示例:** 5930 5931```ts 5932// xxx.ets 5933import { webview } from '@kit.ArkWeb'; 5934 5935@Entry 5936@Component 5937struct WebComponent { 5938 controller: webview.WebviewController = new webview.WebviewController(); 5939 5940 build() { 5941 Column() { 5942 Button('getRenderProcessMode') 5943 .onClick(() => { 5944 let mode = webview.WebviewController.getRenderProcessMode(); 5945 console.info("getRenderProcessMode: " + mode); 5946 }) 5947 Web({ src: 'www.example.com', controller: this.controller }) 5948 } 5949 } 5950} 5951``` 5952 5953## terminateRenderProcess<sup>12+</sup> 5954 5955terminateRenderProcess(): boolean 5956 5957销毁渲染进程。 5958 5959调用该接口将会主动销毁相关联的渲染进程。如果渲染进程尚未启动,或者已销毁则没有任何影响。此外销毁渲染进程会同时影响所有与该渲染进程关联的其他实例。 5960 5961**系统能力:** SystemCapability.Web.Webview.Core 5962 5963**返回值:** 5964 5965| 类型 | 说明 | 5966| ------------------------------------------------------------ | ---------------------- | 5967| boolean | 返回销毁渲染进程的结果。<br>返回true表示渲染进程可以被销毁或已被销毁,返回false表示渲染进程不可以被销毁。| 5968 5969**错误码:** 5970 5971以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 5972 5973| 错误码ID | 错误信息 | 5974| -------- | ------------------------------------------------------------ | 5975| 17100001 | Init error. The WebviewController must be associated with a Web component. | 5976 5977**示例:** 5978 5979```ts 5980// xxx.ets 5981import { webview } from '@kit.ArkWeb'; 5982 5983@Entry 5984@Component 5985struct WebComponent { 5986 controller: webview.WebviewController = new webview.WebviewController(); 5987 5988 build() { 5989 Column() { 5990 Button('terminateRenderProcess') 5991 .onClick(() => { 5992 let result = this.controller.terminateRenderProcess(); 5993 console.info("terminateRenderProcess result: " + result); 5994 }) 5995 Web({ src: 'www.example.com', controller: this.controller }) 5996 } 5997 } 5998} 5999``` 6000 6001## postUrl<sup>11+</sup> 6002 6003postUrl(url: string, postData: ArrayBuffer): void 6004 6005使用"POST"方法加载带有postData的url。如果url不是网络url,则会使用[loadUrl](#loadurl)方法加载url,忽略postData参数。 6006 6007**系统能力:** SystemCapability.Web.Webview.Core 6008 6009**参数:** 6010 6011| 参数名 | 类型 | 必填 | 说明 | 6012| ------- | ---------------- | ---- | :-------------------- | 6013| url | string | 是 | 需要加载的 URL。 | 6014| postData | ArrayBuffer | 是 | 使用"POST"方法传递数据。 该请求必须采用"application/x-www-form-urlencoded"编码。| 6015 6016**错误码:** 6017 6018以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6019 6020| 错误码ID | 错误信息 | 6021| -------- | ------------------------------------------------------------ | 6022| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6023| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048. | 6024| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 6025 6026**示例:** 6027 6028```ts 6029// xxx.ets 6030import { webview } from '@kit.ArkWeb'; 6031import { BusinessError } from '@kit.BasicServicesKit'; 6032 6033class TestObj { 6034 constructor() { 6035 } 6036 6037 test(str: string): ArrayBuffer { 6038 let buf = new ArrayBuffer(str.length); 6039 let buff = new Uint8Array(buf); 6040 6041 for (let i = 0; i < str.length; i++) { 6042 buff[i] = str.charCodeAt(i); 6043 } 6044 return buf; 6045 } 6046} 6047 6048@Entry 6049@Component 6050struct WebComponent { 6051 controller: webview.WebviewController = new webview.WebviewController(); 6052 @State testObjtest: TestObj = new TestObj(); 6053 6054 build() { 6055 Column() { 6056 Button('postUrl') 6057 .onClick(() => { 6058 try { 6059 // 数据转化为ArrayBuffer类型。 6060 let postData = this.testObjtest.test("Name=test&Password=test"); 6061 this.controller.postUrl('www.example.com', postData); 6062 } catch (error) { 6063 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6064 } 6065 }) 6066 Web({ src: '', controller: this.controller }) 6067 } 6068 } 6069} 6070``` 6071 6072## createWebPrintDocumentAdapter<sup>11+</sup> 6073 6074createWebPrintDocumentAdapter(jobName: string): print.PrintDocumentAdapter 6075 6076创建web相关打印功能。 6077 6078**系统能力:** SystemCapability.Web.Webview.Core 6079 6080**参数:** 6081 6082| 参数名 | 类型 | 必填 | 说明 | 6083| ------- | ------ | ---- | :-------------------- | 6084| jobName | string | 是 | 需要打印的文件名。 | 6085 6086**返回值:** 6087 6088| 类型 | 说明 | 6089| -------------------- | ------------------------- | 6090| print.[PrintDocumentAdapter](../apis-basic-services-kit/js-apis-print.md#printdocumentadapter11) | 返回打印文档的适配器。 | 6091 6092**错误码:** 6093 6094以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6095 6096| 错误码ID | 错误信息 | 6097| -------- | -------------------------------------------------------------------------- | 6098| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 6099| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6100 6101**示例:** 6102 6103```ts 6104// xxx.ets 6105import { webview } from '@kit.ArkWeb'; 6106import { BusinessError, print } from '@kit.BasicServicesKit'; 6107 6108@Entry 6109@Component 6110struct WebComponent { 6111 controller: webview.WebviewController = new webview.WebviewController(); 6112 6113 build() { 6114 Column() { 6115 Button('createWebPrintDocumentAdapter') 6116 .onClick(() => { 6117 try { 6118 let webPrintDocadapter = this.controller.createWebPrintDocumentAdapter('example.pdf'); 6119 print.print('example_jobid', webPrintDocadapter, null, this.getUIContext().getHostContext()); 6120 } catch (error) { 6121 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6122 } 6123 }) 6124 Web({ src: 'www.example.com', controller: this.controller }) 6125 } 6126 } 6127} 6128``` 6129## isIncognitoMode<sup>11+</sup> 6130 6131isIncognitoMode(): boolean 6132 6133查询当前是否是隐私模式的Webview。 6134 6135**系统能力:** SystemCapability.Web.Webview.Core 6136 6137**返回值:** 6138 6139| 类型 | 说明 | 6140| -------------------- | ------------------------- | 6141| boolean | 返回是否是隐私模式的Webview。<br>true表示是隐私模式,false表示不是隐私模式。<br>默认为false。 | 6142 6143**错误码:** 6144 6145以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6146 6147| 错误码ID | 错误信息 | 6148| -------- | -------------------------------------------------------------------------- | 6149| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6150 6151**示例:** 6152 6153```ts 6154// xxx.ets 6155import { webview } from '@kit.ArkWeb'; 6156import { BusinessError } from '@kit.BasicServicesKit'; 6157 6158@Entry 6159@Component 6160struct WebComponent { 6161 controller: webview.WebviewController = new webview.WebviewController(); 6162 6163 build() { 6164 Column() { 6165 Button('isIncognitoMode') 6166 .onClick(() => { 6167 try { 6168 let result = this.controller.isIncognitoMode(); 6169 console.info('isIncognitoMode' + result); 6170 } catch (error) { 6171 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6172 } 6173 }) 6174 Web({ src: 'www.example.com', controller: this.controller }) 6175 } 6176 } 6177} 6178``` 6179 6180## getSecurityLevel<sup>11+</sup> 6181 6182getSecurityLevel(): SecurityLevel 6183 6184获取当前网页的安全级别。 6185 6186**系统能力:** SystemCapability.Web.Webview.Core 6187 6188**返回值:** 6189 6190| 类型 | 说明 | 6191| ----------------------------------- | --------------------------- | 6192| [SecurityLevel](./arkts-apis-webview-e.md#securitylevel11) | 当前网页的安全级别,具体值为NONE、SECURE、WARNING、DANGEROUS。 | 6193 6194**错误码:** 6195 6196以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6197 6198| 错误码ID | 错误信息 | 6199| -------- | ------------------------------------------------------------ | 6200| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6201 6202**示例:** 6203 6204```ts 6205import { webview } from '@kit.ArkWeb'; 6206 6207@Entry 6208@Component 6209struct WebComponent { 6210 controller: webview.WebviewController = new webview.WebviewController(); 6211 6212 build() { 6213 Column() { 6214 Web({ src: 'www.example.com', controller: this.controller }) 6215 .onPageEnd((event) => { 6216 if (event) { 6217 let securityLevel = this.controller.getSecurityLevel(); 6218 console.info('securityLevel: ', securityLevel); 6219 } 6220 }) 6221 } 6222 } 6223} 6224``` 6225 6226## setScrollable<sup>12+</sup> 6227 6228setScrollable(enable: boolean, type?: ScrollType): void 6229 6230设置网页是否允许滚动。 6231 6232**系统能力:** SystemCapability.Web.Webview.Core 6233 6234**参数:** 6235 6236| 参数名 | 类型 | 必填 | 说明 | 6237| ------ | -------- | ---- | ---------------------- | 6238| enable | boolean | 是 | 表示是否将网页设置为允许滚动。<br>true表示设置为允许滚动,false表示禁止滚动。<br>默认值:true。 | 6239| type | [ScrollType](./arkts-apis-webview-e.md#scrolltype12) | 否 | 网页可触发的滚动类型,支持缺省配置。<br/> - enable为false时,表示禁止ScrollType类型的滚动,当ScrollType缺省时表示禁止所有类型网页滚动。<br/> - enable为true时,ScrollType缺省与否,都表示允许所有类型的网页滚动。| 6240 6241**错误码:** 6242 6243以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6244 6245| 错误码ID | 错误信息 | 6246| -------- | ------------------------------------------------------------ | 6247| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. | 6248| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6249 6250**示例:** 6251 6252```ts 6253// xxx.ets 6254import { webview } from '@kit.ArkWeb'; 6255import { BusinessError } from '@kit.BasicServicesKit'; 6256 6257@Entry 6258@Component 6259struct WebComponent { 6260 controller: webview.WebviewController = new webview.WebviewController(); 6261 6262 build() { 6263 Column() { 6264 Button('setScrollable') 6265 .onClick(() => { 6266 try { 6267 this.controller.setScrollable(true); 6268 } catch (error) { 6269 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6270 } 6271 }) 6272 Web({ src: 'www.example.com', controller: this.controller }) 6273 } 6274 } 6275} 6276``` 6277 6278## getScrollable<sup>12+</sup> 6279 6280getScrollable(): boolean 6281 6282获取当前网页是否允许滚动。 6283 6284**系统能力:** SystemCapability.Web.Webview.Core 6285 6286**返回值:** 6287 6288| 类型 | 说明 | 6289| ------ | -------------- | 6290| boolean | 当前网页是否允许滚动。<br>true为允许滚动,false为禁止滚动。 | 6291 6292**错误码:** 6293 6294以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6295 6296| 错误码ID | 错误信息 | 6297| -------- | ------------------------------------------------------------ | 6298| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6299 6300**示例:** 6301 6302```ts 6303// xxx.ets 6304import { webview } from '@kit.ArkWeb'; 6305import { BusinessError } from '@kit.BasicServicesKit'; 6306 6307@Entry 6308@Component 6309struct WebComponent { 6310 controller: webview.WebviewController = new webview.WebviewController(); 6311 6312 build() { 6313 Column() { 6314 Button('getScrollable') 6315 .onClick(() => { 6316 try { 6317 let scrollEnabled = this.controller.getScrollable(); 6318 console.info("scrollEnabled: " + scrollEnabled); 6319 } catch (error) { 6320 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6321 } 6322 }) 6323 Web({ src: 'www.example.com', controller: this.controller }) 6324 } 6325 } 6326} 6327``` 6328 6329## setPrintBackground<sup>12+</sup> 6330 6331setPrintBackground(enable: boolean): void 6332 6333设置是否打印网页背景。 6334 6335**系统能力:** SystemCapability.Web.Webview.Core 6336 6337**参数:** 6338 6339| 参数名 | 类型 | 必填 | 说明 | 6340| -------- | ------- | ---- | -------------------------------------- | 6341| enable | boolean | 是 | 表示是否打印网页背景。<br>true表示设置为打印网页背景,false表示取消网页背景打印。 | 6342 6343**错误码:** 6344 6345以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6346 6347| 错误码ID | 错误信息 | 6348| -------- | ------------------------------------------------------------ | 6349| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 6350| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6351 6352**示例:** 6353 6354```ts 6355import { webview } from '@kit.ArkWeb'; 6356import { BusinessError } from '@kit.BasicServicesKit'; 6357 6358@Entry 6359@Component 6360struct WebComponent { 6361 controller: webview.WebviewController = new webview.WebviewController(); 6362 6363 build() { 6364 Column() { 6365 Button('setPrintBackground') 6366 .onClick(() => { 6367 try { 6368 this.controller.setPrintBackground(false); 6369 } catch (error) { 6370 console.error(`ErrorCode:${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6371 } 6372 }) 6373 Web({ src: 'www.example.com', controller: this.controller }) 6374 } 6375 } 6376} 6377``` 6378 6379## getPrintBackground<sup>12+</sup> 6380 6381getPrintBackground(): boolean 6382 6383查询webview是否打印网页背景。 6384 6385**系统能力:** SystemCapability.Web.Webview.Core 6386 6387**返回值:** 6388 6389| 类型 | 说明 | 6390| -------------------- | ------------------------- | 6391| boolean | 返回Webview是否打印网页背景。<br>true:打印网页背景;false:不打印网页背景。 | 6392 6393**错误码:** 6394 6395以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6396 6397| 错误码ID | 错误信息 | 6398| -------- | ------------------------------------------------------------ | 6399| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6400 6401**示例:** 6402 6403```ts 6404import { webview } from '@kit.ArkWeb'; 6405import { BusinessError } from '@kit.BasicServicesKit'; 6406 6407@Entry 6408@Component 6409struct WebComponent { 6410 controller: webview.WebviewController = new webview.WebviewController(); 6411 6412 build() { 6413 Column() { 6414 Button('setPrintBackground') 6415 .onClick(() => { 6416 try { 6417 let enable = this.controller.getPrintBackground(); 6418 console.info("getPrintBackground: " + enable); 6419 } catch (error) { 6420 console.error(`ErrorCode:${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6421 } 6422 }) 6423 Web({ src: 'www.example.com', controller: this.controller }) 6424 } 6425 } 6426} 6427``` 6428 6429## getLastJavascriptProxyCallingFrameUrl<sup>12+</sup> 6430 6431getLastJavascriptProxyCallingFrameUrl(): string 6432 6433通过[registerJavaScriptProxy](#registerjavascriptproxy)或者[javaScriptProxy](./arkts-basic-components-web-attributes.md#javascriptproxy)注入JavaScript对象到window对象中。该接口可以获取最后一次调用注入的对象的frame的url。 6434 6435**系统能力:** SystemCapability.Web.Webview.Core 6436 6437**返回值:** 6438 6439| 类型 | 说明 | 6440| ------ | ------------ | 6441| string | 最后一次调用注入的对象的frame的url。 | 6442 6443**错误码:** 6444 6445以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6446 6447| 错误码ID | 错误信息 | 6448| -------- | ------------------------------------------------------------ | 6449| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6450 6451**示例:** 6452 6453```ts 6454// xxx.ets 6455import { webview } from '@kit.ArkWeb'; 6456import { BusinessError } from '@kit.BasicServicesKit'; 6457 6458class TestObj { 6459 mycontroller: webview.WebviewController; 6460 6461 constructor(controller: webview.WebviewController) { 6462 this.mycontroller = controller; 6463 } 6464 6465 test(testStr: string): string { 6466 console.info('Web Component str' + testStr + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl()); 6467 return testStr; 6468 } 6469 6470 toString(): void { 6471 console.info('Web Component toString ' + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl()); 6472 } 6473 6474 testNumber(testNum: number): number { 6475 console.info('Web Component number' + testNum + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl()); 6476 return testNum; 6477 } 6478 6479 testBool(testBol: boolean): boolean { 6480 console.info('Web Component boolean' + testBol + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl()); 6481 return testBol; 6482 } 6483} 6484 6485class WebObj { 6486 mycontroller: webview.WebviewController; 6487 6488 constructor(controller: webview.WebviewController) { 6489 this.mycontroller = controller; 6490 } 6491 6492 webTest(): string { 6493 console.info('Web test ' + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl()); 6494 return "Web test"; 6495 } 6496 6497 webString(): void { 6498 console.info('Web test toString ' + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl()); 6499 } 6500} 6501 6502@Entry 6503@Component 6504struct Index { 6505 controller: webview.WebviewController = new webview.WebviewController(); 6506 @State testObjtest: TestObj = new TestObj(this.controller); 6507 @State webTestObj: WebObj = new WebObj(this.controller); 6508 6509 build() { 6510 Column() { 6511 Button('refresh') 6512 .onClick(() => { 6513 try { 6514 this.controller.refresh(); 6515 } catch (error) { 6516 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6517 } 6518 }) 6519 Button('Register JavaScript To Window') 6520 .onClick(() => { 6521 try { 6522 this.controller.registerJavaScriptProxy(this.testObjtest, "objName", ["test", "toString", "testNumber", "testBool"]); 6523 this.controller.registerJavaScriptProxy(this.webTestObj, "objTestName", ["webTest", "webString"]); 6524 } catch (error) { 6525 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6526 } 6527 }) 6528 Button('deleteJavaScriptRegister') 6529 .onClick(() => { 6530 try { 6531 this.controller.deleteJavaScriptRegister("objName"); 6532 this.controller.deleteJavaScriptRegister("objTestName"); 6533 } catch (error) { 6534 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6535 } 6536 }) 6537 Web({ src: $rawfile('index.html'), controller: this.controller }) 6538 .javaScriptAccess(true) 6539 } 6540 } 6541} 6542``` 6543 6544加载的html文件。 6545```html 6546<!-- index.html --> 6547<!DOCTYPE html> 6548<html> 6549 <head> 6550 <meta charset="utf-8"> 6551 </head> 6552 <body> 6553 <button type="button" onclick="htmlTest()">Click Me!</button> 6554 <p id="demo"></p> 6555 <p id="webDemo"></p> 6556 <script type="text/javascript"> 6557 function htmlTest() { 6558 // This function call expects to return "ArkUI Web Component" 6559 let str=objName.test("webtest data"); 6560 objName.testNumber(1); 6561 objName.testBool(true); 6562 document.getElementById("demo").innerHTML=str; 6563 console.info('objName.test result:'+ str) 6564 6565 // This function call expects to return "Web test" 6566 let webStr = objTestName.webTest(); 6567 document.getElementById("webDemo").innerHTML=webStr; 6568 console.info('objTestName.webTest result:'+ webStr) 6569 } 6570 </script> 6571 </body> 6572</html> 6573``` 6574 6575## pauseAllTimers<sup>12+</sup> 6576 6577static pauseAllTimers(): void 6578 6579暂停所有WebView的定时器。 6580 6581**系统能力:** SystemCapability.Web.Webview.Core 6582 6583**错误码:** 6584 6585以下错误码的详细介绍请参见[Webview错误码](errorcode-webview.md)。 6586 6587| 错误码ID | 错误信息 | 6588| -------- | ------------------------------------------------------------ | 6589| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6590 6591**示例:** 6592 6593```ts 6594import { webview } from '@kit.ArkWeb'; 6595 6596@Entry 6597@Component 6598struct WebComponent { 6599 controller: webview.WebviewController = new webview.WebviewController(); 6600 6601 build() { 6602 Column() { 6603 Row() { 6604 Button('PauseAllTimers') 6605 .onClick(() => { 6606 webview.WebviewController.pauseAllTimers(); 6607 }) 6608 } 6609 Web({ src: $rawfile("index.html"), controller: this.controller }) 6610 } 6611 } 6612} 6613``` 6614加载的html文件。 6615 6616```html 6617<!DOCTYPE html> 6618<html> 6619 <body> 6620 <button style="width:300px;height:150px;font-size:50px" onclick="startTimer()">start</button> 6621 <button style="width:300px;height:150px;font-size:50px" onclick="resetTimer()">reset</button> 6622 <input style="width:300px;height:150px;font-size:50px" value="0" id="show_num"> 6623 </body> 6624</html> 6625<script> 6626 var timer = null; 6627 var num = 0; 6628 6629 function startTimer() { 6630 timer = setInterval(function() { 6631 document.getElementById("show_num").value = ++num; 6632 }, 1000); 6633 } 6634 6635 function resetTimer() { 6636 clearInterval(timer); 6637 document.getElementById("show_num").value = 0; 6638 num = 0; 6639 } 6640</script> 6641``` 6642 6643## resumeAllTimers<sup>12+</sup> 6644 6645static resumeAllTimers(): void 6646 6647恢复从pauseAllTimers()接口中被暂停的所有的定时器。 6648 6649**系统能力:** SystemCapability.Web.Webview.Core 6650 6651**错误码:** 6652 6653以下错误码的详细介绍请参见[Webview错误码](errorcode-webview.md)。 6654 6655| 错误码ID | 错误信息 | 6656| -------- | ------------------------------------------------------------ | 6657| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6658 6659**示例:** 6660 6661```ts 6662import { webview } from '@kit.ArkWeb'; 6663 6664@Entry 6665@Component 6666struct WebComponent { 6667 controller: webview.WebviewController = new webview.WebviewController(); 6668 6669 build() { 6670 Column() { 6671 Row() { 6672 Button('ResumeAllTimers') 6673 .onClick(() => { 6674 webview.WebviewController.resumeAllTimers(); 6675 }) 6676 Button('PauseAllTimers') 6677 .onClick(() => { 6678 webview.WebviewController.pauseAllTimers(); 6679 }) 6680 } 6681 Web({ src: $rawfile("index.html"), controller: this.controller }) 6682 } 6683 } 6684} 6685``` 6686加载的html文件。 6687 6688```html 6689<!DOCTYPE html> 6690<html> 6691 <body> 6692 <button style="width:300px;height:150px;font-size:50px" onclick="startTimer()">start</button> 6693 <button style="width:300px;height:150px;font-size:50px" onclick="resetTimer()">reset</button> 6694 <input style="width:300px;height:150px;font-size:50px" value="0" id="show_num"> 6695 </body> 6696</html> 6697<script> 6698 var timer = null; 6699 var num = 0; 6700 6701 function startTimer() { 6702 timer = setInterval(function() { 6703 document.getElementById("show_num").value = ++num; 6704 }, 1000); 6705 } 6706 6707 function resetTimer() { 6708 clearInterval(timer); 6709 document.getElementById("show_num").value = 0; 6710 num = 0; 6711 } 6712</script> 6713``` 6714 6715## stopAllMedia<sup>12+</sup> 6716 6717stopAllMedia(): void 6718 6719控制网页所有音视频停止。 6720 6721**系统能力:** SystemCapability.Web.Webview.Core 6722 6723**错误码:** 6724 6725以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6726 6727| 错误码ID | 错误信息 | 6728| -------- | ------------------------------------------------------------ | 6729| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6730 6731**示例:** 6732 6733```ts 6734// xxx.ets 6735import { webview } from '@kit.ArkWeb'; 6736import { BusinessError } from '@kit.BasicServicesKit'; 6737 6738@Entry 6739@Component 6740struct WebComponent { 6741 controller: webview.WebviewController = new webview.WebviewController(); 6742 6743 build() { 6744 Column() { 6745 Button('stopAllMedia') 6746 .onClick(() => { 6747 try { 6748 this.controller.stopAllMedia(); 6749 } catch (error) { 6750 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6751 } 6752 }) 6753 Web({ src: 'www.example.com', controller: this.controller }) 6754 } 6755 } 6756} 6757``` 6758 6759## pauseAllMedia<sup>12+</sup> 6760 6761pauseAllMedia(): void 6762 6763控制网页所有音视频暂停。 6764 6765**系统能力:** SystemCapability.Web.Webview.Core 6766 6767**错误码:** 6768 6769以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6770 6771| 错误码ID | 错误信息 | 6772| -------- | ------------------------------------------------------------ | 6773| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6774 6775**示例:** 6776 6777```ts 6778// xxx.ets 6779import { webview } from '@kit.ArkWeb'; 6780import { BusinessError } from '@kit.BasicServicesKit'; 6781 6782@Entry 6783@Component 6784struct WebComponent { 6785 controller: webview.WebviewController = new webview.WebviewController(); 6786 6787 build() { 6788 Column() { 6789 Button('pauseAllMedia') 6790 .onClick(() => { 6791 try { 6792 this.controller.pauseAllMedia(); 6793 } catch (error) { 6794 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6795 } 6796 }) 6797 Web({ src: 'www.example.com', controller: this.controller }) 6798 } 6799 } 6800} 6801``` 6802 6803## resumeAllMedia<sup>12+</sup> 6804 6805resumeAllMedia(): void 6806 6807控制网页被pauseAllMedia接口暂停的音视频继续播放。 6808 6809**系统能力:** SystemCapability.Web.Webview.Core 6810 6811**错误码:** 6812 6813以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6814 6815| 错误码ID | 错误信息 | 6816| -------- | ------------------------------------------------------------ | 6817| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6818 6819**示例:** 6820 6821```ts 6822// xxx.ets 6823import { webview } from '@kit.ArkWeb'; 6824import { BusinessError } from '@kit.BasicServicesKit'; 6825 6826@Entry 6827@Component 6828struct WebComponent { 6829 controller: webview.WebviewController = new webview.WebviewController(); 6830 6831 build() { 6832 Column() { 6833 Button('resumeAllMedia') 6834 .onClick(() => { 6835 try { 6836 this.controller.resumeAllMedia(); 6837 } catch (error) { 6838 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6839 } 6840 }) 6841 Web({ src: 'www.example.com', controller: this.controller }) 6842 } 6843 } 6844} 6845``` 6846 6847## closeAllMediaPresentations<sup>12+</sup> 6848 6849closeAllMediaPresentations(): void 6850 6851控制网页所有全屏视频关闭。 6852 6853**系统能力:** SystemCapability.Web.Webview.Core 6854 6855**错误码:** 6856 6857以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6858 6859| 错误码ID | 错误信息 | 6860| -------- | ------------------------------------------------------------ | 6861| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6862 6863**示例:** 6864 6865```ts 6866// xxx.ets 6867import { webview } from '@kit.ArkWeb'; 6868import { BusinessError } from '@kit.BasicServicesKit'; 6869 6870@Entry 6871@Component 6872struct WebComponent { 6873 controller: webview.WebviewController = new webview.WebviewController(); 6874 6875 build() { 6876 Column() { 6877 Button('closeAllMediaPresentations') 6878 .onClick(() => { 6879 try { 6880 this.controller.closeAllMediaPresentations(); 6881 } catch (error) { 6882 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6883 } 6884 }) 6885 Web({ src: 'www.example.com', controller: this.controller }) 6886 } 6887 } 6888} 6889``` 6890 6891## getMediaPlaybackState<sup>12+</sup> 6892 6893getMediaPlaybackState(): MediaPlaybackState 6894 6895查询当前网页音视频播放状态。 6896 6897**系统能力:** SystemCapability.Web.Webview.Core 6898 6899**返回值:** 6900 6901| 类型 | 说明 | 6902| ------------------------------------------- | --------------------------------------------------------- | 6903| [MediaPlaybackState](./arkts-apis-webview-e.md#mediaplaybackstate12) | 当前网页的播放状态,具体值为NONE、PLAYING、PAUSED、STOPPED。 | 6904 6905**错误码:** 6906 6907以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6908 6909| 错误码ID | 错误信息 | 6910| -------- | ------------------------------------------------------------ | 6911| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6912 6913**示例:** 6914 6915```ts 6916// xxx.ets 6917import { webview } from '@kit.ArkWeb'; 6918import { BusinessError } from '@kit.BasicServicesKit'; 6919 6920@Entry 6921@Component 6922struct WebComponent { 6923 controller: webview.WebviewController = new webview.WebviewController(); 6924 6925 build() { 6926 Column() { 6927 Button('getMediaPlaybackState') 6928 .onClick(() => { 6929 try { 6930 console.log("MediaPlaybackState : " + this.controller.getMediaPlaybackState()); 6931 } catch (error) { 6932 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6933 } 6934 }) 6935 Web({ src: 'www.example.com', controller: this.controller }) 6936 } 6937 } 6938} 6939``` 6940 6941## setWebSchemeHandler<sup>12+</sup> 6942 6943setWebSchemeHandler(scheme: string, handler: WebSchemeHandler): void 6944 6945为当前Web组件设置[WebSchemeHandler](./arkts-apis-webview-WebSchemeHandler.md), [WebSchemeHandler](./arkts-apis-webview-WebSchemeHandler.md)类用于拦截指定scheme的请求。 6946 6947**系统能力:** SystemCapability.Web.Webview.Core 6948 6949**参数:** 6950 6951| 参数名 | 类型 | 必填 | 说明 | 6952| ------ | ------ | ---- | :------------------------ | 6953| scheme | string | 是 | 要拦截的协议。 | 6954| handler | [WebSchemeHandler](./arkts-apis-webview-WebSchemeHandler.md) | 是 | 拦截此协议的拦截器。 | 6955 6956**错误码:** 6957 6958以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 6959 6960| 错误码ID | 错误信息 | 6961| -------- | ------------------------------------------------------------ | 6962| 401 | Parameter error. Possible causes: 1. Incorrect parameter types. | 6963| 17100001 | Init error. The WebviewController must be associated with a Web component. | 6964 6965**示例:** 6966 6967```ts 6968// xxx.ets 6969import { webview } from '@kit.ArkWeb'; 6970import { BusinessError } from '@kit.BasicServicesKit'; 6971 6972@Entry 6973@Component 6974struct WebComponent { 6975 controller: webview.WebviewController = new webview.WebviewController(); 6976 schemeHandler: webview.WebSchemeHandler = new webview.WebSchemeHandler(); 6977 6978 build() { 6979 Column() { 6980 Button('setWebSchemeHandler') 6981 .onClick(() => { 6982 try { 6983 this.controller.setWebSchemeHandler('http', this.schemeHandler); 6984 } catch (error) { 6985 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 6986 } 6987 }) 6988 Web({ src: 'www.example.com', controller: this.controller }) 6989 } 6990 } 6991} 6992``` 6993 6994## clearWebSchemeHandler<sup>12+</sup> 6995 6996clearWebSchemeHandler(): void 6997 6998清除当前Web组件设置的所有WebSchemeHandler。 6999 7000**系统能力:** SystemCapability.Web.Webview.Core 7001 7002**错误码:** 7003 7004以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 7005 7006| 错误码ID | 错误信息 | 7007| -------- | ------------------------------------------------------------ | 7008| 17100001 | Init error. The WebviewController must be associated with a Web component. | 7009 7010**示例:** 7011 7012```ts 7013// xxx.ets 7014import { webview } from '@kit.ArkWeb'; 7015import { BusinessError } from '@kit.BasicServicesKit'; 7016 7017@Entry 7018@Component 7019struct WebComponent { 7020 controller: webview.WebviewController = new webview.WebviewController(); 7021 7022 build() { 7023 Column() { 7024 Button('clearWebSchemeHandler') 7025 .onClick(() => { 7026 try { 7027 this.controller.clearWebSchemeHandler(); 7028 } catch (error) { 7029 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 7030 } 7031 }) 7032 Web({ src: 'www.example.com', controller: this.controller }) 7033 } 7034 } 7035} 7036``` 7037 7038## setServiceWorkerWebSchemeHandler<sup>12+</sup> 7039 7040setServiceWorkerWebSchemeHandler(scheme: string, handler: WebSchemeHandler): void 7041 7042为当前应用的所有Web组件设置用于拦截ServiceWorker的WebSchemeHandler。 7043 7044**系统能力:** SystemCapability.Web.Webview.Core 7045 7046**参数:** 7047 7048| 参数名 | 类型 | 必填 | 说明 | 7049| ------ | ------ | ---- | :------------------------ | 7050| scheme | string | 是 | 要拦截的协议。 | 7051| handler | [WebSchemeHandler](./arkts-apis-webview-WebSchemeHandler.md) | 是 | 拦截此协议的拦截器。 | 7052 7053**错误码:** 7054 7055以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 7056 7057| 错误码ID | 错误信息 | 7058| -------- | ------------------------------------------------------------ | 7059| 401 | Parameter error. Possible causes: 1. Incorrect parameter types. | 7060 7061**示例:** 7062 7063```ts 7064// xxx.ets 7065import { webview } from '@kit.ArkWeb'; 7066import { BusinessError } from '@kit.BasicServicesKit'; 7067 7068@Entry 7069@Component 7070struct WebComponent { 7071 controller: webview.WebviewController = new webview.WebviewController(); 7072 schemeHandler: webview.WebSchemeHandler = new webview.WebSchemeHandler(); 7073 7074 build() { 7075 Column() { 7076 Button('setWebSchemeHandler') 7077 .onClick(() => { 7078 try { 7079 webview.WebviewController.setServiceWorkerWebSchemeHandler('http', this.schemeHandler); 7080 } catch (error) { 7081 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 7082 } 7083 }) 7084 Web({ src: 'www.example.com', controller: this.controller }) 7085 } 7086 } 7087} 7088``` 7089 7090## clearServiceWorkerWebSchemeHandler<sup>12+</sup> 7091 7092clearServiceWorkerWebSchemeHandler(): void 7093 7094清除应用中设置的所有用于拦截ServiceWorker的WebSchemeHandler。 7095 7096**系统能力:** SystemCapability.Web.Webview.Core 7097 7098**示例:** 7099 7100```ts 7101// xxx.ets 7102import { webview } from '@kit.ArkWeb'; 7103 7104@Entry 7105@Component 7106struct WebComponent { 7107 controller: webview.WebviewController = new webview.WebviewController(); 7108 7109 build() { 7110 Column() { 7111 Button('clearServiceWorkerWebSchemeHandler') 7112 .onClick(() => { 7113 webview.WebviewController.clearServiceWorkerWebSchemeHandler(); 7114 }) 7115 Web({ src: 'www.example.com', controller: this.controller }) 7116 } 7117 } 7118} 7119``` 7120 7121## startCamera<sup>12+</sup> 7122 7123startCamera(): void 7124 7125开启当前网页摄像头捕获。使用摄像头功能前请在module.json5中添加权限: ohos.permission.CAMERA,具体权限的添加方法请参考[在配置文件中声明权限](../../security/AccessToken/declare-permissions.md#在配置文件中声明权限)。 7126 7127**系统能力:** SystemCapability.Web.Webview.Core 7128 7129**错误码:** 7130 7131以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 7132 7133| 错误码ID | 错误信息 | 7134| -------- | ------------------------------------------------------------ | 7135| 17100001 | Init error. The WebviewController must be associated with a Web component. | 7136 7137**示例:** 7138```ts 7139// xxx.ets 7140import { webview } from '@kit.ArkWeb'; 7141import { BusinessError } from '@kit.BasicServicesKit'; 7142import { abilityAccessCtrl, PermissionRequestResult, common } from '@kit.AbilityKit'; 7143 7144let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager(); 7145 7146@Entry 7147@Component 7148struct WebComponent { 7149 controller: webview.WebviewController = new webview.WebviewController(); 7150 uiContext: UIContext = this.getUIContext(); 7151 7152 aboutToAppear(): void { 7153 let context: Context | undefined = this.uiContext.getHostContext() as common.UIAbilityContext; 7154 atManager.requestPermissionsFromUser(context, ['ohos.permission.CAMERA'], (err: BusinessError, data: PermissionRequestResult) => { 7155 console.info('data:' + JSON.stringify(data)); 7156 console.info('data permissions:' + data.permissions); 7157 console.info('data authResults:' + data.authResults); 7158 }) 7159 } 7160 7161 build() { 7162 Column() { 7163 Button("startCamera").onClick(() => { 7164 try { 7165 this.controller.startCamera(); 7166 } catch (error) { 7167 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 7168 } 7169 }) 7170 Button("stopCamera").onClick(() => { 7171 try { 7172 this.controller.stopCamera(); 7173 } catch (error) { 7174 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 7175 } 7176 }) 7177 Button("closeCamera").onClick(() => { 7178 try { 7179 this.controller.closeCamera(); 7180 } catch (error) { 7181 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 7182 } 7183 }) 7184 Web({ src: $rawfile('index.html'), controller: this.controller }) 7185 .onPermissionRequest((event) => { 7186 if (event) { 7187 this.uiContext.showAlertDialog({ 7188 title: 'title', 7189 message: 'text', 7190 primaryButton: { 7191 value: 'deny', 7192 action: () => { 7193 event.request.deny(); 7194 } 7195 }, 7196 secondaryButton: { 7197 value: 'onConfirm', 7198 action: () => { 7199 event.request.grant(event.request.getAccessibleResource()); 7200 } 7201 }, 7202 cancel: () => { 7203 event.request.deny(); 7204 } 7205 }) 7206 } 7207 }) 7208 } 7209 } 7210} 7211``` 7212加载的html文件。 7213 ```html 7214<!-- index.html --> 7215<!DOCTYPE html> 7216<html> 7217 <head> 7218 <meta charset="UTF-8"> 7219 </head> 7220 <body> 7221 <video id="video" width="400px" height="400px" autoplay> 7222 </video> 7223 <input type="button" title="HTML5摄像头" value="开启摄像头" onclick="getMedia()" /> 7224 <script> 7225 function getMedia() { 7226 let constraints = { 7227 video: { 7228 width: 500, 7229 height: 500 7230 }, 7231 audio: true 7232 } 7233 let video = document.getElementById("video"); 7234 let promise = navigator.mediaDevices.getUserMedia(constraints); 7235 promise.then(function(mediaStream) { 7236 video.srcObject = mediaStream; 7237 video.play(); 7238 }) 7239 } 7240 </script> 7241 </body> 7242</html> 7243 ``` 7244 7245## stopCamera<sup>12+</sup> 7246 7247stopCamera(): void 7248 7249停止当前网页摄像头捕获。 7250 7251**系统能力:** SystemCapability.Web.Webview.Core 7252 7253**错误码:** 7254 7255以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 7256 7257| 错误码ID | 错误信息 | 7258| -------- | ------------------------------------------------------------ | 7259| 17100001 | Init error. The WebviewController must be associated with a Web component. | 7260 7261**示例:** 7262 7263完整示例代码参考[startCamera](#startcamera12)。 7264 7265## closeCamera<sup>12+</sup> 7266 7267closeCamera(): void 7268 7269关闭当前网页摄像头捕获。 7270 7271**系统能力:** SystemCapability.Web.Webview.Core 7272 7273**错误码:** 7274 7275以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 7276 7277| 错误码ID | 错误信息 | 7278| -------- | ------------------------------------------------------------ | 7279| 17100001 | Init error. The WebviewController must be associated with a Web component. | 7280 7281**示例:** 7282 7283完整示例代码参考[startCamera](#startcamera12)。 7284 7285## precompileJavaScript<sup>12+</sup> 7286 7287precompileJavaScript(url: string, script: string | Uint8Array, cacheOptions: CacheOptions): Promise\<number\> 7288 7289预编译JavaScript生成字节码缓存或根据提供的参数更新已有的字节码缓存。 7290接口通过提供的文件信息、E-Tag响应头和Last-Modified响应头判断是否需要更新已有的字节码缓存。 7291 7292**系统能力:** SystemCapability.Web.Webview.Core 7293 7294**参数:** 7295 7296| 参数名 | 类型 | 必填 | 说明 | 7297| ------- | ------ | ---- | :-------------------- | 7298| url | string | 是 | 本地JavaScript文件对应的网络地址,即业务网页请求该文件的服务器版本时使用的网络地址。网络地址仅支持http或https协议,长度不超过2048。如果该网络地址对应的缓存失效,则业务网页将通过网络请求对应的资源。 | 7299| script | string \| Uint8Array | 是 | 本地JavaScript的文本内容。内容不能为空。 | 7300| cacheOptions | [CacheOptions](./arkts-apis-webview-i.md#cacheoptions12) | 是 | 用于控制字节码缓存更新。 | 7301 7302**返回值:** 7303 7304| 类型 | 说明 | 7305| ----------------------------------- | --------------------------- | 7306| Promise\<number\> | 生成字节码缓存的错误码,0表示无错误,-1表示内部错误。 | 7307 7308**错误码:** 7309 7310以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 7311 7312| 错误码ID | 错误信息 | 7313| -------- | ------------------------------------------------------------ | 7314| 401 | Invalid input parameter.Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed. | 7315| 17100001 | Init error. The WebviewController must be associated with a Web component. | 7316 7317**示例:** 7318 7319接口推荐配合动态组件使用,使用离线的Web组件用于生成字节码缓存,并在适当的时机加载业务用Web组件使用这些字节码缓存。下方是代码示例: 7320 73211. 首先,在EntryAbility中将UIContext存到localStorage中。 7322 7323 ```ts 7324 // EntryAbility.ets 7325 import { UIAbility } from '@kit.AbilityKit'; 7326 import { window } from '@kit.ArkUI'; 7327 7328 const localStorage: LocalStorage = new LocalStorage('uiContext'); 7329 7330 export default class EntryAbility extends UIAbility { 7331 storage: LocalStorage = localStorage; 7332 7333 onWindowStageCreate(windowStage: window.WindowStage) { 7334 windowStage.loadContent('pages/Index', this.storage, (err, data) => { 7335 if (err.code) { 7336 return; 7337 } 7338 7339 this.storage.setOrCreate<UIContext>("uiContext", windowStage.getMainWindowSync().getUIContext()); 7340 }); 7341 } 7342 } 7343 ``` 7344 73452. 编写动态组件所需基础代码。 7346 7347 ```ts 7348 // DynamicComponent.ets 7349 import { NodeController, BuilderNode, FrameNode, UIContext } from '@kit.ArkUI'; 7350 7351 export interface BuilderData { 7352 url: string; 7353 controller: WebviewController; 7354 context: UIContext; 7355 } 7356 7357 let storage : LocalStorage | undefined = undefined; 7358 7359 export class NodeControllerImpl extends NodeController { 7360 private rootNode: BuilderNode<BuilderData[]> | null = null; 7361 private wrappedBuilder: WrappedBuilder<BuilderData[]> | null = null; 7362 7363 constructor(wrappedBuilder: WrappedBuilder<BuilderData[]>, context: UIContext) { 7364 storage = context.getSharedLocalStorage(); 7365 super(); 7366 this.wrappedBuilder = wrappedBuilder; 7367 } 7368 7369 makeNode(): FrameNode | null { 7370 if (this.rootNode != null) { 7371 return this.rootNode.getFrameNode(); 7372 } 7373 return null; 7374 } 7375 7376 initWeb(url: string, controller: WebviewController) { 7377 if(this.rootNode != null) { 7378 return; 7379 } 7380 7381 const uiContext: UIContext = storage!.get<UIContext>("uiContext") as UIContext; 7382 if (!uiContext) { 7383 return; 7384 } 7385 this.rootNode = new BuilderNode(uiContext); 7386 this.rootNode.build(this.wrappedBuilder, { url: url, controller: controller }); 7387 } 7388 } 7389 7390 export const createNode = (wrappedBuilder: WrappedBuilder<BuilderData[]>, data: BuilderData) => { 7391 const baseNode = new NodeControllerImpl(wrappedBuilder, data.context); 7392 baseNode.initWeb(data.url, data.controller); 7393 return baseNode; 7394 } 7395 ``` 7396 73973. 编写用于生成字节码缓存的组件,本例中的本地Javascript资源内容通过文件读取接口读取rawfile目录下的本地文件。 7398 7399 <!--code_no_check--> 7400 ```ts 7401 // PrecompileWebview.ets 7402 import { BuilderData } from "./DynamicComponent"; 7403 import { Config, configs } from "./PrecompileConfig"; 7404 7405 @Builder 7406 function WebBuilder(data: BuilderData) { 7407 Web({ src: data.url, controller: data.controller }) 7408 .onControllerAttached(() => { 7409 precompile(data.controller, configs, data.context); 7410 }) 7411 .fileAccess(true) 7412 } 7413 7414 export const precompileWebview = wrapBuilder<BuilderData[]>(WebBuilder); 7415 7416 export const precompile = async (controller: WebviewController, configs: Array<Config>, context: UIContext) => { 7417 for (const config of configs) { 7418 let content = await readRawFile(config.localPath, context); 7419 7420 try { 7421 controller.precompileJavaScript(config.url, content, config.options) 7422 .then(errCode => { 7423 console.error("precompile successfully! " + errCode); 7424 }).catch((errCode: number) => { 7425 console.error("precompile failed. " + errCode); 7426 }); 7427 } catch (err) { 7428 console.error("precompile failed. " + err.code + " " + err.message); 7429 } 7430 } 7431 } 7432 7433 async function readRawFile(path: string, context: UIContext) { 7434 try { 7435 return await context.getHostContext()!.resourceManager.getRawFileContent(path); 7436 } catch (err) { 7437 return new Uint8Array(0); 7438 } 7439 } 7440 ``` 7441 7442JavaScript资源的获取方式也可通过[网络请求](../apis-network-kit/js-apis-http.md)的方式获取,但此方法获取到的http响应头非标准HTTP响应头格式,需额外将响应头转换成标准HTTP响应头格式后使用。如通过网络请求获取到的响应头是e-tag,则需要将其转换成E-Tag后使用。 7443 74444. 编写业务用组件代码。 7445 7446 <!--code_no_check--> 7447 ```ts 7448 // BusinessWebview.ets 7449 import { BuilderData } from "./DynamicComponent"; 7450 7451 @Builder 7452 function WebBuilder(data: BuilderData) { 7453 // 此处组件可根据业务需要自行扩展 7454 Web({ src: data.url, controller: data.controller }) 7455 .cacheMode(CacheMode.Default) 7456 } 7457 7458 export const businessWebview = wrapBuilder<BuilderData[]>(WebBuilder); 7459 ``` 7460 74615. 编写资源配置信息。 7462 7463 ```ts 7464 // PrecompileConfig.ets 7465 import { webview } from '@kit.ArkWeb' 7466 7467 export interface Config { 7468 url: string, 7469 localPath: string, // 本地资源路径 7470 options: webview.CacheOptions 7471 } 7472 7473 export let configs: Array<Config> = [ 7474 { 7475 url: "https://www.example.com/example.js", 7476 localPath: "example.js", 7477 options: { 7478 responseHeaders: [ 7479 { headerKey: "E-Tag", headerValue: "aWO42N9P9dG/5xqYQCxsx+vDOoU="}, 7480 { headerKey: "Last-Modified", headerValue: "Wed, 21 Mar 2024 10:38:41 GMT"} 7481 ] 7482 } 7483 } 7484 ] 7485 ``` 7486 74876. 在页面中使用。 7488 7489 <!--code_no_check--> 7490 ```ts 7491 // Index.ets 7492 import { webview } from '@kit.ArkWeb'; 7493 import { NodeController } from '@kit.ArkUI'; 7494 import { createNode } from "./DynamicComponent" 7495 import { precompileWebview } from "./PrecompileWebview" 7496 import { businessWebview } from "./BusinessWebview" 7497 7498 @Entry 7499 @Component 7500 struct Index { 7501 @State precompileNode: NodeController | undefined = undefined; 7502 precompileController: webview.WebviewController = new webview.WebviewController(); 7503 7504 @State businessNode: NodeController | undefined = undefined; 7505 businessController: webview.WebviewController = new webview.WebviewController(); 7506 7507 aboutToAppear(): void { 7508 // 初始化用于注入本地资源的Web组件 7509 this.precompileNode = createNode(precompileWebview, 7510 { url: "https://www.example.com/empty.html", controller: this.precompileController, context: this.getUIContext()}); 7511 } 7512 7513 build() { 7514 Column() { 7515 // 在适当的时机加载业务用Web组件,本例以Button点击触发为例 7516 Button("加载页面") 7517 .onClick(() => { 7518 this.businessNode = createNode(businessWebview, { 7519 url: "https://www.example.com/business.html", 7520 controller: this.businessController, 7521 context: this.getUIContext() 7522 }); 7523 }) 7524 // 用于业务的Web组件 7525 NodeContainer(this.businessNode); 7526 } 7527 } 7528 } 7529 ``` 7530 7531当需要更新本地已经生成的编译字节码时,修改cacheOptions参数中responseHeaders中的E-Tag或Last-Modified响应头对应的值,再次调用接口即可。 7532 7533## onCreateNativeMediaPlayer<sup>12+</sup> 7534 7535onCreateNativeMediaPlayer(callback: CreateNativeMediaPlayerCallback): void 7536 7537注册回调函数,开启[应用接管网页媒体播放功能](./arkts-basic-components-web-attributes.md#enablenativemediaplayer12)后,当网页中有播放媒体时,触发注册的回调函数。 7538如果应用接管网页媒体播放功能未开启,则注册的回调函数不会被触发。 7539 7540**系统能力:** SystemCapability.Web.Webview.Core 7541 7542**参数:** 7543 7544| 参数名 | 类型 | 必填 | 说明 | 7545|--------|------|------|------| 7546| callback | [CreateNativeMediaPlayerCallback](./arkts-apis-webview-t.md#createnativemediaplayercallback12) | 是 | 接管网页媒体播放的回调函数。 | 7547 7548**示例:** 7549 7550```ts 7551// xxx.ets 7552import { webview } from '@kit.ArkWeb'; 7553 7554class ActualNativeMediaPlayerListener { 7555 handler: webview.NativeMediaPlayerHandler; 7556 7557 constructor(handler: webview.NativeMediaPlayerHandler) { 7558 this.handler = handler; 7559 } 7560 7561 onPlaying() { 7562 // 本地播放器开始播放。 7563 this.handler.handleStatusChanged(webview.PlaybackStatus.PLAYING); 7564 } 7565 onPaused() { 7566 // 本地播放器暂停播放。 7567 this.handler.handleStatusChanged(webview.PlaybackStatus.PAUSED); 7568 } 7569 onSeeking() { 7570 // 本地播放器开始执行跳转到目标时间点。 7571 this.handler.handleSeeking(); 7572 } 7573 onSeekDone() { 7574 // 本地播放器 seek 完成。 7575 this.handler.handleSeekFinished(); 7576 } 7577 onEnded() { 7578 // 本地播放器播放完成。 7579 this.handler.handleEnded(); 7580 } 7581 onVolumeChanged() { 7582 // 获取本地播放器的音量。 7583 let volume: number = getVolume(); 7584 this.handler.handleVolumeChanged(volume); 7585 } 7586 onCurrentPlayingTimeUpdate() { 7587 // 更新播放时间。 7588 let currentTime: number = getCurrentPlayingTime(); 7589 // 将时间单位换算成秒。 7590 let currentTimeInSeconds = convertToSeconds(currentTime); 7591 this.handler.handleTimeUpdate(currentTimeInSeconds); 7592 } 7593 onBufferedChanged() { 7594 // 缓存发生了变化。 7595 // 获取本地播放器的缓存时长。 7596 let bufferedEndTime: number = getCurrentBufferedTime(); 7597 // 将时间单位换算成秒。 7598 let bufferedEndTimeInSeconds = convertToSeconds(bufferedEndTime); 7599 this.handler.handleBufferedEndTimeChanged(bufferedEndTimeInSeconds); 7600 7601 // 检查缓存状态。 7602 // 如果缓存状态发生了变化,则向 ArkWeb 内核通知缓存状态。 7603 let lastReadyState: webview.ReadyState = getLastReadyState(); 7604 let currentReadyState: webview.ReadyState = getCurrentReadyState(); 7605 if (lastReadyState != currentReadyState) { 7606 this.handler.handleReadyStateChanged(currentReadyState); 7607 } 7608 } 7609 onEnterFullscreen() { 7610 // 本地播放器进入了全屏状态。 7611 let isFullscreen: boolean = true; 7612 this.handler.handleFullscreenChanged(isFullscreen); 7613 } 7614 onExitFullscreen() { 7615 // 本地播放器退出了全屏状态。 7616 let isFullscreen: boolean = false; 7617 this.handler.handleFullscreenChanged(isFullscreen); 7618 } 7619 onUpdateVideoSize(width: number, height: number) { 7620 // 当本地播放器解析出视频宽高时, 通知 ArkWeb 内核。 7621 this.handler.handleVideoSizeChanged(width, height); 7622 } 7623 onDurationChanged(duration: number) { 7624 // 本地播放器解析到了新的媒体时长, 通知 ArkWeb 内核。 7625 this.handler.handleDurationChanged(duration); 7626 } 7627 onError(error: webview.MediaError, errorMessage: string) { 7628 // 本地播放器出错了,通知 ArkWeb 内核。 7629 this.handler.handleError(error, errorMessage); 7630 } 7631 onNetworkStateChanged(state: webview.NetworkState) { 7632 // 本地播放器的网络状态发生了变化, 通知 ArkWeb 内核。 7633 this.handler.handleNetworkStateChanged(state); 7634 } 7635 onPlaybackRateChanged(playbackRate: number) { 7636 // 本地播放器的播放速率发生了变化, 通知 ArkWeb 内核。 7637 this.handler.handlePlaybackRateChanged(playbackRate); 7638 } 7639 onMutedChanged(muted: boolean) { 7640 // 本地播放器的静音状态发生了变化, 通知 ArkWeb 内核。 7641 this.handler.handleMutedChanged(muted); 7642 } 7643 7644 // ... 监听本地播放器其他的状态 ... 7645} 7646 7647class NativeMediaPlayerImpl implements webview.NativeMediaPlayerBridge { 7648 constructor(handler: webview.NativeMediaPlayerHandler, mediaInfo: webview.MediaInfo) { 7649 // 1. 创建一个本地播放器的状态监听。 7650 let listener: ActualNativeMediaPlayerListener = new ActualNativeMediaPlayerListener(handler); 7651 // 2. 创建一个本地播放器。 7652 // 3. 监听该本地播放器。 7653 // ... 7654 } 7655 7656 updateRect(x: number, y: number, width: number, height: number) { 7657 // <video> 标签的位置和大小发生了变化。 7658 // 根据该信息变化,作出相应的改变。 7659 } 7660 7661 play() { 7662 // 启动本地播放器播放。 7663 } 7664 7665 pause() { 7666 // 暂停本地播放器播放。 7667 } 7668 7669 seek(targetTime: number) { 7670 // 本地播放器跳转到指定的时间点。 7671 } 7672 7673 release() { 7674 // 销毁本地播放器。 7675 } 7676 7677 setVolume(volume: number) { 7678 // ArkWeb 内核要求调整本地播放器的音量。 7679 // 设置本地播放器的音量。 7680 } 7681 7682 setMuted(muted: boolean) { 7683 // 将本地播放器静音或取消静音。 7684 } 7685 7686 setPlaybackRate(playbackRate: number) { 7687 // 调整本地播放器的播放速度。 7688 } 7689 7690 enterFullscreen() { 7691 // 将本地播放器设置为全屏播放。 7692 } 7693 7694 exitFullscreen() { 7695 // 将本地播放器退出全屏播放。 7696 } 7697 7698 resumePlayer() { 7699 // 重新创建应用内播放器。 7700 // 恢复应用内播放器的状态信息。 7701 } 7702 7703 suspendPlayer(type: webview.SuspendType) { 7704 // 记录应用内播放器的状态信息。 7705 // 销毁应用内播放器。 7706 } 7707} 7708 7709@Entry 7710@Component 7711struct WebComponent { 7712 controller: webview.WebviewController = new webview.WebviewController() 7713 build() { 7714 Column() { 7715 Web({ src: 'www.example.com', controller: this.controller }) 7716 .enableNativeMediaPlayer({enable: true, shouldOverlay: false}) 7717 .onPageBegin((event) => { 7718 this.controller.onCreateNativeMediaPlayer((handler: webview.NativeMediaPlayerHandler, mediaInfo: webview.MediaInfo) => { 7719 if (!shouldHandle(mediaInfo)) { 7720 // 本地播放器不接管该媒体。 7721 // ArkWeb 内核将用自己的播放器来播放该媒体。 7722 return null; 7723 } 7724 let nativePlayer: webview.NativeMediaPlayerBridge = new NativeMediaPlayerImpl(handler, mediaInfo); 7725 return nativePlayer; 7726 }); 7727 }) 7728 } 7729 } 7730} 7731 7732// stub 7733function getVolume() { 7734 return 1; 7735} 7736function getCurrentPlayingTime() { 7737 return 1; 7738} 7739function getCurrentBufferedTime() { 7740 return 1; 7741} 7742function convertToSeconds(input: number) { 7743 return input; 7744} 7745function getLastReadyState() { 7746 return webview.ReadyState.HAVE_NOTHING; 7747} 7748function getCurrentReadyState() { 7749 return webview.ReadyState.HAVE_NOTHING; 7750} 7751function shouldHandle(mediaInfo: webview.MediaInfo) { 7752 return true; 7753} 7754``` 7755 7756## enableWholeWebPageDrawing<sup>12+</sup> 7757 7758static enableWholeWebPageDrawing(): void 7759 7760设置开启网页全量绘制能力。仅在web初始化时设置。 7761 7762**系统能力:** SystemCapability.Web.Webview.Core 7763 7764**示例:** 7765 7766```ts 7767// xxx.ets 7768import { webview } from '@kit.ArkWeb'; 7769import { BusinessError } from '@kit.BasicServicesKit'; 7770 7771@Entry 7772@Component 7773struct WebComponent { 7774 controller: webview.WebviewController = new webview.WebviewController(); 7775 7776 aboutToAppear(): void { 7777 try { 7778 webview.WebviewController.enableWholeWebPageDrawing(); 7779 } catch (error) { 7780 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 7781 } 7782 } 7783 7784 build() { 7785 Column() { 7786 Web({ src: 'www.example.com', controller: this.controller }) 7787 } 7788 } 7789} 7790``` 7791 7792## webPageSnapshot<sup>12+</sup> 7793 7794webPageSnapshot(info: SnapshotInfo, callback: AsyncCallback\<SnapshotResult>): void 7795 7796获取网页全量绘制结果。 7797 7798> **说明:** 7799> 7800> 仅支持对渲染进程上的资源进行截图:静态图片和文本。 7801> 7802> 如果页面有视频则截图时会显示该视频的占位图片,没有占位图片则显示空白。 7803 7804**系统能力:** SystemCapability.Web.Webview.Core 7805 7806**参数:** 7807 7808| 参数名 | 类型 | 必填 | 说明 | 7809| ----------- | ------------- | ---- | ------------------------ | 7810| info | [SnapshotInfo](./arkts-apis-webview-i.md#snapshotinfo12)| 是 | 全量绘制结果入参。 | 7811| callback | AsyncCallback\<[SnapshotResult](./arkts-apis-webview-i.md#snapshotresult12)>| 是 | 全量绘制回调结果。 | 7812 7813**示例:** 7814 7815```ts 7816// xxx.ets 7817import { webview } from '@kit.ArkWeb'; 7818import { BusinessError } from '@kit.BasicServicesKit'; 7819 7820@Entry 7821@Component 7822struct WebComponent { 7823 controller: webview.WebviewController = new webview.WebviewController(); 7824 7825 build() { 7826 Column() { 7827 Button('webPageSnapshot') 7828 .onClick(() => { 7829 try { 7830 this.controller.webPageSnapshot({ id: "1234", size: { width: 100, height: 100 } }, (error, result) => { 7831 if (error) { 7832 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 7833 return; 7834 } 7835 if (result) { 7836 console.info(`return value is:${result}`); 7837 //开发者可以根据需要处理返回结果 7838 } 7839 }); 7840 } catch (error) { 7841 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 7842 } 7843 }) 7844 Web({ src: 'www.example.com', controller: this.controller }) 7845 } 7846 } 7847} 7848``` 7849 7850## injectOfflineResources<sup>12+</sup> 7851 7852injectOfflineResources(resourceMaps: Array\<[OfflineResourceMap](./arkts-apis-webview-i.md#offlineresourcemap12)\>): void 7853 7854将本地离线资源注入到内存缓存中,以提升页面首次启动速度。 7855内存缓存中的资源由内核自动管理,当注入的资源过多导致内存压力过大,内核自动释放未使用的资源,应避免注入大量资源到内存缓存中。 7856正常情况下,资源的有效期由提供的Cache-Control或Expires响应头控制其有效期,默认的有效期为86400秒,即1天。 7857资源的MIMEType通过提供的Content-Type响应头配置,Content-Type需符合标准,否则无法正常使用,MODULE_JS必须提供有效的MIMEType,其他类型可不提供。 7858以此方式注入的资源,仅支持通过HTML中的标签加载。如果业务网页中的script标签使用了crossorigin属性,则必须在接口的responseHeaders参数中设置Cross-Origin响应头的值为anonymous或use-credentials。 7859当调用`webview.WebviewController.SetRenderProcessMode(webview.RenderProcessMode.MULTIPLE)`接口后,应用会启动多渲染进程模式,此接口在此场景下不会生效。 7860 7861**系统能力:** SystemCapability.Web.Webview.Core 7862 7863**参数:** 7864 7865| 参数名 | 类型 | 必填 | 说明 | 7866| ------- | ------ | ---- | :-------------------- | 7867| resourceMaps | Array\<[OfflineResourceMap](./arkts-apis-webview-i.md#offlineresourcemap12)\> | 是 | 本地离线资源配置对象,单次调用最大支持注入30个资源,单个资源最大支持10Mb。 | 7868 7869**错误码:** 7870 7871以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 7872 7873| 错误码ID | 错误信息 | 7874| -------- | ------------------------------------------------------------ | 7875| 401 | Invalid input parameter.Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed. | 7876| 17100001 | Init error. The WebviewController must be associated with a Web component. | 7877| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048. | 7878 7879**示例:** 7880 7881接口推荐配合动态组件使用,使用离线的Web组件用于将资源注入到内核的内存缓存中,并在适当的时机加载业务用Web组件使用这些资源。下方是代码示例: 78821. 首先,在EntryAbility中将UIContext存到localStorage中。 7883 7884 ```ts 7885 // EntryAbility.ets 7886 import { UIAbility } from '@kit.AbilityKit'; 7887 import { window } from '@kit.ArkUI'; 7888 7889 const localStorage: LocalStorage = new LocalStorage('uiContext'); 7890 7891 export default class EntryAbility extends UIAbility { 7892 storage: LocalStorage = localStorage; 7893 7894 onWindowStageCreate(windowStage: window.WindowStage) { 7895 windowStage.loadContent('pages/Index', this.storage, (err, data) => { 7896 if (err.code) { 7897 return; 7898 } 7899 7900 this.storage.setOrCreate<UIContext>("uiContext", windowStage.getMainWindowSync().getUIContext()); 7901 }); 7902 } 7903 } 7904 ``` 7905 79062. 编写动态组件所需基础代码。 7907 7908 ```ts 7909 // DynamicComponent.ets 7910 import { NodeController, BuilderNode, FrameNode, UIContext } from '@kit.ArkUI'; 7911 7912 export interface BuilderData { 7913 url: string; 7914 controller: WebviewController; 7915 context: UIContext; 7916 } 7917 7918 let storage : LocalStorage | undefined = undefined; 7919 7920 export class NodeControllerImpl extends NodeController { 7921 private rootNode: BuilderNode<BuilderData[]> | null = null; 7922 private wrappedBuilder: WrappedBuilder<BuilderData[]> | null = null; 7923 7924 constructor(wrappedBuilder: WrappedBuilder<BuilderData[]>, context: UIContext) { 7925 storage = context.getSharedLocalStorage(); 7926 super(); 7927 this.wrappedBuilder = wrappedBuilder; 7928 } 7929 7930 makeNode(): FrameNode | null { 7931 if (this.rootNode != null) { 7932 return this.rootNode.getFrameNode(); 7933 } 7934 return null; 7935 } 7936 7937 initWeb(url: string, controller: WebviewController) { 7938 if(this.rootNode != null) { 7939 return; 7940 } 7941 7942 const uiContext: UIContext = storage!.get<UIContext>("uiContext") as UIContext; 7943 if (!uiContext) { 7944 return; 7945 } 7946 this.rootNode = new BuilderNode(uiContext); 7947 this.rootNode.build(this.wrappedBuilder, { url: url, controller: controller }); 7948 } 7949 } 7950 7951 export const createNode = (wrappedBuilder: WrappedBuilder<BuilderData[]>, data: BuilderData) => { 7952 const baseNode = new NodeControllerImpl(wrappedBuilder, data.context); 7953 baseNode.initWeb(data.url, data.controller); 7954 return baseNode; 7955 } 7956 ``` 7957 79583. 编写用于注入资源的组件代码,本例中的本地资源内容通过文件读取接口读取rawfile目录下的本地文件。 7959 7960 <!--code_no_check--> 7961 ```ts 7962 // InjectWebview.ets 7963 import { webview } from '@kit.ArkWeb'; 7964 import { resourceConfigs } from "./Resource"; 7965 import { BuilderData } from "./DynamicComponent"; 7966 7967 @Builder 7968 function WebBuilder(data: BuilderData) { 7969 Web({ src: data.url, controller: data.controller }) 7970 .onControllerAttached(async () => { 7971 try { 7972 data.controller.injectOfflineResources(await getData (data.context)); 7973 } catch (err) { 7974 console.error("error: " + err.code + " " + err.message); 7975 } 7976 }) 7977 .fileAccess(true) 7978 } 7979 7980 export const injectWebview = wrapBuilder<BuilderData[]>(WebBuilder); 7981 7982 export async function getData(context: UIContext) { 7983 const resourceMapArr: Array<webview.OfflineResourceMap> = []; 7984 7985 // 读取配置,从rawfile目录中读取文件内容 7986 for (let config of resourceConfigs) { 7987 let buf: Uint8Array = new Uint8Array(0); 7988 if (config.localPath) { 7989 buf = await readRawFile(config.localPath, context); 7990 } 7991 7992 resourceMapArr.push({ 7993 urlList: config.urlList, 7994 resource: buf, 7995 responseHeaders: config.responseHeaders, 7996 type: config.type, 7997 }) 7998 } 7999 8000 return resourceMapArr; 8001 } 8002 8003 export async function readRawFile(url: string, context: UIContext) { 8004 try { 8005 return await context.getHostContext()!.resourceManager.getRawFileContent(url); 8006 } catch (err) { 8007 return new Uint8Array(0); 8008 } 8009 } 8010 ``` 8011 80124. 编写业务用组件代码。 8013 8014 <!--code_no_check--> 8015 ```ts 8016 // BusinessWebview.ets 8017 import { BuilderData } from "./DynamicComponent"; 8018 8019 @Builder 8020 function WebBuilder(data: BuilderData) { 8021 // 此处组件可根据业务需要自行扩展 8022 Web({ src: data.url, controller: data.controller }) 8023 .cacheMode(CacheMode.Default) 8024 } 8025 8026 export const businessWebview = wrapBuilder<BuilderData[]>(WebBuilder); 8027 ``` 8028 80295. 编写资源配置信息。 8030 8031 ```ts 8032 // Resource.ets 8033 import { webview } from '@kit.ArkWeb'; 8034 8035 export interface ResourceConfig { 8036 urlList: Array<string>, 8037 type: webview.OfflineResourceType, 8038 responseHeaders: Array<Header>, 8039 localPath: string, // 本地资源存放在rawfile目录下的路径 8040 } 8041 8042 export const resourceConfigs: Array<ResourceConfig> = [ 8043 { 8044 localPath: "example.png", 8045 urlList: [ 8046 "https://www.example.com/", 8047 "https://www.example.com/path1/example.png", 8048 "https://www.example.com/path2/example.png", 8049 ], 8050 type: webview.OfflineResourceType.IMAGE, 8051 responseHeaders: [ 8052 { headerKey: "Cache-Control", headerValue: "max-age=1000" }, 8053 { headerKey: "Content-Type", headerValue: "image/png" }, 8054 ] 8055 }, 8056 { 8057 localPath: "example.js", 8058 urlList: [ // 仅提供一个url,这个url既作为资源的源,也作为资源的网络请求地址 8059 "https://www.example.com/example.js", 8060 ], 8061 type: webview.OfflineResourceType.CLASSIC_JS, 8062 responseHeaders: [ 8063 // 以<script crossorigin="anonymous" />方式使用,提供额外的响应头 8064 { headerKey: "Cross-Origin", headerValue:"anonymous" } 8065 ] 8066 }, 8067 ]; 8068 ``` 8069 80706. 在页面中使用。 8071 <!--code_no_check--> 8072 ```ts 8073 // Index.ets 8074 import { webview } from '@kit.ArkWeb'; 8075 import { NodeController } from '@kit.ArkUI'; 8076 import { createNode } from "./DynamicComponent" 8077 import { injectWebview } from "./InjectWebview" 8078 import { businessWebview } from "./BusinessWebview" 8079 8080 @Entry 8081 @Component 8082 struct Index { 8083 @State injectNode: NodeController | undefined = undefined; 8084 injectController: webview.WebviewController = new webview.WebviewController(); 8085 8086 @State businessNode: NodeController | undefined = undefined; 8087 businessController: webview.WebviewController = new webview.WebviewController(); 8088 8089 aboutToAppear(): void { 8090 // 初始化用于注入本地资源的Web组件, 提供一个空的html页面作为url即可 8091 this.injectNode = createNode(injectWebview, 8092 { url: "https://www.example.com/empty.html", controller: this.injectController, context: this.getUIContext()}); 8093 } 8094 8095 build() { 8096 Column() { 8097 // 在适当的时机加载业务用Web组件,本例以Button点击触发为例 8098 Button("加载页面") 8099 .onClick(() => { 8100 this.businessNode = createNode(businessWebview, { 8101 url: "https://www.example.com/business.html", 8102 controller: this.businessController, 8103 context: this.getUIContext() 8104 }); 8105 }) 8106 // 用于业务的Web组件 8107 NodeContainer(this.businessNode); 8108 } 8109 } 8110 } 8111 ``` 8112 81137. 加载的HTML网页示例。 8114 8115 ```HTML 8116 <!DOCTYPE html> 8117 <html lang="en"> 8118 <head></head> 8119 <body> 8120 <img src="https://www.example.com/path1/request.png" /> 8121 <img src="https://www.example.com/path2/request.png" /> 8122 <script src="https://www.example.com/example.js" crossorigin="anonymous"></script> 8123 </body> 8124 </html> 8125 ``` 8126 8127## setHostIP<sup>12+</sup> 8128 8129static setHostIP(hostName: string, address: string, aliveTime: number): void 8130 8131设置主机域名解析后的IP地址。 8132 8133**系统能力:** SystemCapability.Web.Webview.Core 8134 8135**参数:** 8136 8137| 参数名 | 类型 | 必填 | 说明 | 8138| --------- | -------- | ---- | ------------------------------------ | 8139| hostName | string | 是 | 要添加DNS记录的主机域名。 | 8140| address | string | 是 | 主机域名解析地址(支持IPv4,IPv6)。 | 8141| aliveTime | number | 是 | 缓存有效时间(秒)。 | 8142 8143**错误码:** 8144 8145以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 8146 8147| 错误码ID | 错误信息 | 8148| -------- | ------------------------ | 8149| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed. | 8150 8151**示例:** 8152 8153请参考[clearHostIP](#clearhostip12)。 8154 8155## clearHostIP<sup>12+</sup> 8156 8157static clearHostIP(hostName: string): void 8158 8159清除指定主机域名解析后的IP地址。 8160 8161**系统能力:** SystemCapability.Web.Webview.Core 8162 8163**参数:** 8164 8165| 参数名 | 类型 | 必填 | 说明 | 8166| -------- | -------- | ---- | ------------------------- | 8167| hostName | string | 是 | 要清除DNS记录的主机域名。 | 8168 8169**错误码:** 8170 8171以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 8172 8173| 错误码ID | 错误信息 | 8174| -------- | ------------------------ | 8175| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed. | 8176 8177**示例:** 8178 8179```ts 8180// xxx.ets 8181import { webview } from '@kit.ArkWeb'; 8182import { BusinessError } from '@kit.BasicServicesKit'; 8183 8184@Entry 8185@Component 8186struct WebComponent { 8187 controller: webview.WebviewController = new webview.WebviewController(); 8188 8189 build() { 8190 Column() { 8191 // url加载前设置生效. 8192 Button('setHostIP') 8193 .onClick(() => { 8194 try { 8195 webview.WebviewController.setHostIP('www.example.com', '127.0.0.1', 30); 8196 } catch (error) { 8197 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8198 } 8199 }) 8200 Button('clearHostIP') 8201 .onClick(() => { 8202 try { 8203 webview.WebviewController.clearHostIP('www.example.com'); 8204 } catch (error) { 8205 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8206 } 8207 }) 8208 Web({ src: 'www.example.com', controller: this.controller }) 8209 } 8210 } 8211} 8212``` 8213 8214## getSurfaceId<sup>12+</sup> 8215 8216getSurfaceId(): string 8217 8218获取ArkWeb对应Surface的ID,此ID可用于网页截图。 8219 8220> **说明:** 8221> 8222> 仅Web组件渲染模式是ASYNC_RENDER时有效。getSurfaceId需要在Web组件初始化之后才能获取到值。 8223 8224**系统能力:** SystemCapability.Web.Webview.Core 8225 8226**返回值:** 8227 8228| 类型 | 说明 | 8229| ------ | ------------------- | 8230| string | ArkWeb持有Surface的ID。 | 8231 8232**示例:** 8233 8234```ts 8235// xxx.ets 8236import { webview } from '@kit.ArkWeb'; 8237import { image } from '@kit.ImageKit'; 8238import { BusinessError } from '@kit.BasicServicesKit'; 8239 8240@Entry 8241@Component 8242struct Example{ 8243 controller: webview.WebviewController = new webview.WebviewController(); 8244 8245 @State imagePixelMap: image.PixelMap | undefined = undefined; 8246 8247 build(){ 8248 Column(){ 8249 Button("截图") 8250 .onClick(()=>{ 8251 try { 8252 let surfaceId = this.controller.getSurfaceId(); 8253 console.info("surfaceId: " + surfaceId); 8254 if(surfaceId.length != 0) { 8255 let region:image.Region = { x: 0, y: 0, size: { height: 800, width: 1000}} 8256 this.imagePixelMap = image.createPixelMapFromSurfaceSync(surfaceId, region) 8257 } 8258 } catch (error) { 8259 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8260 } 8261 }) 8262 Image(this.imagePixelMap) 8263 .height(100) 8264 Web({src: 'www.example.com', controller: this.controller}) 8265 } 8266 } 8267} 8268``` 8269 8270## setUrlTrustList<sup>12+</sup> 8271 8272setUrlTrustList(urlTrustList: string): void 8273 8274设置当前web的url白名单,只有白名单内的url才能允许加载/跳转,否则将拦截并弹出告警页。 8275 8276**系统能力:** SystemCapability.Web.Webview.Core 8277 8278**参数:** 8279 8280| 参数名 | 类型 | 必填 | 说明 | 8281| ------- | ------ | ---- | :-------------------- | 8282| urlTrustList | string | 是 | url白名单列表,使用json格式配置,最大支持10MB。<br/>白名单设置接口为覆盖方式,多次调用接口时,以最后一次设置为准。<br/>当本参数为空字符串时,表示取消白名单,放行所有url的访问。<br/>json格式示例:<br/>{<br> "UrlPermissionList": [<br/> {<br/> "scheme": "https",<br/> "host": "www\.example1.com",<br/> "port": 443,<br/> "path": "pathA/pathB"<br/> },<br/> {<br/> "scheme": "http",<br/> "host": "www\.example2.com",<br/> "port": 80,<br/> "path": "test1/test2/test3"<br/> }<br/> ]<br/>} | 8283 8284**白名单json格式参数** 8285| 字段 | 参数类型 | 必填 | 参数描述 | 8286| -------- | -------- | ---- | ------------------------- | 8287| scheme | string | 否 | 可选参数,不设置即不匹配该项,支持协议:http、https。 | 8288| host | string | 是 | 必选参数,精准匹配,即url的host字段和规则字段完全一致才会放行,可允许同一host多条规则同时生效。 | 8289| port | number | 否 | 可选字段,不设置即不匹配该项。 | 8290| path | string | 否 | 可选字段,不设置即不匹配该项,匹配方式为前缀匹配,以"pathA/pathB/pathC"为例:pathA/pathB/pathC三级目录下全部允许访问,其中pathC必须是完整的目录名或者文件名,不允许部分匹配。| 8291 8292**错误码:** 8293 8294以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 8295 8296| 错误码ID | 错误信息 | 8297| -------- | ------------------------------------------------------------ | 8298| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified.2. Parameter string is too long.3. Parameter verification failed. | 8299| 17100001 | Init error. The WebviewController must be associated with a Web component. | 8300 8301**示例:** 8302 ```ts 8303 // xxx.ets 8304 import { webview } from '@kit.ArkWeb'; 8305 import { BusinessError } from '@kit.BasicServicesKit'; 8306 8307 @Entry 8308 @Component 8309 struct WebComponent { 8310 controller: webview.WebviewController = new webview.WebviewController(); 8311 urltrustList: string = "{\"UrlPermissionList\":[{\"scheme\":\"http\", \"host\":\"trust.example.com\", \"port\":80, \"path\":\"test\"}]}" 8312 8313 build() { 8314 Column() { 8315 Button('Setting the trustlist') 8316 .onClick(() => { 8317 try { 8318 // 设置白名单,只允许访问trust网页 8319 this.controller.setUrlTrustList(this.urltrustList); 8320 } catch (error) { 8321 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8322 } 8323 }) 8324 Button('Cancel the trustlist.') 8325 .onClick(() => { 8326 try { 8327 // 白名单传入空字符串表示关闭白名单机制,所有url都可以允许访问 8328 this.controller.setUrlTrustList(""); 8329 } catch (error) { 8330 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8331 } 8332 }) 8333 Button('Access the trust web') 8334 .onClick(() => { 8335 try { 8336 // 白名单生效,可以访问trust网页 8337 this.controller.loadUrl('http://trust.example.com/test'); 8338 } catch (error) { 8339 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8340 } 8341 }) 8342 Button('Access the untrust web') 8343 .onClick(() => { 8344 try { 8345 // 白名单生效,此时不可以访问untrust网页,并弹出错误页 8346 this.controller.loadUrl('http://untrust.example.com/test'); 8347 } catch (error) { 8348 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8349 } 8350 }) 8351 Web({ src: 'http://untrust.example.com/test', controller: this.controller }).onControllerAttached(() => { 8352 try { 8353 // onControllerAttached回调中设置白名单,可以保证在加载url之前生效,此时不可以访问untrust网页,并弹出错误页 8354 this.controller.setUrlTrustList(this.urltrustList); 8355 } catch (error) { 8356 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8357 } 8358 }) 8359 } 8360 } 8361 } 8362 ``` 8363 8364## setPathAllowingUniversalAccess<sup>12+</sup> 8365 8366setPathAllowingUniversalAccess(pathList: Array\<string\>): void 8367 8368设置一个路径列表,当file协议访问该路径列表中的资源时,允许跨域访问本地文件。此外,当设置了路径列表时,file协议仅允许访问路径列表中的资源([fileAccess](./arkts-basic-components-web-attributes.md#fileaccess)的行为将会被此接口行为覆盖)。路径列表中的路径必须满足以下路径格式之一: 8369 83701.应用文件目录的子目录(应用文件目录通过Ability Kit中的[Context.filesDir](../apis-ability-kit/js-apis-inner-application-context.md#context)获取),例如: 8371 8372* /data/storage/el2/base/files/example 8373* /data/storage/el2/base/haps/entry/files/example 8374 83752.应用资源目录及其子目录(应用资源目录通过Ability Kit中的[Context.resourceDir](../apis-ability-kit/js-apis-inner-application-context.md#context)获取),例如: 8376 8377* /data/storage/el1/bundle/entry/resource/resfile 8378* /data/storage/el1/bundle/entry/resource/resfile/example 8379 8380当路径列表中有其中一个路径不满足以上条件之一,则会抛出异常码401,并且设置路径列表失败。当设置的路径列表为空,则file协议可访问范围以[fileAccess](./arkts-basic-components-web-attributes.md#fileaccess)的行为为准。 8381 8382**系统能力:** SystemCapability.Web.Webview.Core 8383 8384**参数:** 8385 8386| 参数名 | 类型 | 必填 | 说明 | 8387| -------- | -------- | ---- | ------------------------- | 8388| pathList | Array\<string\> | 是 | 路径列表 | 8389 8390**错误码:** 8391 8392以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 8393 8394| 错误码ID | 错误信息 | 8395| -------- | ------------------------ | 8396| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Parameter string is too long. 3.Parameter verification failed. | 8397| 17100001 | Init error. The WebviewController must be associated with a Web component. | 8398 8399**示例:** 8400 8401```ts 8402// xxx.ets 8403import { webview } from '@kit.ArkWeb'; 8404import { BusinessError } from '@kit.BasicServicesKit'; 8405 8406@Entry 8407@Component 8408struct WebComponent { 8409 controller: WebviewController = new webview.WebviewController(); 8410 uiContext: UIContext = this.getUIContext(); 8411 8412 build() { 8413 Row() { 8414 Web({ src: "", controller: this.controller }) 8415 .onControllerAttached(() => { 8416 try { 8417 // 设置允许可以跨域访问的路径列表 8418 this.controller.setPathAllowingUniversalAccess([ 8419 this.uiContext.getHostContext()!.resourceDir, 8420 this.uiContext.getHostContext()!.filesDir + "/example" 8421 ]) 8422 this.controller.loadUrl("file://" + this.getUIContext().getHostContext()!.resourceDir + "/index.html") 8423 } catch (error) { 8424 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8425 } 8426 }) 8427 .javaScriptAccess(true) 8428 .fileAccess(true) 8429 .domStorageAccess(true) 8430 } 8431 } 8432} 8433 8434``` 8435 8436加载的html文件,位于应用资源目录resource/resfile/index.html。 8437```html 8438<!-- index.html --> 8439<!DOCTYPE html> 8440<html lang="en"> 8441 8442<head> 8443 <meta charset="utf-8"> 8444 <title>Demo</title> 8445 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, viewport-fit=cover"> 8446 <script> 8447 function getFile() { 8448 var file = "file:///data/storage/el1/bundle/entry/resources/resfile/js/script.js"; 8449 var xmlHttpReq = new XMLHttpRequest(); 8450 xmlHttpReq.onreadystatechange = function(){ 8451 console.info("readyState:" + xmlHttpReq.readyState); 8452 console.info("status:" + xmlHttpReq.status); 8453 if(xmlHttpReq.readyState == 4){ 8454 if (xmlHttpReq.status == 200) { 8455 // 如果ets侧正确设置路径列表,则此处能正常获取资源 8456 const element = document.getElementById('text'); 8457 element.textContent = "load " + file + " success"; 8458 } else { 8459 // 如果ets侧不设置路径列表,则此处会触发CORS跨域检查错误 8460 const element = document.getElementById('text'); 8461 element.textContent = "load " + file + " failed"; 8462 } 8463 } 8464 } 8465 xmlHttpReq.open("GET", file); 8466 xmlHttpReq.send(null); 8467 } 8468 8469 </script> 8470</head> 8471 8472<body> 8473<div class="page"> 8474 <button id="example" onclick="getFile()">stealFile</button> 8475</div> 8476<div id="text"></div> 8477</body> 8478 8479</html> 8480``` 8481 8482html中使用file协议通过XMLHttpRequest跨域访问本地js文件,js文件位于resource/resfile/js/script.js。 8483<!--code_no_check--> 8484```javascript 8485const body = document.body; 8486const element = document.createElement('div'); 8487element.textContent = 'success'; 8488body.appendChild(element); 8489``` 8490 8491## enableBackForwardCache<sup>12+</sup> 8492 8493static enableBackForwardCache(features: BackForwardCacheSupportedFeatures): void 8494 8495开启Web组件前进后退缓存功能,通过参数指定是否允许使用特定的页面进入前进后退缓存。 8496 8497需要在[initializeWebEngine()](#initializewebengine)初始化内核之前调用。 8498 8499**系统能力:** SystemCapability.Web.Webview.Core 8500 8501**参数:** 8502 8503| 参数名 | 类型 | 必填 | 说明 | 8504| ---------------| ------- | ---- | ------------- | 8505| features | [BackForwardCacheSupportedFeatures](./arkts-apis-webview-BackForwardCacheSupportedFeatures.md) | 是 | 允许使用特定的页面进入前进后退缓存中。| 8506 8507**示例:** 8508 8509```ts 8510// EntryAbility.ets 8511import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 8512import { hilog } from '@kit.PerformanceAnalysisKit'; 8513import { window } from '@kit.ArkUI'; 8514import { webview } from '@kit.ArkWeb'; 8515 8516export default class EntryAbility extends UIAbility { 8517 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 8518 let features = new webview.BackForwardCacheSupportedFeatures(); 8519 features.nativeEmbed = true; 8520 features.mediaTakeOver = true; 8521 // 如果一个页面同时使用了同层渲染和视频托管的能力,需要 nativeEmbed 和 8522 // mediaTakeOver 同时设置为 true,该页面才可以进入前进后退缓存中。 8523 webview.WebviewController.enableBackForwardCache(features); 8524 webview.WebviewController.initializeWebEngine(); 8525 AppStorage.setOrCreate("abilityWant", want); 8526 } 8527} 8528``` 8529 8530## setBackForwardCacheOptions<sup>12+</sup> 8531 8532setBackForwardCacheOptions(options: BackForwardCacheOptions): void 8533 8534可以设置Web组件中前进后退缓存的相关选项。 8535 8536**系统能力:** SystemCapability.Web.Webview.Core 8537 8538**参数:** 8539 8540| 参数名 | 类型 | 必填 | 说明 | 8541| ---------------| ------- | ---- | ------------- | 8542| options | [BackForwardCacheOptions](./arkts-apis-webview-BackForwardCacheOptions.md) | 是 | 用来控制Web组件前进后退缓存相关选项。| 8543 8544**错误码:** 8545 8546以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 8547 8548| 错误码ID | 错误信息 | 8549| -------- | ------------------------------------------------------------ | 8550| 17100001 | Init error. The WebviewController must be associated with a Web component. | 8551 8552**示例:** 8553 8554```ts 8555// xxx.ts 8556import { webview } from '@kit.ArkWeb'; 8557 8558@Entry 8559@Component 8560struct Index { 8561 controller: webview.WebviewController = new webview.WebviewController(); 8562 8563 build() { 8564 Column() { 8565 Row() { 8566 Button("Add options").onClick((event: ClickEvent) => { 8567 let options = new webview.BackForwardCacheOptions(); 8568 options.size = 3; 8569 options.timeToLive = 10; 8570 this.controller.setBackForwardCacheOptions(options); 8571 }) 8572 Button("Backward").onClick((event: ClickEvent) => { 8573 this.controller.backward(); 8574 }) 8575 Button("Forward").onClick((event: ClickEvent) => { 8576 this.controller.forward(); 8577 }) 8578 } 8579 Web({ src: "https://www.example.com", controller: this.controller }) 8580 } 8581 .height('100%') 8582 .width('100%') 8583 } 8584} 8585``` 8586 8587## trimMemoryByPressureLevel<sup>14+</sup> 8588 8589trimMemoryByPressureLevel(level: PressureLevel): void 8590 8591根据指定的内存压力等级,主动清理Web组件占用的缓存。 8592 8593**系统能力:** SystemCapability.Web.Webview.Core 8594 8595**参数:** 8596 8597| 参数名 | 类型 | 必填 | 说明 | 8598| ------- | ------ | ---- | :-------------------- | 8599| level | [PressureLevel](./arkts-apis-webview-e.md#pressurelevel14) | 是 | 需要清理内存的内存等级。| 8600 8601**错误码:** 8602 8603以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 8604 8605| 错误码ID | 错误信息 | 8606| -------- | ------------------------------------------------------------ | 8607| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Parameter string is too long. 3.Parameter verification failed. | 8608 8609**示例:** 8610```ts 8611// xxx.ets 8612import { webview } from '@kit.ArkWeb'; 8613import { BusinessError } from '@kit.BasicServicesKit'; 8614 8615@Entry 8616@Component 8617struct WebComponent { 8618 controller: WebviewController = new webview.WebviewController(); 8619 build() { 8620 Column() { 8621 Row() { 8622 Button('trim_Memory') 8623 .onClick(() => { 8624 try { 8625 // 设置当前内存压力等级为适中,释放少量内存 8626 webview.WebviewController.trimMemoryByPressureLevel( 8627 webview.PressureLevel.MEMORY_PRESSURE_LEVEL_MODERATE); 8628 } catch (error) { 8629 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8630 } 8631 }) 8632 }.height('10%') 8633 Web({ src: 'www.example.com', controller: this.controller }) 8634 } 8635 } 8636} 8637``` 8638 8639## createPdf<sup>14+</sup> 8640 8641createPdf(configuration: PdfConfiguration, callback: AsyncCallback\<PdfData\>): void 8642 8643异步callback方式获取指定网页的数据流。 8644 8645**系统能力:** SystemCapability.Web.Webview.Core 8646 8647**参数:** 8648 8649| 参数名 | 类型 | 必填 | 说明 | 8650| ------------- | --------------------------------------- | ---- | ----------------------- | 8651| configuration | [PdfConfiguration](./arkts-apis-webview-i.md#pdfconfiguration14) | 是 | 生成PDF所需参数。 | 8652| callback | AsyncCallback<[PdfData](./arkts-apis-webview-PdfData.md)> | 是 | 回调返回网页PDF数据流。 | 8653 8654**错误码:** 8655 8656以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 8657 8658| 错误码ID | 错误信息 | 8659| -------- | ------------------------------------------------------------ | 8660| 401 | Invalid input parameter. | 8661| 17100001 | Init error. The WebviewController must be associated with a Web component. | 8662 8663**示例**: 8664 8665```ts 8666import { fileIo as fs } from '@kit.CoreFileKit'; 8667import { webview } from '@kit.ArkWeb'; 8668import { BusinessError } from '@kit.BasicServicesKit'; 8669import { common } from '@kit.AbilityKit'; 8670 8671@Entry 8672@Component 8673struct Index { 8674 controller: webview.WebviewController = new webview.WebviewController(); 8675 pdfConfig: webview.PdfConfiguration = { 8676 width: 8.27, 8677 height: 11.69, 8678 marginTop: 0, 8679 marginBottom: 0, 8680 marginRight: 0, 8681 marginLeft: 0, 8682 shouldPrintBackground: true 8683 } 8684 8685 build() { 8686 Column() { 8687 Button('SavePDF') 8688 .onClick(() => { 8689 this.controller.createPdf( 8690 this.pdfConfig, 8691 (error, result: webview.PdfData) => { 8692 try { 8693 // 获取组件上下文 8694 let context = this.getUIContext().getHostContext() as common.UIAbilityContext; 8695 // 获取沙箱路径,设置pdf文件名 8696 let filePath = context.filesDir + "/test.pdf"; 8697 let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 8698 fs.write(file.fd, result.pdfArrayBuffer().buffer).then((writeLen: number) => { 8699 console.info("createPDF write data to file succeed and size is:" + writeLen); 8700 }).catch((err: BusinessError) => { 8701 console.error("createPDF write data to file failed with error message: " + err.message + 8702 ", error code: " + err.code); 8703 }).finally(() => { 8704 fs.closeSync(file); 8705 }); 8706 } catch (resError) { 8707 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8708 } 8709 }); 8710 }) 8711 Web({ src: "www.example.com", controller: this.controller }) 8712 } 8713 } 8714} 8715``` 8716 8717## createPdf<sup>14+</sup> 8718 8719createPdf(configuration: PdfConfiguration): Promise\<PdfData\> 8720 8721以Promise方式异步获取指定网页的数据流。 8722 8723**系统能力:** SystemCapability.Web.Webview.Core 8724 8725**参数:** 8726 8727| 参数名 | 类型 | 必填 | 说明 | 8728| ------------- | --------------------------------------- | ---- | ----------------- | 8729| configuration | [PdfConfiguration](./arkts-apis-webview-i.md#pdfconfiguration14) | 是 | 生成PDF所需参数。 | 8730 8731**返回值:** 8732 8733| 类型 | 说明 | 8734| ------------------------------ | ----------------------------- | 8735| Promise<[PdfData](./arkts-apis-webview-PdfData.md)> | Promise实例,返回网页数据流。 | 8736 8737**错误码:** 8738 8739以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 8740 8741| 错误码ID | 错误信息 | 8742| -------- | ------------------------------------------------------------ | 8743| 401 | Invalid input parameter. | 8744| 17100001 | Init error. The WebviewController must be associated with a Web component. | 8745 8746**示例**: 8747 8748```ts 8749import { fileIo as fs } from '@kit.CoreFileKit'; 8750import { webview } from '@kit.ArkWeb'; 8751import { BusinessError } from '@kit.BasicServicesKit'; 8752import { common } from '@kit.AbilityKit'; 8753 8754@Entry 8755@Component 8756struct Index { 8757 controller: webview.WebviewController = new webview.WebviewController(); 8758 pdfConfig: webview.PdfConfiguration = { 8759 width: 8.27, 8760 height: 11.69, 8761 marginTop: 0, 8762 marginBottom: 0, 8763 marginRight: 0, 8764 marginLeft: 0, 8765 shouldPrintBackground: true 8766 } 8767 8768 build() { 8769 Column() { 8770 Button('SavePDF') 8771 .onClick(() => { 8772 this.controller.createPdf(this.pdfConfig) 8773 .then((result: webview.PdfData) => { 8774 try { 8775 // 获取组件上下文 8776 let context = this.getUIContext().getHostContext() as common.UIAbilityContext; 8777 // 获取沙箱路径,设置pdf文件名 8778 let filePath = context.filesDir + "/test.pdf"; 8779 let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 8780 fs.write(file.fd, result.pdfArrayBuffer().buffer).then((writeLen: number) => { 8781 console.info("createPDF write data to file succeed and size is:" + writeLen); 8782 }).catch((err: BusinessError) => { 8783 console.error("createPDF write data to file failed with error message: " + err.message + 8784 ", error code: " + err.code); 8785 }).finally(() => { 8786 fs.closeSync(file); 8787 }); 8788 } catch (resError) { 8789 console.error(`ErrorCode: ${(resError as BusinessError).code}, Message: ${(resError as BusinessError).message}`); 8790 } 8791 }) 8792 }) 8793 Web({ src: "www.example.com", controller: this.controller }) 8794 } 8795 } 8796} 8797``` 8798 8799## getScrollOffset<sup>13+</sup> 8800 8801getScrollOffset(): ScrollOffset 8802 8803获取网页当前的滚动偏移量(包含过滚动偏移量)。 8804 8805**系统能力:** SystemCapability.Web.Webview.Core 8806 8807**返回值** 8808 8809| 类型 | 说明 | 8810| :------------------------------ | ---------------------- | 8811| [ScrollOffset](./arkts-apis-webview-i.md#scrolloffset13) | 网页当前的滚动偏移量(包含过滚动偏移量)。 | 8812 8813**示例:** 8814 8815```ts 8816// xxx.ets 8817import { webview } from '@kit.ArkWeb'; 8818 8819@Entry 8820@Component 8821struct WebComponent { 8822 @State testTitle: string = 'webScroll' 8823 controller: webview.WebviewController = new webview.WebviewController(); 8824 @State controllerX: number =-100; 8825 @State controllerY: number =-100; 8826 @State mode: OverScrollMode = OverScrollMode.ALWAYS; 8827 8828 build() { 8829 Column() { 8830 Row() { 8831 Text(this.testTitle) 8832 .fontSize(30) 8833 .fontWeight(FontWeight.Bold) 8834 .margin(5) 8835 } 8836 Column() { 8837 Text(`controllerX: ${this.controllerX}, controllerY: ${this.controllerY}`) 8838 } 8839 .margin({ top: 10, bottom: 10 }) 8840 Web({ src: $rawfile("scrollByTo.html"), controller: this.controller }) 8841 .key("web_01") 8842 .overScrollMode(this.mode) 8843 .onTouch(() => { 8844 this.controllerX = this.controller.getScrollOffset().x; 8845 this.controllerY = this.controller.getScrollOffset().y; 8846 let componentInfo = this.getUIContext().getComponentUtils().getRectangleById("web_01"); 8847 let webHeight = this.getUIContext().px2vp(componentInfo.size.height); 8848 let pageHeight = this.controller.getPageHeight(); 8849 if (this.controllerY < 0) { 8850 // case1:网页向下过滚动时,可直接使用ScrollOffset.y 8851 console.info(`get downwards overscroll offsetY = ${this.controllerY}`); 8852 } else if ((this.controllerY != 0) && (this.controllerY > (pageHeight - webHeight))) { 8853 // case2:网页向上过滚动时,需计算出网页下边界与Web组件下边界的偏移量 8854 console.info(`get upwards overscroll offsetY = ${this.controllerY - (pageHeight >= webHeight ? (pageHeight - webHeight) : 0)}`); 8855 } else { 8856 // case3:网页未发生过滚动时,可直接使用ScrollOffset.y 8857 console.info(`get scroll offsetY = ${this.controllerY}`); 8858 } 8859 }) 8860 .height(600) 8861 } 8862 .width('100%') 8863 .height('100%') 8864 } 8865} 8866``` 8867 加载的html文件。 8868 ```html 8869 <!--index.html--> 8870 <!DOCTYPE html> 8871 <html> 8872 <head> 8873 <meta name="viewport" id="viewport" content="width=device-width,initial-scale=1.0"> 8874 <title>Demo</title> 8875 <style> 8876 body { 8877 width:3000px; 8878 height:6000px; 8879 padding-right:170px; 8880 padding-left:170px; 8881 border:5px solid blueviolet; 8882 } 8883 </style> 8884 </head> 8885 <body> 8886 Scroll Test 8887 </body> 8888 </html> 8889 ``` 8890 8891## getPageOffset<sup>20+</sup> 8892 8893getPageOffset(): ScrollOffset 8894 8895获取网页当前的滚动偏移量(不包含过滚动偏移量)。 8896 8897**系统能力:** SystemCapability.Web.Webview.Core 8898 8899**返回值** 8900 8901| 类型 | 说明 | 8902| :------------------------------ | ---------------------- | 8903| [ScrollOffset](./arkts-apis-webview-i.md#scrolloffset13) | 网页当前的滚动偏移量(不包含过滚动偏移量)。 | 8904 8905**错误码:** 8906 8907以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 8908 8909| 错误码ID | 错误信息 | 8910| -------- | ------------------------------------------------------------ | 8911| 801 | Capability not supported. | 8912 8913**示例:** 8914 8915```ts 8916// xxx.ets 8917import { BusinessError } from '@kit.BasicServicesKit'; 8918import { webview } from '@kit.ArkWeb'; 8919 8920@Entry 8921@Component 8922struct WebComponent { 8923 controller: webview.WebviewController = new webview.WebviewController(); 8924 8925 build() { 8926 Column() { 8927 Web({ src: $rawfile('index.html'), controller: this.controller }) 8928 .onScroll((event) => { 8929 try { 8930 console.info("getPageOffset x:" + this.controller.getPageOffset().x + ",y:" + 8931 this.controller.getPageOffset().y); 8932 } catch (error) { 8933 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 8934 } 8935 }) 8936 } 8937 } 8938} 8939``` 8940```html 8941<!-- index.html --> 8942<!DOCTYPE html> 8943<html> 8944<head> 8945 <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1.0"> 8946 <style> 8947 .blue { 8948 background-color: lightblue; 8949 } 8950 .green { 8951 background-color: lightgreen; 8952 } 8953 .blue, .green { 8954 font-size:16px; 8955 height:200px; 8956 text-align: center; /* 水平居中 */ 8957 line-height: 200px; /* 垂直居中(值等于容器高度) */ 8958 } 8959 </style> 8960</head> 8961<body> 8962<div class="blue" >webArea</div> 8963<div class="green">webArea</div> 8964<div class="blue">webArea</div> 8965<div class="green">webArea</div> 8966<div class="blue">webArea</div> 8967<div class="green">webArea</div> 8968<div class="blue">webArea</div> 8969</body> 8970</html> 8971``` 8972 8973## getLastHitTest<sup>18+</sup> 8974 8975getLastHitTest(): HitTestValue 8976 8977获取上一次被点击区域的元素信息。 8978 8979**系统能力:** SystemCapability.Web.Webview.Core 8980 8981**返回值:** 8982 8983| 类型 | 说明 | 8984| ------------ | -------------------- | 8985| [HitTestValue](./arkts-apis-webview-i.md#hittestvalue) | 点击区域的元素信息。 | 8986 8987**错误码:** 8988 8989以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 8990 8991| 错误码ID | 错误信息 | 8992| -------- | ------------------------------------------------------------ | 8993| 17100001 | Init error. The WebviewController must be associated with a Web component. | 8994 8995**示例:** 8996 8997```ts 8998// xxx.ets 8999import { webview } from '@kit.ArkWeb'; 9000import { BusinessError } from '@kit.BasicServicesKit'; 9001 9002@Entry 9003@Component 9004struct WebComponent { 9005 controller: webview.WebviewController = new webview.WebviewController(); 9006 9007 build() { 9008 Column() { 9009 Button('getLastHitTest') 9010 .onClick(() => { 9011 try { 9012 let hitValue = this.controller.getLastHitTest(); 9013 console.log("hitType: " + hitValue.type); 9014 console.log("extra: " + hitValue.extra); 9015 } catch (error) { 9016 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9017 } 9018 }) 9019 Web({ src: 'www.example.com', controller: this.controller }) 9020 } 9021 } 9022} 9023``` 9024 9025## getAttachState<sup>20+</sup> 9026 9027getAttachState(): ControllerAttachState 9028 9029查询当前WebViewController是否绑定一个Web组件。 9030 9031**系统能力:** SystemCapability.Web.Webview.Core 9032 9033**返回值:** 9034 9035| 类型 | 说明 | 9036| ------------ | -------------------- | 9037| [ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20) | WebViewController与Web组件的绑定状态。 | 9038 9039**示例:** 9040点击Button可以获取当前WebViewController的绑定状态并输出日志。 9041 9042```ts 9043// xxx.ets 9044import { webview } from '@kit.ArkWeb'; 9045import { BusinessError } from '@kit.BasicServicesKit'; 9046 9047@Entry 9048@Component 9049struct WebComponent { 9050 controller: webview.WebviewController = new webview.WebviewController(); 9051 9052 build() { 9053 Column() { 9054 Button('getAttachState') 9055 .onClick(() => { 9056 try { 9057 if (this.controller.getAttachState() == webview.ControllerAttachState.ATTACHED) { 9058 console.info('Controller is attached.'); 9059 } else { 9060 console.info('Controller is unattached.'); 9061 } 9062 } catch (error) { 9063 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9064 } 9065 }) 9066 Web({ src: 'www.example.com', controller: this.controller }) 9067 } 9068 } 9069} 9070``` 9071## on('controllerAttachStateChange')<sup>20+</sup> 9072 9073on(type: 'controllerAttachStateChange', callback: Callback<ControllerAttachState>): void 9074 9075注册WebViewController绑定状态事件,通过Callback方式获取WebViewController绑定状态的变化通知。 9076 9077**系统能力:** SystemCapability.Web.Webview.Core 9078 9079**参数:** 9080 9081| 参数名 | 类型 | 必填 | 说明 | 9082| -------- | -------- | -------- | -------- | 9083| type | string | 是 | 表示注册WebViewController绑定状态事件,固定为"controllerAttachStateChange"。 | 9084| callback | Callback<[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)> | 是 | WebViewController绑定状态改变时的回调函数。 | 9085 9086**示例:** 9087 9088请参考[off](#offcontrollerattachstatechange20)。 9089 9090## off('controllerAttachStateChange')<sup>20+</sup> 9091 9092off(type: 'controllerAttachStateChange', callback?: Callback<ControllerAttachState>): void 9093 9094取消WebViewController绑定状态事件的注册,取消后将不再接收Callback通知。 9095 9096**系统能力:** SystemCapability.Web.Webview.Core 9097 9098**参数:** 9099 9100| 参数名 | 类型 | 必填 | 说明 | 9101| -------- | -------- | -------- | -------- | 9102| type | string | 是 | 表示注册WebViewController绑定状态事件,固定为"controllerAttachStateChange"。 | 9103| callback | Callback<[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)> | 否 | WebViewController绑定状态发生改变时的回调函数,默认情况下不填写回调函数。如果填写了Callback,将仅取消注册该特定的回调。如果不填写Callback,将取消注册所有回调。 | 9104 9105**示例:** 9106 9107on可以注册多个回调,当绑定状态改变后会获取当前的绑定状态并触发这些回调。off可以取消注册某个回调,也可以取消注册所有回调。 9108 9109```ts 9110// xxx.ets 9111import { webview } from '@kit.ArkWeb'; 9112import { BusinessError } from '@kit.BasicServicesKit'; 9113 9114@Entry 9115@Component 9116struct WebComponent { 9117 controller: webview.WebviewController = new webview.WebviewController(); 9118 // 构建回调函数 9119 handleControllerAttachStateChange = (state: webview.ControllerAttachState) => { 9120 if (state == webview.ControllerAttachState.UNATTACHED) { 9121 console.info('handleControllerAttachStateChange: Controller is unattached.'); 9122 } else { 9123 console.info('handleControllerAttachStateChange: Controller is attached.'); 9124 } 9125 }; 9126 aboutToAppear() { 9127 try { 9128 this.controller.on('controllerAttachStateChange', this.handleControllerAttachStateChange); 9129 } catch (error) { 9130 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9131 } 9132 try { 9133 // 注册回调以接收controller绑定状态更改通知 9134 this.controller.on('controllerAttachStateChange', (state: webview.ControllerAttachState) => { 9135 if (state == webview.ControllerAttachState.UNATTACHED) { 9136 console.info('Controller is unattached.'); 9137 } else { 9138 console.info('Controller is attached.'); 9139 } 9140 }) 9141 } catch (error) { 9142 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9143 } 9144 } 9145 aboutToDisappear() { 9146 // 取消指定注册回调 9147 // this.controller.off('controllerAttachStateChange', this.handleControllerAttachStateChange); 9148 // 取消所有注册回调 9149 this.controller.off('controllerAttachStateChange'); 9150 } 9151 9152 build() { 9153 Column() { 9154 Web({ src: 'www.example.com', controller: this.controller }) 9155 } 9156 } 9157} 9158``` 9159## waitForAttached<sup>20+</sup> 9160 9161waitForAttached(timeout: number):Promise<ControllerAttachState> 9162 9163异步等待WebViewController与Web组件绑定完成,绑定完成或超时触发回调,通过Promise方式返回当前[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)状态。 9164 9165**系统能力:** SystemCapability.Web.Webview.Core 9166 9167**参数:** 9168 9169| 参数名 | 类型 | 必填 | 说明 | 9170| ------------- | --------------------------------------- | ---- | ----------------- | 9171| timeout | number | 是 | 异步等待时长。<br/>取值范围: [0, 65535]<br/>单位: ms | 9172 9173**返回值:** 9174 9175| 类型 | 说明 | 9176| ------------------------------ | ----------------------------- | 9177| Promise<[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)> | Promise实例,返回当前[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)状态。 | 9178 9179 9180**示例:** 9181 9182在初始化阶段设置WebViewController等待绑定完成,超时时间为1000ms。若绑定完成或者超时则会触发回调。 9183 9184```ts 9185// xxx.ets 9186import { webview } from '@kit.ArkWeb'; 9187import { BusinessError } from '@kit.BasicServicesKit'; 9188 9189@Entry 9190@Component 9191struct WebComponent { 9192 controller: webview.WebviewController = new webview.WebviewController(); 9193 9194 async aboutToAppear() { 9195 this.controller.waitForAttached(1000).then((state: webview.ControllerAttachState) => { 9196 if (state == webview.ControllerAttachState.ATTACHED) { 9197 //绑定完成或者超时都会触发回调 9198 console.info('Controller is attached.'); 9199 } 9200 }) 9201 try { 9202 const state = await this.controller.waitForAttached(1000); 9203 if (state == webview.ControllerAttachState.ATTACHED) { 9204 console.info('Controller is attached.'); 9205 } 9206 } catch (error) { 9207 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9208 } 9209 } 9210 9211 build() { 9212 Column() { 9213 Web({ src: 'www.example.com', controller: this.controller }) 9214 } 9215 } 9216} 9217``` 9218 9219## setWebDebuggingAccess<sup>20+</sup> 9220 9221static setWebDebuggingAccess(webDebuggingAccess: boolean, port: number): void 9222 9223设置是否启用无线网页调试功能,默认不开启。 9224 9225* 当没有指定端口port时,该接口等同于[setWebDebuggingAccess](#setwebdebuggingaccess)接口,ArkWeb会启动一个本地domain socket监听。 9226* 当指定了端口port时,ArkWeb会启动一个tcp socket监听。这时可以无线调试网页。详情请参考[无线调试](../../web/web-debugging-with-devtools.md#无线调试)。 9227 9228由于小于1024的端口号作为熟知或系统端口,在操作系统上需要特权才能开启,因此port的取值必须大于1024,否则该接口会抛出异常。 9229 9230安全提示:启用网页调试功能可以让用户检查修改Web页面内部状态,存在安全隐患,不建议在应用正式发布版本中启用。 9231 9232**系统能力:** SystemCapability.Web.Webview.Core 9233 9234**参数:** 9235 9236| 参数名 | 类型 | 必填 | 说明 | 9237| ------------------ | ------- | ---- | ------------- | 9238| webDebuggingAccess | boolean | 是 | 设置是否启用网页调试功能。<br/>true表示开启网页调试功能,false表示关闭网页调试功能。 | 9239| port | number | 是 | 指定devtools服务的tcp端口号。如果没有指定port,那么该接口等同于[setWebDebuggingAccess](#setwebdebuggingaccess)接口。<br/>取值范围: (1024, 65535]<br/>如果port的值在区间[0, 1024]内,则会抛出BusinessError异常,错误码为17100023。 | 9240 9241 9242**错误码:** 9243 9244以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 9245 9246| 错误码ID | 错误信息 | 9247| -------- | ------------------------------------------------------------ | 9248| 17100023 | The port number is not within the allowed range. | 9249 9250**示例:** 9251 9252```ts 9253// xxx.ets 9254import { webview } from '@kit.ArkWeb'; 9255import { BusinessError } from '@kit.BasicServicesKit'; 9256 9257@Entry 9258@Component 9259struct WebComponent { 9260 controller: webview.WebviewController = new webview.WebviewController(); 9261 9262 aboutToAppear(): void { 9263 try { 9264 webview.WebviewController.setWebDebuggingAccess(true, 8888); 9265 } catch (error) { 9266 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9267 } 9268 } 9269 9270 build() { 9271 Column() { 9272 Web({ src: 'www.example.com', controller: this.controller }) 9273 } 9274 } 9275} 9276``` 9277 9278## getProgress<sup>20+</sup> 9279 9280getProgress(): number 9281 9282获取当前网页加载进度。 9283 9284**系统能力:** SystemCapability.Web.Webview.Core 9285 9286**返回值** 9287 9288| 类型 | 说明 | 9289| :------------------------------ | ---------------------- | 9290| number | 当前页面加载进度,取值范围[0, 100] | 9291 9292**错误码:** 9293 9294以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 9295 9296| 错误码ID | 错误信息 | 9297| -------- | ------------------------------------------------------------ | 9298| 801 | Capability not supported. | 9299 9300**示例:** 9301 9302```ts 9303import { webview } from '@kit.ArkWeb'; 9304 9305@Entry 9306@Component 9307struct WebComponent { 9308 controller: webview.WebviewController = new webview.WebviewController(); 9309 9310 build() { 9311 Column() { 9312 Web({ src: 'www.example.com', controller: this.controller }) 9313 .onPageBegin(() => { 9314 let curProgress = this.controller.getProgress(); 9315 console.info("current page loading progress is :" + curProgress); 9316 }) 9317 } 9318 } 9319} 9320``` 9321 9322## getHitTest<sup>(deprecated)</sup> 9323 9324getHitTest(): WebHitTestType 9325 9326获取当前被点击区域的元素类型。 9327 9328> **说明:** 9329> 9330> 从API version11开始支持,从API version 18开始废弃。建议使用[getLastHitTest](#getlasthittest18)替代。 9331 9332**系统能力:** SystemCapability.Web.Webview.Core 9333 9334**返回值:** 9335 9336| 类型 | 说明 | 9337| ------------------------------------------------------------ | ---------------------- | 9338| [WebHitTestType](./arkts-apis-webview-e.md#webhittesttype)| 被点击区域的元素类型。 | 9339 9340**错误码:** 9341 9342以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 9343 9344| 错误码ID | 错误信息 | 9345| -------- | ------------------------------------------------------------ | 9346| 17100001 | Init error. The WebviewController must be associated with a Web component. | 9347 9348**示例:** 9349 9350```ts 9351// xxx.ets 9352import { webview } from '@kit.ArkWeb'; 9353import { BusinessError } from '@kit.BasicServicesKit'; 9354 9355@Entry 9356@Component 9357struct WebComponent { 9358 controller: webview.WebviewController = new webview.WebviewController(); 9359 9360 build() { 9361 Column() { 9362 Button('getHitTest') 9363 .onClick(() => { 9364 try { 9365 let hitTestType = this.controller.getHitTest(); 9366 console.log("hitTestType: " + hitTestType); 9367 } catch (error) { 9368 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9369 } 9370 }) 9371 Web({ src: 'www.example.com', controller: this.controller }) 9372 } 9373 } 9374} 9375``` 9376 9377## getHitTestValue<sup>(deprecated)</sup> 9378 9379getHitTestValue(): HitTestValue 9380 9381获取当前被点击区域的元素信息。 9382 9383> **说明:** 9384> 9385> 从API version11开始支持,从API version 18开始废弃。建议使用[getLastHitTest](#getlasthittest18)替代。 9386 9387**系统能力:** SystemCapability.Web.Webview.Core 9388 9389**返回值:** 9390 9391| 类型 | 说明 | 9392| ------------ | -------------------- | 9393| [HitTestValue](./arkts-apis-webview-i.md#hittestvalue) | 点击区域的元素信息。 | 9394 9395**错误码:** 9396 9397以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 9398 9399| 错误码ID | 错误信息 | 9400| -------- | ------------------------------------------------------------ | 9401| 17100001 | Init error. The WebviewController must be associated with a Web component. | 9402 9403**示例:** 9404 9405```ts 9406// xxx.ets 9407import { webview } from '@kit.ArkWeb'; 9408import { BusinessError } from '@kit.BasicServicesKit'; 9409 9410@Entry 9411@Component 9412struct WebComponent { 9413 controller: webview.WebviewController = new webview.WebviewController(); 9414 9415 build() { 9416 Column() { 9417 Button('getHitTestValue') 9418 .onClick(() => { 9419 try { 9420 let hitValue = this.controller.getHitTestValue(); 9421 console.log("hitType: " + hitValue.type); 9422 console.log("extra: " + hitValue.extra); 9423 } catch (error) { 9424 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9425 } 9426 }) 9427 Web({ src: 'www.example.com', controller: this.controller }) 9428 } 9429 } 9430} 9431``` 9432 9433## avoidVisibleViewportBottom<sup>20+</sup> 9434 9435avoidVisibleViewportBottom(avoidHeight: number): void 9436 9437设置Web网页可视视口底部避让高度。 9438 9439> **说明:** 9440> 9441> - avoidHeight有效值区间为[0, Web组件高度],超出有效值区间时取边界值。 9442> - 该接口高度设置为非0时,Web组件位置和尺寸不变,可视视口向上避让avoidHeight,表现为Web网页内容抬升avoidHeight。该接口一般用于应用自定义网页底部避让区,不建议和点击web网页可编辑区拉起键盘的场景同时使用。同时使用时,键盘弹起避让模式将使用OVERLAYS_CONTENT。 9443> - 该接口高度设置为0时,Web网页内容可恢复,键盘弹起避让模式将使用[keyboardAvoidMode()](./arkts-basic-components-web-attributes.md#keyboardavoidmode12)声明的模式。 9444 9445**系统能力:** SystemCapability.Web.Webview.Core 9446 9447**参数:** 9448 9449| 参数名 | 类型 | 必填 | 说明 | 9450| ------ | -------- | ---- | ---------------------- | 9451| avoidHeight | number | 是 | 设置Web网页可视视口底部避让高度。<br>默认值:0<br>单位:vp<br>合法取值范围:0~Web组件高度<br>非法值设置行为:超出合法取值范围时取边界值。 | 9452 9453**错误码:** 9454 9455以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 9456 9457| 错误码ID | 错误信息 | 9458| -------- | ------------------------------------------------------------ | 9459| 17100001 | Init error. The WebviewController must be associated with a Web component. | 9460| 801 | Capability not supported. | 9461 9462**示例:** 9463 9464```ts 9465// xxx.ets 9466import { webview } from '@kit.ArkWeb'; 9467import { BusinessError } from '@kit.BasicServicesKit'; 9468 9469@Entry 9470@Component 9471struct WebComponent { 9472 controller: webview.WebviewController = new webview.WebviewController(); 9473 avoidHeight: number = 100; 9474 9475 build() { 9476 Column() { 9477 Button('avoid') 9478 .onClick(() => { 9479 try { 9480 this.controller.avoidVisibleViewportBottom(this.avoidHeight); 9481 } catch (error) { 9482 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9483 } 9484 }) 9485 Button('reset') 9486 .onClick(() => { 9487 try { 9488 this.controller.avoidVisibleViewportBottom(0); 9489 } catch (error) { 9490 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9491 } 9492 }) 9493 Web({ src: 'www.example.com', controller: this.controller }) 9494 } 9495 } 9496} 9497``` 9498 9499## setErrorPageEnabled<sup>20+</sup> 9500 9501setErrorPageEnabled(enable: boolean): void 9502 9503设置是否启用默认错误页。 9504 9505在当前接口设置为true时如果页面加载发生错误将触发[onOverrideErrorPage](./arkts-basic-components-web-events.md#onoverrideerrorpage20)回调,可在该回调接口中设置自定义的错误展示页面。 9506 9507**系统能力:** SystemCapability.Web.Webview.Core 9508 9509**参数:** 9510 9511| 参数名 | 类型 | 必填 | 说明 | 9512| -------- | ------- | ---- | -------------------------------------- | 9513| enable | boolean | 是 | 表示是否启用默认错误页。true表示启用,false表示不启用。 | 9514 9515**错误码:** 9516 9517以下错误码的详细介绍请参见[Webview错误码](errorcode-webview.md)。 9518 9519| 错误码ID | 错误信息 | 9520| -------- | ------------------------------------------------------------ | 9521| 17100001 | Init error. The WebviewController must be associated with a Web component. | 9522 9523**示例:** 9524 9525```ts 9526// xxx.ets 9527import { webview } from '@kit.ArkWeb'; 9528@Entry 9529@Component 9530struct WebComponent { 9531 controller: webview.WebviewController = new webview.WebviewController(); 9532 build() { 9533 Column() { 9534 Web({ src: 'www.example.com', controller: this.controller }) 9535 .onControllerAttached(() => { 9536 this.controller.setErrorPageEnabled(true); 9537 if (!this.controller.getErrorPageEnabled()) { 9538 this.controller.setErrorPageEnabled(true); 9539 } 9540 }) 9541 } 9542 } 9543} 9544``` 9545 9546## getErrorPageEnabled<sup>20+</sup> 9547 9548getErrorPageEnabled(): boolean 9549 9550查询是否启用了默认错误页功能。 9551 9552**系统能力:** SystemCapability.Web.Webview.Core 9553 9554**返回值:** 9555 9556| 类型 | 说明 | 9557| -------------------- | ------------------------- | 9558| boolean | 返回是否启用默认错误页功能。<br>true:已启用;false:未启用。 | 9559 9560**错误码:** 9561 9562以下错误码的详细介绍请参见[Webview错误码](errorcode-webview.md)。 9563 9564| 错误码ID | 错误信息 | 9565| -------- | ------------------------------------------------------------ | 9566| 17100001 | Init error. The WebviewController must be associated with a Web component. | 9567 9568**示例:** 9569 9570```ts 9571// xxx.ets 9572import { webview } from '@kit.ArkWeb'; 9573@Entry 9574@Component 9575struct WebComponent { 9576 controller: webview.WebviewController = new webview.WebviewController(); 9577 build() { 9578 Column() { 9579 Web({ src: 'www.example.com', controller: this.controller }) 9580 .onControllerAttached(() => { 9581 this.controller.setErrorPageEnabled(true); 9582 if (!this.controller.getErrorPageEnabled()) { 9583 this.controller.setErrorPageEnabled(true); 9584 } 9585 }) 9586 } 9587 } 9588} 9589``` 9590 9591## enablePrivateNetworkAccess<sup>20+</sup> 9592 9593static enablePrivateNetworkAccess(enable: boolean): void 9594 9595设置私有网络访问检查功能(Private Network Access)的启用状态。 9596 9597启用后,Web组件将对私有网络请求(如访问本地服务器或内网资源)进行CORS预检。它会先发送OPTIONS预检请求,获取目标服务器的显式授权,然后传输实际数据。禁用此功能将跳过安全检查。 9598 9599**系统能力:** SystemCapability.Web.Webview.Core 9600 9601**参数:** 9602 9603| 参数名 | 类型 | 必填 | 说明 | 9604| -------- | ------- | ---- | -------------------------------------------------------- | 9605| enable | boolean | 是 | 是否启用私有网络访问检查功能开关。true表示启用,false表示禁用。 | 9606 9607**示例:** 9608 9609```ts 9610import { webview } from '@kit.ArkWeb'; 9611 9612@Entry 9613@Component 9614struct WebComponent { 9615 controller: webview.WebviewController = new webview.WebviewController(); 9616 9617 build() { 9618 Column() { 9619 Web({ src: 'www.example.com', controller: this.controller }) 9620 .onControllerAttached(() => { 9621 // 设置为false时ArkWeb将不再检查私有网络请求是否合法 9622 webview.WebviewController.enablePrivateNetworkAccess(false); 9623 }) 9624 } 9625 } 9626} 9627``` 9628 9629## isPrivateNetworkAccessEnabled<sup>20+</sup> 9630 9631static isPrivateNetworkAccessEnabled(): boolean 9632 9633获取Web组件是否启用了私有网络访问检查功能。 9634 9635**系统能力:** SystemCapability.Web.Webview.Core 9636 9637**返回值:** 9638 9639| 类型 | 说明 | 9640| ------- | --------------------------------------- | 9641| boolean | 返回Web组件是否启用了私有网络访问检查功能。true表示已启用;false表示已禁用。 | 9642 9643**示例:** 9644 9645```ts 9646import { webview } from '@kit.ArkWeb'; 9647import { BusinessError } from '@kit.BasicServicesKit'; 9648 9649@Entry 9650@Component 9651struct WebComponent { 9652 controller: webview.WebviewController = new webview.WebviewController(); 9653 9654 build() { 9655 Column() { 9656 Button('isPrivateNetworkAccessEnabled') 9657 .onClick(() => { 9658 try { 9659 let isEnabled: boolean = webview.WebviewController.isPrivateNetworkAccessEnabled(); 9660 console.log("isPrivateNetworkAccessEnabled:", isEnabled); 9661 } catch (error) { 9662 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9663 } 9664 }) 9665 Web({ src: 'www.example.com', controller: this.controller }) 9666 .onControllerAttached(() => { 9667 // 设置为false时ArkWeb将不再检查私有网络请求是否合法 9668 webview.WebviewController.enablePrivateNetworkAccess(false); 9669 }) 9670 } 9671 } 9672} 9673``` 9674 9675## getBlanklessInfoWithKey<sup>20+</sup> 9676 9677getBlanklessInfoWithKey(key: string): BlanklessInfo 9678 9679获取页面首屏加载预测信息(详细说明见[BlanklessInfo](./arkts-apis-webview-i.md#blanklessinfo20)),并开始本次加载过渡帧生成,应用根据此信息确定是否需要启用无白屏加载。必须与[setBlanklessLoadingWithKey](#setblanklessloadingwithkey20)接口配套使用,并且必须在触发加载页面的接口之前或在`onLoadIntercept`中调用。需在`WebViewController`与Web组件绑定后才能使用。 9680 9681> **说明:** 9682> 9683> - 持久缓存容量:默认大小为30MB(约30页),可以通过接口[setBlanklessLoadingCacheCapacity](#setblanklessloadingcachecapacity20)设置缓存容量,具体见该接口说明。超过容量时根据LRU(Least Recently Used,淘汰不常用缓存的策略)机制更新缓存。自动清理超过7天的持久缓存数据,缓存清除后第三次加载页面开始有优化效果。 9684> - 如果发现快照相似度(即[BlanklessInfo](./arkts-apis-webview-i.md#blanklessinfo20)中的similarity)极低,请确认key值是否传递正确。 9685> - 调用本接口后,将启用页面加载快照检测及生成过渡帧计算,会产生一定的资源开销。 9686> - 启用无白屏加载的页面会带来一定的资源开销,开销的大小与Web组件的分辨率相关。假设分辨率的宽度和高度分别为:w, h。页面在打开阶段会增加峰值内存,增加约12*w*h B,页面打开后内存回收,不影响稳态内存。增加固态应用缓存的大小,每个页面增加的缓存约w*h/10 B,缓存位于应用缓存的位置。 9687> - 请在module.json5中添加权限: ohos.permission.INTERNET和ohos.permission.GET_NETWORK_INFO,具体权限的添加方法请参考[在配置文件中声明权限](../../security/AccessToken/declare-permissions.md#在配置文件中声明权限)。 9688 9689**系统能力:** SystemCapability.Web.Webview.Core 9690 9691**设备行为差异:** 该接口在Phone中可正常调用,在其他设备类型中返回801错误码。 9692 9693**参数:** 9694 9695| 参数名 | 类型 | 必填 | 说明 | 9696| -------- | ------- | ---- | -------------------------------------- | 9697| key | string | 是 | 唯一标识本页面的key值。<br>合法取值范围:非空,长度不超过2048个字符。<br>设置非法值时不生效。 | 9698 9699**返回值:** 9700 9701| 类型 | 说明 | 9702| -------------------- | ------------------------- | 9703| [BlanklessInfo](./arkts-apis-webview-i.md#blanklessinfo20) | 页面首屏加载预测信息,主要包括首屏相似度预测值,首屏加载耗时预测值,应用需根据此信息来决策是否启用无白屏加载插帧。 | 9704 9705**错误码:** 9706 9707以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 9708 9709| 错误码ID | 错误信息 | 9710| -------- | ------------------------------------------------------------ | 9711| 801 | Capability not supported. | 9712 9713**示例:** 9714 9715```ts 9716import { webview } from '@kit.ArkWeb'; 9717import { BusinessError } from '@kit.BasicServicesKit'; 9718 9719@Entry 9720@Component 9721struct WebComponent { 9722 controller: webview.WebviewController = new webview.WebviewController(); 9723 build() { 9724 Column() { 9725 Web({ src: 'https://www.example.com', controller: this.controller }) 9726 .javaScriptAccess(true) 9727 .onLoadIntercept((event) => { 9728 // 当相似度超过50%,加载耗时小于1000ms时启用插帧,否则不启用。 9729 try { 9730 let info = this.controller.getBlanklessInfoWithKey('https://www.example.com/page1'); 9731 if (info.errCode == webview.WebBlanklessErrorCode.SUCCESS) { 9732 if (info.similarity >= 0.5 && info.loadingTime < 1000) { 9733 this.controller.setBlanklessLoadingWithKey('http://www.example.com/page1', true); 9734 } else { 9735 this.controller.setBlanklessLoadingWithKey('http://www.example.com/page1', false); 9736 } 9737 } else { 9738 console.log('getBlankless info err'); 9739 } 9740 } catch (error) { 9741 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9742 } 9743 return false; 9744 }) 9745 } 9746 } 9747} 9748``` 9749 9750## setBlanklessLoadingWithKey<sup>20+</sup> 9751 9752setBlanklessLoadingWithKey(key: string, is_start: boolean): WebBlanklessErrorCode 9753 9754设置无白屏加载是否启用,本接口必须与[getBlanklessInfoWithKey](#getblanklessinfowithkey20)接口配套使用。 9755 9756> **说明:** 9757> 9758> - 需在触发页面加载的接口之后调用,其他约束同[getBlanklessInfoWithKey](#getblanklessinfowithkey20)。 9759> - 页面加载必须在调用本接口的组件中进行。 9760> - 当相似度较低时,系统将判定为跳变过大,启用插帧会失败。 9761> - 请在module.json5中添加权限: ohos.permission.INTERNET和ohos.permission.GET_NETWORK_INFO,具体权限的添加方法请参考[在配置文件中声明权限](../../security/AccessToken/declare-permissions.md#在配置文件中声明权限)。 9762 9763**系统能力:** SystemCapability.Web.Webview.Core 9764 9765**参数:** 9766 9767| 参数名 | 类型 | 必填 | 说明 | 9768| -------- | ------- | ---- | -------------------------------------- | 9769| key | string | 是 | 唯一标识本页面的key值。必须与getBlanklessInfoWithKey接口的key值相同。<br>合法取值范围:非空,长度不超过2048个字符。<br>非法值设置行为:返回错误码WebBlanklessErrorCode,方案不生效。 | 9770| is_start | boolean | 是 | 是否启用开始插帧。true:启用,false:不启用。<br>默认值:false | 9771 9772**返回值:** 9773 9774| 类型 | 说明 | 9775| -------------------- | ------------------------- | 9776| [WebBlanklessErrorCode](./arkts-apis-webview-e.md#webblanklesserrorcode20) | 返回接口调用是否成功,具体见[WebBlanklessErrorCode](./arkts-apis-webview-e.md#webblanklesserrorcode20)定义。 | 9777 9778**错误码:** 9779 9780以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 9781 9782| 错误码ID | 错误信息 | 9783| -------- | ------------------------------------------------------------ | 9784| 801 | Capability not supported. | 9785 9786**示例:** 9787 9788```ts 9789import { webview } from '@kit.ArkWeb'; 9790import { BusinessError } from '@kit.BasicServicesKit'; 9791 9792@Entry 9793@Component 9794struct WebComponent { 9795 controller: webview.WebviewController = new webview.WebviewController(); 9796 build() { 9797 Column() { 9798 Web({ src: 'https://www.example.com', controller: this.controller }) 9799 .javaScriptAccess(true) 9800 .onLoadIntercept((event) => { 9801 // 当相似度超过50%,加载耗时小于1000ms时启用插帧,否则不启用。 9802 try { 9803 let info = this.controller.getBlanklessInfoWithKey('https://www.example.com/page1'); 9804 if (info.errCode == webview.WebBlanklessErrorCode.SUCCESS) { 9805 if (info.similarity >= 0.5 && info.loadingTime < 1000) { 9806 this.controller.setBlanklessLoadingWithKey('http://www.example.com/page1', true); 9807 } else { 9808 this.controller.setBlanklessLoadingWithKey('http://www.example.com/page1', false); 9809 } 9810 } else { 9811 console.log('getBlankless info err'); 9812 } 9813 } catch (error) { 9814 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9815 } 9816 return false; 9817 }) 9818 } 9819 } 9820} 9821``` 9822 9823## clearBlanklessLoadingCache<sup>20+</sup> 9824 9825static clearBlanklessLoadingCache(keys?: Array\<string\>): void 9826 9827清除指定key值页面无白屏优化缓存,本接口只清除缓存。 9828 9829在小程序或Web应用场景中,当页面加载时内容变化显著,可能会出现一次明显的跳变。若对此跳变有所顾虑,可使用该接口清除页面缓存。 9830 9831> **说明:** 9832> 9833> - 清除之后的页面,需在第三次加载页面时才会产生优化效果。 9834 9835**系统能力:** SystemCapability.Web.Webview.Core 9836 9837**参数:** 9838 9839| 参数名 | 类型 | 必填 | 说明 | 9840| -------- | ------- | ---- | -------------------------------------- | 9841| keys | Array\<string\> | 否 | 清除Blankless优化方案页面的key值列表,key值为[getBlanklessInfoWithKey](#getblanklessinfowithkey20)中指定过的。<br>默认值:所有Blankless优化方案缓存的页面key列表。<br>合法取值范围:长度不超过2048,key列表长度<=100。key和加载页面时输入给ArkWeb的相同。<br>非法值设置行为:key长度超过2048时该key不生效;长度超过100时,取前100个;当为空时,使用默认值。 | 9842 9843**错误码:** 9844 9845以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 9846 9847| 错误码ID | 错误信息 | 9848| -------- | ------------------------------------------------------------ | 9849| 801 | Capability not supported. | 9850 9851**示例:** 9852 9853```ts 9854import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 9855import { webview } from '@kit.ArkWeb'; 9856import { BusinessError } from '@kit.BasicServicesKit'; 9857 9858export default class EntryAbility extends UIAbility { 9859 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 9860 console.log("EntryAbility onCreate"); 9861 // 假设应用的Web页面在2025/06/10会进行大幅改动,例如商品促销活动等,该提案清除白屏插帧优化缓存 9862 webview.WebviewController.initializeWebEngine(); 9863 let pageUpdateTime: number = Date.UTC(2025, 5, 10, 0, 0, 0, 0); 9864 let pageUpdateTime1: number = Date.UTC(2025, 5, 11, 0, 0, 0, 0); 9865 let pageUpdateTimeNow: number = Date.now(); 9866 if (pageUpdateTimeNow > pageUpdateTime && pageUpdateTime < pageUpdateTime1) { 9867 // 清除指定页面的白屏插帧方案缓存 9868 try { 9869 webview.WebviewController.clearBlanklessLoadingCache(["https://www.example.com", "https://www.example1.com"]); 9870 } catch (error) { 9871 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9872 } 9873 } 9874 AppStorage.setOrCreate("abilityWant", want); 9875 console.log("EntryAbility onCreate done"); 9876 } 9877} 9878``` 9879 9880## setBlanklessLoadingCacheCapacity<sup>20+</sup> 9881 9882static setBlanklessLoadingCacheCapacity(capacity: number): number 9883 9884设置无白屏加载方案的持久化缓存容量,返回实际生效值。默认缓存容量为30MB,最大值为100MB。当实际缓存超过容量时,将采用淘汰不常用的过渡帧的方式清理。 9885 9886**系统能力:** SystemCapability.Web.Webview.Core 9887 9888**参数:** 9889 9890| 参数名 | 类型 | 必填 | 说明 | 9891| -------- | ------- | ---- | -------------------------------------- | 9892| capacity | number | 是 | 设置持久化缓存设置,单位MB,最大设置不超过100MB。<br>默认值:30MB。<br>合法取值范围:0~100,当设置为0时,无缓存空间,则功能全局不开启。<br>非法值设置行为:小于0时生效值为0,大于100时生效值为100。 | 9893 9894**返回值:** 9895 9896| 类型 | 说明 | 9897| -------------------- | ------------------------- | 9898| number | 返回实际生效的容量值,范围0~100。<br>小于0时生效值为0,大于100时生效值为100。 | 9899 9900**错误码:** 9901 9902以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 9903 9904| 错误码ID | 错误信息 | 9905| -------- | ------------------------------------------------------------ | 9906| 801 | Capability not supported. | 9907 9908**示例:** 9909 9910```ts 9911import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 9912import { webview } from '@kit.ArkWeb'; 9913import { BusinessError } from '@kit.BasicServicesKit'; 9914 9915export default class EntryAbility extends UIAbility { 9916 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 9917 console.log("EntryAbility onCreate"); 9918 webview.WebviewController.initializeWebEngine(); 9919 // 设置缓存容量为10MB 9920 try { 9921 webview.WebviewController.setBlanklessLoadingCacheCapacity(10); 9922 } catch (error) { 9923 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 9924 } 9925 AppStorage.setOrCreate("abilityWant", want); 9926 console.log("EntryAbility onCreate done"); 9927 } 9928} 9929``` 9930 9931## setWebDestroyMode<sup>20+</sup> 9932 9933setWebDestroyMode(mode: WebDestroyMode): void 9934 9935设置Web组件的销毁模式。当Web组件销毁时,销毁模式会影响Web内核资源释放的时机,例如JavaScript运行上下文、渲染上下文等。默认值:[WebDestroyMode.NORMAL_MODE](./arkts-apis-webview-e.md#webdestroymode20)(普通模式),由系统决定销毁时机。应用可设置[WebDestroyMode.FAST_MODE](./arkts-apis-webview-e.md#webdestroymode20)(快速模式),以立即销毁资源,从而提升特定场景的性能。 9936 9937> **说明:** 9938> 9939> [WebDestroyMode.FAST_MODE](./arkts-apis-webview-e.md#webdestroymode20)(快速模式)会改变Web组件销毁时机,应用需关注依赖Web组件销毁时机的错误实现,例如:Web组件销毁后仍调用WebviewController的未定义行为,与[WebDestroyMode.NORMAL_MODE](./arkts-apis-webview-e.md#webdestroymode20)(普通模式)相比,销毁时机提前,有更高的几率触发未关联绑定的异常(17100001),建议应用捕捉异常,或者通过[getAttachState](#getattachstate20)方法查询是否绑定状态,来避免稳定性问题。 9940 9941**系统能力:** SystemCapability.Web.Webview.Core 9942 9943**参数:** 9944 9945| 参数名 | 类型 | 必填 | 说明 | 9946| -------- | ------- | ---- | -------------------------------------- | 9947| mode | [WebDestroyMode](./arkts-apis-webview-e.md#webdestroymode20) | 是 | 设置Web组件的销毁模式。<br>默认值:WebDestroyMode.NORMAL_MODE | 9948 9949**示例:** 9950 9951```ts 9952import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 9953import { webview } from '@kit.ArkWeb'; 9954 9955export default class EntryAbility extends UIAbility { 9956 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 9957 console.info("EntryAbility onCreate"); 9958 webview.WebviewController.initializeWebEngine(); 9959 // 设置快速销毁模式 9960 webview.WebviewController.setWebDestroyMode(webview.WebDestroyMode.FAST_MODE); 9961 AppStorage.setOrCreate("abilityWant", want); 9962 console.info("EntryAbility onCreate done"); 9963 } 9964} 9965``` 9966 9967## setActiveWebEngineVersion<sup>20+</sup> 9968 9969static setActiveWebEngineVersion(engineVersion: ArkWebEngineVersion): void 9970 9971设置ArkWeb内核版本。若系统不支持指定版本,则设置无效。该接口为全局静态API,须在调用initializeWebEngine前执行,若已加载任何Web组件,则该设置无效。 9972 9973**遗留内核适配:** 9974 9975在OpenHarmony 6.0及以后,使用遗留内核时,部分ArkWeb接口不会生效,参考[M114内核在OpenHarmony6.0系统上的适配指导](https://gitcode.com/openharmony-tpc/chromium_src/blob/132_trunk/web/ReleaseNote/CompatibleWithLegacyWebEngine.md)。 9976 9977> **说明:** 9978> 9979> - setActiveWebEngineVersion不支持在异步线程中调用。 9980> - setActiveWebEngineVersion全局生效,在整个APP生命周期中调用一次即可,不需要重复调用。 9981 9982**系统能力:** SystemCapability.Web.Webview.Core 9983 9984**参数:** 9985 9986| 参数名 | 类型 | 必填 | 说明 | 9987| ------------------ | ------- | ---- | ------------- | 9988| engineVersion | [ArkWebEngineVersion](./arkts-apis-webview-e.md#arkwebengineversion20) | 是 | ArkWeb内核版本。 | 9989 9990**示例:** 9991 9992本示例以EntryAbility为例,实现了在Ability创建阶段设置ArkWeb内核版本的功能。 9993 9994```ts 9995// xxx.ets 9996import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 9997import { webview } from '@kit.ArkWeb'; 9998 9999export default class EntryAbility extends UIAbility { 10000 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 10001 console.log("EntryAbility onCreate") 10002 webview.WebviewController.setActiveWebEngineVersion(webview.ArkWebEngineVersion.M114) 10003 if (webview.WebviewController.getActiveWebEngineVersion() == webview.ArkWebEngineVersion.M114) { 10004 console.log("Active Web Engine Version set to M114") 10005 } 10006 console.log("EntryAbility onCreate done") 10007 } 10008} 10009``` 10010 10011## getActiveWebEngineVersion<sup>20+</sup> 10012 10013static getActiveWebEngineVersion(): ArkWebEngineVersion 10014 10015获取当前ArkWeb内核版本。 10016 10017**系统能力:** SystemCapability.Web.Webview.Core 10018 10019**返回值:** 10020 10021| 类型 | 说明 | 10022| ------- | --------------------------------- | 10023| [ArkWebEngineVersion](./arkts-apis-webview-e.md#arkwebengineversion20) | 返回由[ArkWebEngineVersion](./arkts-apis-webview-e.md#arkwebengineversion20)所定义的当前使用的ArkWeb内核版本。 | 10024 10025**示例:** 10026 10027请参考[setActiveWebEngineVersion](#setactivewebengineversion20)。