From 40aa0b58a41451e397d82c8e0fe29d50f1764bca Mon Sep 17 00:00:00 2001 From: zengyawen Date: Mon, 10 Apr 2023 16:57:14 +0800 Subject: [PATCH] update docs Signed-off-by: zengyawen --- zh-cn/application-dev/Readme-CN.md | 1 + .../application-dev-guide-for-gitee.md | 2 + .../application-dev/application-dev-guide.md | 2 + zh-cn/application-dev/web/Readme-CN.md | 17 ++ .../web/figures/debug-effect.png | Bin 0 -> 48322 bytes .../web/figures/resource-path.png | Bin 0 -> 21832 bytes .../web/web-app-page-data-channel.md | 143 ++++++++++++++++ .../web/web-component-overview.md | 14 ++ .../web/web-cookie-and-data-storage-mgmt.md | 131 +++++++++++++++ .../web/web-debugging-with-devtools.md | 45 +++++ zh-cn/application-dev/web/web-file-upload.md | 52 ++++++ .../web/web-geolocation-permission.md | 73 ++++++++ ...-in-app-frontend-page-function-invoking.md | 48 ++++++ .../web/web-in-page-app-function-invoking.md | 113 +++++++++++++ .../web/web-open-in-new-window.md | 69 ++++++++ .../web-page-loading-with-web-components.md | 140 ++++++++++++++++ ...b-redirection-and-browsing-history-mgmt.md | 157 ++++++++++++++++++ .../web-resource-interception-request-mgmt.md | 70 ++++++++ .../application-dev/web/web-set-dark-mode.md | 50 ++++++ 19 files changed, 1127 insertions(+) create mode 100644 zh-cn/application-dev/web/Readme-CN.md create mode 100644 zh-cn/application-dev/web/figures/debug-effect.png create mode 100644 zh-cn/application-dev/web/figures/resource-path.png create mode 100644 zh-cn/application-dev/web/web-app-page-data-channel.md create mode 100644 zh-cn/application-dev/web/web-component-overview.md create mode 100644 zh-cn/application-dev/web/web-cookie-and-data-storage-mgmt.md create mode 100644 zh-cn/application-dev/web/web-debugging-with-devtools.md create mode 100644 zh-cn/application-dev/web/web-file-upload.md create mode 100644 zh-cn/application-dev/web/web-geolocation-permission.md create mode 100644 zh-cn/application-dev/web/web-in-app-frontend-page-function-invoking.md create mode 100644 zh-cn/application-dev/web/web-in-page-app-function-invoking.md create mode 100644 zh-cn/application-dev/web/web-open-in-new-window.md create mode 100644 zh-cn/application-dev/web/web-page-loading-with-web-components.md create mode 100644 zh-cn/application-dev/web/web-redirection-and-browsing-history-mgmt.md create mode 100644 zh-cn/application-dev/web/web-resource-interception-request-mgmt.md create mode 100644 zh-cn/application-dev/web/web-set-dark-mode.md diff --git a/zh-cn/application-dev/Readme-CN.md b/zh-cn/application-dev/Readme-CN.md index b81af1f250..b8117688e8 100644 --- a/zh-cn/application-dev/Readme-CN.md +++ b/zh-cn/application-dev/Readme-CN.md @@ -54,6 +54,7 @@ - 开发 - [应用模型](application-models/Readme-CN.md) - [UI开发](ui/Readme-CN.md) + - [Web](web/Readme-CN.md) - [通知](notification/Readme-CN.md) - [窗口管理](windowmanager/Readme-CN.md) - [WebGL](webgl/Readme-CN.md) diff --git a/zh-cn/application-dev/application-dev-guide-for-gitee.md b/zh-cn/application-dev/application-dev-guide-for-gitee.md index b8320cd4c8..657e5c1a3e 100644 --- a/zh-cn/application-dev/application-dev-guide-for-gitee.md +++ b/zh-cn/application-dev/application-dev-guide-for-gitee.md @@ -24,6 +24,8 @@ 所有应用都应该在这两个框架的基础之上进行功能的开发。 在此基础上,还提供了如下功能的开发指导: + +- [Web](web/web-component-overview.md) - [通知](notification/Readme-CN.md) - [窗口管理](windowmanager/Readme-CN.md) - [WebGL](webgl/Readme-CN.md) diff --git a/zh-cn/application-dev/application-dev-guide.md b/zh-cn/application-dev/application-dev-guide.md index 000525a353..f08c1d4377 100644 --- a/zh-cn/application-dev/application-dev-guide.md +++ b/zh-cn/application-dev/application-dev-guide.md @@ -24,6 +24,8 @@ 所有应用都应该在这两个框架的基础之上进行功能的开发。 在此基础上,还提供了如下功能的开发指导: + +- [Web](web/web-component-overview.md) - [通知](notification/notification-overview.md) - [窗口管理](windowmanager/window-overview.md) - [WebGL](webgl/webgl-overview.md) diff --git a/zh-cn/application-dev/web/Readme-CN.md b/zh-cn/application-dev/web/Readme-CN.md new file mode 100644 index 0000000000..7d74417e17 --- /dev/null +++ b/zh-cn/application-dev/web/Readme-CN.md @@ -0,0 +1,17 @@ +# Web + +- [Web组件概述](web-component-overview.md) +- [使用Web组件加载页面](web-page-loading-with-web-components.md) +- 设置基本属性和事件 + - [设置深色模式](web-set-dark-mode.md) + - [上传文件](web-file-upload.md) + - [在新窗口中打开页面](web-open-in-new-window.md) + - [管理位置权限](web-geolocation-permission.md) +- 在应用中使用前端页面JavaScript + - [应用侧调用前端页面函数](web-in-app-frontend-page-function-invoking.md) + - [前端页面调用应用侧函数](web-in-page-app-function-invoking.md) + - [建立应用侧与前端页面数据通道](web-app-page-data-channel.md) +- [管理页面跳转及浏览记录导航](web-redirection-and-browsing-history-mgmt.md) +- [管理Cookie及数据存储](web-cookie-and-data-storage-mgmt.md) +- [自定义页面请求响应](web-resource-interception-request-mgmt.md) +- [使用Devtools工具调试前端页面](web-debugging-with-devtools.md) \ No newline at end of file diff --git a/zh-cn/application-dev/web/figures/debug-effect.png b/zh-cn/application-dev/web/figures/debug-effect.png new file mode 100644 index 0000000000000000000000000000000000000000..32c46cadbb99a6623532f50d14fa0750854c9a5d GIT binary patch literal 48322 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�qEo_{IguGkdOWC{ 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 { + this.sendFromEts = value; + }) + + Button('postMessage') + .onClick(() => { + try { + // 1、创建两个消息端口。 + this.ports = this.controller.createWebMessagePorts(); + // 2、在应用侧的消息端口(如端口1)上注册回调事件。 + this.ports[1].onMessageEvent((result: web_webview.WebMessage) => { + let msg = 'Got msg from HTML:'; + if (typeof(result) === 'string') { + console.info(`received string message from html5, string is: ${result}`); + msg = msg + result; + } else if (typeof(result) === 'object') { + if (result instanceof ArrayBuffer) { + console.info(`received arraybuffer from html5, length is: ${result.byteLength}`); + msg = msg + 'lenght is ' + result.byteLength; + } else { + console.info('not support'); + } + } else { + console.info('not support'); + } + this.receivedFromHtml = msg; + }) + // 3、将另一个消息端口(如端口0)发送到HTML侧,由HTML侧保存并使用。 + this.controller.postMessage('__init_port__', [this.ports[0]], '*'); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + + // 4、使用应用侧的端口给另一个已经发送到html的端口发送消息。 + Button('SendDataToHTML') + .onClick(() => { + try { + if (this.ports && this.ports[1]) { + this.ports[1].postMessageEvent(this.sendFromEts); + } else { + console.error(`ports is null, Please initialize first`); + } + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + Web({ src: $rawfile('xxx.html'), controller: this.controller }) + } + } + } + ``` + +- 前端页面代码。 + + ```html + + + + + + WebView Message Port Demo + + + + + +

WebView Message Port Demo

+
+
+
+
+

display received message send from ets

+ + + ``` diff --git a/zh-cn/application-dev/web/web-component-overview.md b/zh-cn/application-dev/web/web-component-overview.md new file mode 100644 index 0000000000..194d99267c --- /dev/null +++ b/zh-cn/application-dev/web/web-component-overview.md @@ -0,0 +1,14 @@ +# Web组件概述 + + +Web组件用于在应用程序中显示Web页面内容,为开发者提供页面加载、页面交互、页面调试等能力。 + + +- 页面加载:Web组件提供基础的前端页面加载的能力,包括加载网络页面、本地页面、Html格式文本数据。 + +- 页面交互:Web组件提供丰富的页面交互的方式,包括:设置前端页面深色模式,新窗口中加载页面,位置权限管理,Cookie管理,应用侧使用前端页面JavaScript等能力。 + +- 页面调试:Web组件支持使用Devtools工具调试前端页面。 + + +下面通过常见使用场景举例,来具体介绍Web组件功能特性。 diff --git a/zh-cn/application-dev/web/web-cookie-and-data-storage-mgmt.md b/zh-cn/application-dev/web/web-cookie-and-data-storage-mgmt.md new file mode 100644 index 0000000000..8f8dd1357c --- /dev/null +++ b/zh-cn/application-dev/web/web-cookie-and-data-storage-mgmt.md @@ -0,0 +1,131 @@ +# 管理Cookie及数据存储 + + +## Cookie管理 + +Cookie是网络访问过程中,由服务端发送给客户端的一小段数据。客户端可持有该数据,并在后续访问该服务端时,方便服务端快速对客户端身份、状态等进行识别。 + +Web组件提供了WebCookieManager类,用于管理Web组件的Cookie信息。Cookie信息保存在应用沙箱路径下/proc/{pid}/root/data/storage/el2/base/cache/web/Cookiesd的文件中。 + +下面以[setCookie()](../reference/apis/js-apis-webview.md#setcookie)接口举例,为“www.example.com”设置单个Cookie的值“value=test”。其他Cookie的相关功能及使用,请参考[WebCookieManager()](../reference/apis/js-apis-webview.md#webcookiemanager)接口文档。 + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Button('setCookie') + .onClick(() => { + try { + web_webview.WebCookieManager.setCookie('https://www.example.com', 'value=test'); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + Web({ src: 'www.example.com', controller: this.controller }) + } + } +} +``` + + +## 缓存与存储管理 + +在访问网站时,网络资源请求是相对比较耗时的。开发者可以通过Cache、Dom Storage等手段将资源保持至本地,以提升访问同一网站的速度。 + + +### Cache + +使用[cacheMode()](../reference/arkui-ts/ts-basic-components-web.md#cachemode%E6%9E%9A%E4%B8%BE%E8%AF%B4%E6%98%8E)配置页面资源的缓存模式,Web组件为开发者提供四种缓存模式,分别为: + +- Default : 优先使用未过期的缓存,如果缓存不存在,则从网络获取。 + +- None : 加载资源使用cache,如果cache中无该资源则从网络中获取。 + +- Online : 加载资源不使用cache,全部从网络中获取。 + +- Only :只从cache中加载资源。 + + +在下面的示例中,选用缓存设置为None模式。 + + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + @State mode: CacheMode = CacheMode.None; + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Web({ src: 'www.example.com', controller: this.controller }) + .cacheMode(this.mode) + } + } +} +``` + + + 同时,为了获取最新资源,开发者可以通过[removeCache()](../reference/apis/js-apis-webview.md#removecache)接口清除已经缓存的资源,示例代码如下: + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + @State mode: CacheMode = CacheMode.None; + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Button('removeCache') + .onClick(() => { + try { + // 设置为true时同时清除rom和ram中的缓存,设置为false时只清除ram中的缓存 + this.controller.removeCache(true); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + Web({ src: 'www.example.com', controller: this.controller }) + .cacheMode(this.mode) + } + } +} +``` + + +### Dom Storage + +Dom Storage包含了Session Storage和Local Storage两类。前者为临时数据,其存储与释放跟随会话生命周期;后者为可持久化数据,落盘在应用目录下。两者的数据均通过Key-Value的形式存储,通常在访问需要客户端存储的页面时使用。开发者可以通过Web组件的属性接口[domStorageAccess()](../reference/arkui-ts/ts-basic-components-web.md#domstorageaccess)进行使能配置,示例如下: + + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Web({ src: 'www.example.com', controller: this.controller }) + .domStorageAccess(true) + } + } +} +``` diff --git a/zh-cn/application-dev/web/web-debugging-with-devtools.md b/zh-cn/application-dev/web/web-debugging-with-devtools.md new file mode 100644 index 0000000000..2917bca7bb --- /dev/null +++ b/zh-cn/application-dev/web/web-debugging-with-devtools.md @@ -0,0 +1,45 @@ +# 使用Devtools工具调试前端页面 + + +Web组件支持使用DevTools工具调试前端页面。DevTools是一个 Web前端开发调试工具,提供了电脑上调试移动设备前端页面的能力。开发者通过[setWebDebuggingAccess()](../reference/apis/js-apis-webview.md#setwebdebuggingaccess)接口开启Web组件前端页面调试能力,利用DevTools工具可以在电脑上调试移动设备上的前端网页。 + + +使用DevTools工具,可以执行以下步骤: + + +1. 在应用代码中开启Web调试开关,具体如下: + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + aboutToAppear() { + // 配置web开启调试模式 + web_webview.WebviewController.setWebDebuggingAccess(true); + } + build() { + Column() { + Web({ src: 'www.example.com', controller: this.controller }) + } + } + } + ``` + +2. 将设备连接上电脑,在电脑端配置端口映射,配置方法如下: + + ``` + // 添加映射 + hdc fport tcp:9222 tcp:9222 + // 查看映射 + hdc fport ls + ``` + +3. 在电脑端chrome浏览器地址栏中输入chrome://inspect/\#devices,页面识别到设备后,就可以开始页面调试。调试效果如下: + + **图1** 页面调试效果图 + + ![debug-effect](figures/debug-effect.png) diff --git a/zh-cn/application-dev/web/web-file-upload.md b/zh-cn/application-dev/web/web-file-upload.md new file mode 100644 index 0000000000..d2d37e6734 --- /dev/null +++ b/zh-cn/application-dev/web/web-file-upload.md @@ -0,0 +1,52 @@ +# 上传文件 + + +Web组件支持前端页面选择文件上传功能,应用开发者可以使用[onShowFileSelector()](../reference/arkui-ts/ts-basic-components-web.md#onshowfileselector9)接口来处理前端页面文件上传的请求。 + + +下面的示例中,当用户在前端页面点击文件上传按钮,应用侧在[onShowFileSelector()](../reference/arkui-ts/ts-basic-components-web.md#onshowfileselector9)接口中收到文件上传请求,在此接口中开发者将上传的本地文件路径设置给前端页面。 + + +- 应用侧代码。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + @Entry + @Component + struct WebComponent { + controller: WebController = new WebController() + build() { + Column() { + // 加载本地local.html页面 + Web({ src: $rawfile('local.html'), controller: this.controller }) + .onShowFileSelector((event) => { + // 开发者设置要上传的文件路径 + let fileList: Array = [ + 'xxx/test.png', + ] + event.result.handleFileList(fileList) + return true; + }) + } + } + } + ``` + + +- local.html页面代码。 + + ```html + + + + + Document + + + + +
+ + + ``` diff --git a/zh-cn/application-dev/web/web-geolocation-permission.md b/zh-cn/application-dev/web/web-geolocation-permission.md new file mode 100644 index 0000000000..82866d3ecd --- /dev/null +++ b/zh-cn/application-dev/web/web-geolocation-permission.md @@ -0,0 +1,73 @@ +# 管理位置权限 + + +Web组件提供位置权限管理能力。开发者可以通过[onGeolocationShow()](../reference/arkui-ts/ts-basic-components-web.md#ongeolocationshow)接口对某个网站进行位置权限管理。Web组件根据接口响应结果,决定是否赋予前端页面权限。获取设备位置,需要开发者配置[ohos.permission.LOCATION](../security/accesstoken-guidelines.md)权限。 + + +在下面的示例中,用户点击前端页面"获取位置"按钮,Web组件通过弹窗的形式通知应用侧位置权限请求消息。 + + +- 前端页面代码。 + + ```html + + + +

位置信息

+ + + + + ``` + + +- 应用代码。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Web({ src:$rawfile('getLocation.html'), controller:this.controller }) + .geolocationAccess(true) + .onGeolocationShow((event) => { // 地理位置权限申请通知 + AlertDialog.show({ + title: '位置权限请求', + message: '是否允许获取位置信息', + primaryButton: { + value: 'cancel', + action: () => { + event.geolocation.invoke(event.origin, false, false); // 不允许此站点地理位置权限请求 + } + }, + secondaryButton: { + value: 'ok', + action: () => { + event.geolocation.invoke(event.origin, true, false); // 允许此站点地理位置权限请求 + } + }, + cancel: () => { + event.geolocation.invoke(event.origin, false, false); // 不允许此站点地理位置权限请求 + } + }) + }) + } + } + } + ``` diff --git a/zh-cn/application-dev/web/web-in-app-frontend-page-function-invoking.md b/zh-cn/application-dev/web/web-in-app-frontend-page-function-invoking.md new file mode 100644 index 0000000000..2a490281b4 --- /dev/null +++ b/zh-cn/application-dev/web/web-in-app-frontend-page-function-invoking.md @@ -0,0 +1,48 @@ +# 应用侧调用前端页面函数 + + +应用侧可以通过[runJavaScript()](../reference/apis/js-apis-webview.md#runjavascript)方法调用前端页面的JavaScript相关函数。 + + +在下面的示例中,点击应用侧的“runJavaScript”按钮时,来触发前端页面的htmlTest()方法。 + + +- 前端页面代码。 + + ```html + + + + + + + + ``` + + +- 应用侧代码。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Web({ src: $rawfile('index.html'), controller: this.webviewController}) + Button('runJavaScript') + .onClick(() => { + this.webviewController.runJavaScript('htmlTest()'); + }) + } + } + } + ``` diff --git a/zh-cn/application-dev/web/web-in-page-app-function-invoking.md b/zh-cn/application-dev/web/web-in-page-app-function-invoking.md new file mode 100644 index 0000000000..caffe3d2cc --- /dev/null +++ b/zh-cn/application-dev/web/web-in-page-app-function-invoking.md @@ -0,0 +1,113 @@ +# 前端页面调用应用侧函数 + + +开发者使用Web组件将应用侧代码注册到前端页面中,注册完成之后,前端页面中使用注册的对象名称就可以调用应用侧的函数,实现在前端页面中调用应用侧方法。 + + +注册应用侧代码有两种方式,一种在Web组件初始化使用调用,使用[javaScriptProxy()](../reference/arkui-ts/ts-basic-components-web.md#javascriptproxy)接口。另外一种在Web组件初始化完成后调用,使用[registerJavaScriptProxy()](../reference/apis/js-apis-webview.md#registerjavascriptproxy)接口。 + + +在下面的示例中,将test()方法注册在前端页面中, 该函数可以在前端页面触发运行。 + + +- [javaScriptProxy()](../reference/arkui-ts/ts-basic-components-web.md#javascriptproxy)接口使用示例如下。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + // 声明需要注册的对象 + testObj = { + test: () => { + return 'ArkTS Hello World!'; + } + } + + build() { + Column() { + // web组件加载本地index.html页面 + Web({ src: $rawfile('index.html'), controller: this.webviewController}) + // 将对象注入到web端 + .javaScriptProxy({ + object: this.testObj, + name: "testObjName", + methodList: ["test"], + controller: this.webviewController + }) + } + } + } + ``` + + +- 应用侧使用registerJavaScriptProxy()接口注册。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct Index { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + testObj = { + test: (data) => { + return "ArkUI Web Component"; + }, + toString: () => { + console.info('Web Component toString'); + } + } + + build() { + Column() { + Button('refresh') + .onClick(() => { + try { + this.webviewController.refresh(); + } catch (error) { + console.error(`Errorcode: ${error.code}, Message: ${error.message}`); + } + }) + Button('Register JavaScript To Window') + .onClick(() => { + try { + this.webviewController.registerJavaScriptProxy(this.testObj, "objName", ["test", "toString"]); + } catch (error) { + console.error(`Errorcode: ${error.code}, Message: ${error.message}`); + } + }) + Web({ src: $rawfile('index.html'), controller: this.webviewController }) + } + } + } + ``` + + > **说明:** + > + > 使用[registerJavaScriptProxy()](../reference/apis/js-apis-webview.md#registerjavascriptproxy)接口注册方法时,注册后需调用[refresh()](../reference/apis/js-apis-webview.md#refresh)接口生效。 + + +- index.htm前端页面触发应用侧代码。 + + ```html + + + + + +

+ + + + ``` diff --git a/zh-cn/application-dev/web/web-open-in-new-window.md b/zh-cn/application-dev/web/web-open-in-new-window.md new file mode 100644 index 0000000000..99a2445445 --- /dev/null +++ b/zh-cn/application-dev/web/web-open-in-new-window.md @@ -0,0 +1,69 @@ +# 在新窗口中打开页面 + + +Web组件提供了在新窗口打开页面的能力,开发者可以通过[multiWindowAccess()](../reference/arkui-ts/ts-basic-components-web.md#multiwindowaccess9)接口来设置是否允许网页在新窗口打开。当有新窗口打开时,应用侧会在[onWindowNew()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9)接口中收到Web组件新窗口事件,开发者需要在此接口事件中,新建窗口来处理Web组件窗口请求。 + + +> **说明:** +> +> - [allowWindowOpenMethod()](../reference/arkui-ts/ts-basic-components-web.md#allowwindowopenmethod9)接口设置为true时,前端页面通过JavaScript函数调用的方式打开新窗口。 +> +> - 如果开发者在[onWindowNew()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9)接口通知中不需要打开新窗口,需要将[ControllerHandler.setWebController()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9)接口返回值设置成null。 + + +如下面的本地示例,当用户点击“新窗口中打开网页”按钮时,应用侧会在[onWindowNew()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9)接口中收到Web组件新窗口事件。 + + +- 应用侧代码。 + + 创建新窗口的方法可参考[Web开发相关例子](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Web/Browser)。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + @Entry + @Component + struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Web({ src:$rawfile("window.html"), controller: this.controller }) + .multiWindowAccess(true) + .onWindowNew((event) => { + console.info("onWindowNew..."); + var popController: web_webview.WebviewController = new web_webview.WebviewController(); + // 开发者需要在此处新建窗口,跟popController关联,并且将popController返回给Web组件。如果不需要打开新窗口请将返回值设置为event.handler.setWebController(null); + event.handler.setWebController(popController); + }) + } + } + } + ``` + + +- window.html页面代码。 + + ```html + + + + + WindowEvent + + + + + + + + ``` diff --git a/zh-cn/application-dev/web/web-page-loading-with-web-components.md b/zh-cn/application-dev/web/web-page-loading-with-web-components.md new file mode 100644 index 0000000000..98a7ea1360 --- /dev/null +++ b/zh-cn/application-dev/web/web-page-loading-with-web-components.md @@ -0,0 +1,140 @@ +# 使用Web组件加载页面 + + +页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景,包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 + + +页面加载过程中,若涉及网络资源获取,需要配置[ohos.permission.INTERNET](../security/accesstoken-guidelines.md)网络访问权限。 + + +## 加载网络页面 + +开发者可以在Web组件创建的时候指定默认加载的网络页面 。在默认页面加载完成后,如果开发者需要变更此Web组件显示的网络页面,可以通过调用[loadUrl()](../reference/apis/js-apis-webview.md#loadurl)接口加载指定网络网页。 + + +在下面的示例中,在Web组件加载完“www.example.com”页面后,开发者可通过loadUrl接口将此Web组件显示页面变更为“www.example1.com”。 + + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Button('loadUrl') + .onClick(() => { + try { + // 点击按钮时,通过loadUrl,跳转到www.example1.com + this.webviewController.loadUrl('www.example1.com'); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + // 组件创建时,加载www.example.com + Web({ src: 'www.example.com', controller: this.webviewController}) + } + } +} +``` + + +## 加载本地页面 + +将本地页面文件放在应用的rawfile目录下,开发者可以在Web组件创建的时候指定默认加载的本地页面 ,并且加载完成后可通过调用[loadUrl()](../reference/apis/js-apis-webview.md#loadurl)接口变更当前Web组件的页面。 + + +在下面的示例中展示加载本地页面文件的方法: + + +- 将资源文件放置在应用的resources/rawfile目录下。 + + **图1** 资源文件路径   + + ![resource-path](figures/resource-path.png) + + +- 应用侧代码。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Button('loadUrl') + .onClick(() => { + try { + // 点击按钮时,通过loadUrl,跳转到local1.html + this.webviewController.loadUrl($rawfile("local1.html")); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + // 组件创建时,通过$rawfile加载本地文件local.html + Web({ src: $rawfile("local.html"), controller: this.webviewController }) + } + } + } + ``` + + +- local.html页面代码。 + + ```html + + + + +

Hello World

+ + + ``` + + +## 加载HTML格式的文本数据 + +Web组件可以通过[loadData()](../reference/apis/js-apis-webview.md#loaddata)接口实现加载HTML格式的文本数据。当开发者不需要加载整个页面,只需要显示一些页面片段时,可通过此功能来快速加载页面。 + + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Button('loadData') + .onClick(() => { + try { + // 点击按钮时,通过loadData,加载HTML格式的文本数据 + this.controller.loadData( + 'Source:
source
', + 'text/html', + 'UTF-8' + ); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + // 组件创建时,加载www.example.com + Web({ src: 'www.example.com', controller: this.controller }) + } + } +} +``` diff --git a/zh-cn/application-dev/web/web-redirection-and-browsing-history-mgmt.md b/zh-cn/application-dev/web/web-redirection-and-browsing-history-mgmt.md new file mode 100644 index 0000000000..4d64482bf4 --- /dev/null +++ b/zh-cn/application-dev/web/web-redirection-and-browsing-history-mgmt.md @@ -0,0 +1,157 @@ +# 管理页面跳转及浏览记录导航 + + +## 历史记录导航 + +使用者在前端页面点击网页中的链接时,Web组件默认会自动打开并加载目标网址。当前端页面替换为新的加载链接时,会自动记录已经访问的网页地址。可以通过[forward()](../reference/apis/js-apis-webview.md#forward)和[backward()](../reference/apis/js-apis-webview.md#backward)接口向前/向后浏览上一个/下一个历史记录。 + + 在下面的示例中,点击应用的按钮来触发前端页面的后退操作。 + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Button('loadData') + .onClick(() => { + if (this.webviewController.accessBackward()) { + this.webviewController.backward(); + return true; + } + }) + Web({ src: 'https://www.example.com/cn/', controller: this.webviewController}) + } + } +} +``` + + +如果存在历史记录,[accessBackward()](../reference/apis/js-apis-webview.md#accessbackward)接口会返回true。同样,您可以使用[accessForward()](../reference/apis/js-apis-webview.md#accessforward)接口检查是否存在前进的历史记录。如果您不执行检查,那么当用户浏览到历史记录的末尾时,调用[forward()](../reference/apis/js-apis-webview.md#forward)和[backward()](../reference/apis/js-apis-webview.md#backward)接口时将不执行任何操作。 + + +## 页面跳转 + +当点击网页中的链接需要跳转到应用内其他页面时,可以通过使用Web组件的[onUrlLoadIntercept()](../reference/arkui-ts/ts-basic-components-web.md#onurlloadintercept)接口来实现。 + +在下面的示例中,应用首页Index.ets加载前端页面route.html,在前端route.html页面点击超链接,可跳转到应用的ProfilePage.ets页面。 + +- 应用首页index.ets页面代码。 + + ```ts + // index.ets + import web_webview from '@ohos.web.webview'; + import router from '@ohos.router'; + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Web({ src: $rawfile('route.html'), controller: this.webviewController }) + .onUrlLoadIntercept((event) => { + let url: string = event.data as string; + if (url.indexOf('native://') === 0) { + // 跳转其他界面 + router.pushUrl({ url:url.substring(9) }) + return true; + } + return false; + }) + } + } + } + ``` + +- route.html前端页面代码。 + + ```html + + + + +
+ + + ``` + +- 跳转页面ProfilePage.ets代码。 + + ```ts + @Entry + @Component + struct ProfilePage { + @State message: string = 'Hello World'; + + build() { + Column() { + Text(this.message) + .fontSize(20) + } + } + } + ``` + + +## 跨应用跳转 + +Web组件可以实现点击前端页面超链接跳转到其他应用。 + +在下面的示例中,点击call.html前端页面中的超连接,跳转到电话应用的拨号界面。 + +- 应用侧代码。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + import call from '@ohos.telephony.call'; + + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Web({ src: $rawfile('xxx.html'), controller: this.webviewController}) + .onUrlLoadIntercept((event) => { + let url: string = event.data as string; + // 判断链接是否为拨号链接 + if (url.indexOf('tel://') === 0) { + // 跳转拨号界面 + call.makeCall(url.substring(6), (err) => { + if (!err) { + console.info('make call succeeded.'); + } else { + console.info('make call fail, err is:' + JSON.stringify(err)); + } + }); + return true; + } + return false; + }) + } + } + } + ``` + +- 前端页面call.html代码。 + + ```html + + + + + + + + ``` diff --git a/zh-cn/application-dev/web/web-resource-interception-request-mgmt.md b/zh-cn/application-dev/web/web-resource-interception-request-mgmt.md new file mode 100644 index 0000000000..6a01c946ea --- /dev/null +++ b/zh-cn/application-dev/web/web-resource-interception-request-mgmt.md @@ -0,0 +1,70 @@ +# 自定义页面请求响应 + + +Web组件支持在应用拦截到页面请求后自定义响应请求能力。开发者通过[onInterceptRequest()](../reference/arkui-ts/ts-basic-components-web.md#oninterceptrequest9)接口来实现自定义资源请求响应 。自定义请求能力可以用于开发者自定义Web页面响应、自定义文件资源响应等场景。 + + +Web网页上发起资源加载请求,应用层收到资源请求消息。应用层构造本地资源响应消息发送给Web内核。Web内核解析应用层响应信息,根据此响应信息进行页面资源加载。 + + +在下面的示例中,Web组件通过拦截页面请求“https://www.intercept.com/test.html”, 在应用侧代码构建响应资源,实现自定义页面响应场景。 + + +- 前端页面example.html代码。 + + ```html + + + + + example + + + + intercept test! + + + ``` + +- 应用侧代码。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController() + responseResource: WebResourceResponse = new WebResourceResponse() + // 开发者自定义响应数据 + @State webData: string = '\n' + + '\n'+ + '\n'+ + 'intercept test\n'+ + '\n'+ + '\n'+ + '

intercept ok

\n'+ + '\n'+ + '' + build() { + Column() { + Web({ src: $rawfile('example.html'), controller: this.controller }) + .onInterceptRequest((event) => { + console.info('url:' + event.request.getRequestUrl()); + // 拦截页面请求 + if (event.request.getRequestUrl() !== 'https://www.intercept.com/test.html') { + return null; + } + // 构造响应数据 + this.responseResource.setResponseData(this.webData); + this.responseResource.setResponseEncoding('utf-8'); + this.responseResource.setResponseMimeType('text/html'); + this.responseResource.setResponseCode(200); + this.responseResource.setReasonMessage('OK'); + return this.responseResource; + }) + } + } + } + ``` diff --git a/zh-cn/application-dev/web/web-set-dark-mode.md b/zh-cn/application-dev/web/web-set-dark-mode.md new file mode 100644 index 0000000000..687249c6d5 --- /dev/null +++ b/zh-cn/application-dev/web/web-set-dark-mode.md @@ -0,0 +1,50 @@ +# 设置深色模式 + + +Web组件支持对前端页面进行深色模式配置。 + + +- 通过[darkMode()](../reference/arkui-ts/ts-basic-components-web.md#darkmode9)接口可以配置不同的深色模式,[WebDarkMode.Off](../reference/arkui-ts/ts-basic-components-web.md#webdarkmode9%E6%9E%9A%E4%B8%BE%E8%AF%B4%E6%98%8E)模式表示关闭深色模式。[WebDarkMode.On](../reference/arkui-ts/ts-basic-components-web.md#webdarkmode9%E6%9E%9A%E4%B8%BE%E8%AF%B4%E6%98%8E)表示开启深色模式,并且深色模式跟随前端页面。[WebDarkMode.Auto](../reference/arkui-ts/ts-basic-components-web.md#webdarkmode9%E6%9E%9A%E4%B8%BE%E8%AF%B4%E6%98%8E)表示开启深色模式,并且深色模式跟随系统。 + 在下面的示例中, 通过[darkMode()](../reference/arkui-ts/ts-basic-components-web.md#darkmode9)接口将页面深色模式配置为跟随系统。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + @State mode: WebDarkMode = WebDarkMode.Auto; + build() { + Column() { + Web({ src: 'www.example.com', controller: this.controller }) + .darkMode(this.mode) + } + } + } + ``` + + +- 通过[forceDarkAccess()](../reference/arkui-ts/ts-basic-components-web.md#forcedarkaccess9)接口可将前端页面强制配置深色模式,且深色模式不跟随前端页面和系统。配置该模式时候,需要将深色模式配置成WebDarkMode.On。 + 在下面的示例中, 通过[forceDarkAccess()](../reference/arkui-ts/ts-basic-components-web.md#forcedarkaccess9)接口将页面强制配置为深色模式。 + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + @State mode: WebDarkMode = WebDarkMode.On; + @State access: boolean = true; + build() { + Column() { + Web({ src: 'www.example.com', controller: this.controller }) + .darkMode(this.mode) + .forceDarkAccess(this.access) + } + } + } + ``` -- GitLab