首页 > 其他分享 >HarmonyOS:基于Web组件构建网络应用(2)

HarmonyOS:基于Web组件构建网络应用(2)

时间:2024-10-25 11:44:04浏览次数:1  
标签:Web 网络应用 WebviewController HarmonyOS controller 组件 webview 加载

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ 
➤GitHub地址:https://github.com/strengthen
➤原文地址:https://www.cnblogs.com/strengthen/p/18502207
➤如果链接不是为敢技术的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

概述

相信大家都遇到过这样的场景,有时候我们点击应用的页面,会跳转到一个类似浏览器加载的页面,加载完成后,才显示这个页面的具体内容,这个加载和显示网页的过程通常都是浏览器的任务。

ArkUI为我们提供了Web组件来加载网页,借助它我们就相当于在自己的应用程序里嵌入一个浏览器,从而非常轻松地展示各种各样的网页。

图1 web组件示例图

本文将为您介绍Web组件一些常用API的使用。

Web组件介绍

Web组件是提供具有网页显示能力的组件。Web组件依赖两个参数,分别是src资源地址、controller控制器。 其中, src资源地址既支持本地资源,也支持网络资源。controller控制器是由@ohos.web.webview提供的web控制能力。

表1 Web组件参数介绍

参数名

参数类型

必填

参数描述

src

ResourceStr

网页资源地址。如果访问本地资源文件,使用$rawfile或者resource协议。如果加载应用包外沙箱路径的本地资源文件,使用file://沙箱文件路径。

controller

WebviewController

控制器。可以控制Web组件的各种行为,如网页前进、后退等

通过$rawfile加载本地资源

对于入参1,如果加载本地网页,可以通过$rawfile加载本地资源文件。

   
  1. import { webview } from '@kit.ArkWeb';
  2. @Entry
  3. @Component
  4. struct WebComponent {
  5. controller: webview.WebviewController = new webview.WebviewController()
  6. build() {
  7. Column() {
  8. // 通过$rawfile加载本地资源文件。
  9. Web({ src: $rawfile("index.html"), controller: this.controller })
  10. }
  11. }
  12. }

通过resource协议加载本地资源文件

对于入参1,如果加载本地网页,可以通过resource协议加载本地资源文件。

   
  1. import { webview } from '@kit.ArkWeb';
  2. @Entry
  3. @Component
  4. struct WebComponent {
  5. controller: webview.WebviewController = new webview.WebviewController()
  6. build() {
  7. Column() {
  8. // 通过resource协议加载本地资源文件。
  9. Web({ src: "resource://rawfile/index.html", controller: this.controller })
  10. }
  11. }
  12. }

加载在线网页

对于入参1,如果加载在线网页,可以传入对应的网页地址。

   
  1. import { webview } from '@kit.ArkWeb';
  2. @Entry
  3. @Component
  4. struct WebComponent {
  5. controller: webview.WebviewController = new webview.WebviewController()
  6. build() {
  7. Column() {
  8. Web({ src: 'www.example.com', controller: this.controller })
  9. }
  10. }
  11. }

当访问在线网页时,需要在module.json5文件中添加网络权限:ohos.permission.INTERNET。

   
  1. "module": {
  2. "requestPermissions": [
  3. {"name": "ohos.permission.INTERNET"}
  4. ]
  5. }

Webview的基本使用

@ohos.web.webview是系统提供的基础能力,提供了许多web控制的能力。例如,WebMessagePort、 WebviewController等。

表2 Webview能力介绍

名称

说明

WebMessagePort

通过WebMessagePort可以进行消息的发送以及接收。

WebviewController

通过WebviewController可以控制Web组件各种行为。

WebCookieManager

通过WebCookie可以控制Web组件中的cookie的各种行为

WebviewController

通过WebviewController可以控制Web组件各种行为。一个WebviewController对象只能控制一个Web组件,且必须在Web组件和WebviewController绑定后,才能调用WebviewController上的方法(静态方法除外)。

WebviewController下包含runJavaScript、 registerJavaScriptProxy、 createWebMessagePorts等接口。

表3 WebviewController接口介绍

接口名称

说明

runJavaScript

异步执行JavaScript脚本,并通过回调方式返回脚本执行的结果。runJavaScript需要在loadUrl完成后,比如onPageEnd中调用。

registerJavaScriptProxy

注入JavaScript对象到window对象中,并在window对象中调用该对象的方法。

createWebMessagePorts

创建Web消息端口

ArkTS调用H5

runJavaScript(script: string): Promise<string>

异步执行JavaScript脚本,并通过Promise方式返回脚本执行的结果。runJavaScript需要在loadUrl完成后,比如onPageEnd中调用。

   
  1. import { webview } from '@kit.ArkWeb';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. controller: webview.WebviewController = new webview.WebviewController();
  7. build() {
  8. Column() {
  9. Web({ src: $rawfile('index.html'), controller: this.controller })
  10. .javaScriptAccess(true)
  11. .onPageEnd(e => {
  12. try {
  13. this.controller.runJavaScript('test()')
  14. .then((result) => {
  15. console.log('result: ' + result);
  16. })
  17. .catch((error: BusinessError) => {
  18. console.error("error: " + error);
  19. })
  20. if (e) {
  21. console.info('url: ', e.url);
  22. }
  23. } catch (error) {
  24. let e: BusinessError = error as BusinessError;
  25. console.error(`ErrorCode: ${e.code}, Message: ${e.message}`);
  26. }
  27. })
  28. }
  29. }
  30. }

加载html文件

   
  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <meta charset="utf-8">
  5. <body>
  6. Hello world!
  7. </body>
  8. <script type="text/javascript">
  9. function test() {
  10. console.log('Ark WebComponent')
  11. return "This value is from index.html"
  12. }
  13. </script>
  14. </html>

 

案例介绍

在这个案例中抽奖转盘是一个Web页面。我们点击抽奖,Web页面中的抽奖转盘会开始运动,(停顿)结束抽奖后,原生页面会弹出一个提示弹窗。

图2 抽奖转盘案例

 

Web页面准备

Web抽奖应用的本地页面代码在entry\src\main\resources目录下,由index.html、index.js、index.css文件组成。抽奖方法的入口函数为startDraw,定义在index.js文件中,为Web应用。

index.html文件代码如下所示:

   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <link rel="stylesheet" type="text/css" href="./css/index.css">
  5. <meta charset="UTF-8">
  6. <title>抽奖页面</title>
  7. <style>
  8. #prize {
  9. border-radius: 16px 16px 16px 16px;
  10. background-image: linear-gradient(180deg, #A2DAFF 0%, #EAF5FF 100%);
  11. margin-left: 1.82%;
  12. margin-top: 1.43%;
  13. width: 96.5%;
  14. height: 96.7%;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div class="luckyDraw">
  20. <!-- Use an unordered list to implement a lottery tray -->
  21. <ul id="prize" class="prizes">
  22. <li class="prizes-li active"><img class="pic" src="#"></li>
  23. <li class="prizes-li"><img class="pic" src="#"></li>
  24. <li class="prizes-li"><img class="pic" src="#"></li>
  25. <li class="prizes-li"><img class="pic" src="#"></li>
  26. <li class="prizes-li"><img class="pic" src="#"></li>
  27. <li class="prizes-li"><img class="pic" src="#"></li>
  28. <li class="prizes-li"><img class="pic" src="#"></li>
  29. <li class="prizes-li"><img class="pic" src="#"></li>
  30. <li class="prizes-li"><img class="pic" onclick="startDraw()" src="#"></li>
  31. </ul>
  32. </div>
  33. <script src="./js/index.js"></script>
  34. </body>
  35. </html>

index.js关键代码如下所示:

   
  1. // 奖品数组
  2. let prizesArr = ["啤酒", "奶茶", "汉堡", "咖啡", "西瓜", "鸡腿", "柠檬", "蛋糕"];
  3. // 奖品对应的图片数组
  4. let arrBigImg = ["./img/1-beer.png", "./img/2-milk.png", "./img/3-hamburg.png",
  5. "./img/4-coffee.png", "./img/5-watermelon.png", "./img/6-drumstick.png",
  6. "./img/7-lemon.png", "./img/8-cake.png", "./img/9-prizes.png"];
  7. // 省略其他的其他参数
  8. ...
  9. // 转盘函数
  10. function roll() {
  11. // 省略实现代码
  12. ...
  13. }
  14. function startDraw() {
  15. if (isClick) {
  16. count = 0;
  17. // 随即生成位置
  18. index = Math.floor(Math.random() * prizesArr.length + 1);
  19. roll();
  20. isClick = false;
  21. }
  22. }
  23. function openDialog() {
  24. confirm(prizesArr[prizesPosition]);
  25. }

原生页面

为了实现抽奖功能,在原生页面需要实现的具体步骤如下所示:

  1. 在按钮的点击事件中,通过runJavaScript方法,来调用Web页面中的抽奖方法。
  2. Web页面完成抽奖后,我们要在Web页面中调用confirm方法,提示抽奖完成。
  3. 完成抽奖后,要在原生页面中写一个onConfirm的确认事件。
  4. 在onConfirm确认事件中,调用AlertDialog方法,来实现二次确认弹窗, 用于用户的友好交互。

ArkTS关键代码如下所示:

   
    1. import { webview } from '@kit.ArkWeb';
    2. import { router } from '@kit.ArkUI';
    3. @Entry
    4. @Component
    5. struct WebPage {
    6. // 创建WebviewController对象
    7. webController: webview.WebviewController = new webview.WebviewController();
    8. build() {
    9. Stack({ alignContent: Alignment.TopStart }) {
    10. ...
    11. Row() {
    12. Column() {
    13. Row() {
    14. ...
    15. // Web组件,src为资源地址,controller为控制器
    16. Web({ src: this.params['path'], controller: this.webController })
    17. .zoomAccess(false)
    18. .width(Const.WebConstant_WIDTH)
    19. .aspectRatio(1)
    20. // 网页调用confirm()告警时触发此回调
    21. .onConfirm((event) => {
    22. // 用户定义的弹窗
    23. AlertDialog.show({
    24. message: Const.WEB_ALERT_DIALOG_TEXT_VALUE + event?.message,
    25. confirm: {
    26. value: $r('app.string.web_alert_dialog_button_value'),
    27. action: () => {
    28. event?.result.handleConfirm();
    29. }
    30. },
    31. cancel: () => {
    32. event?.result.handleCancel();
    33. }
    34. });
    35. return true;
    36. })
    37. ...
    38. // 抽奖按钮
    39. Button($r('app.string.btnValue'))
    40. .fontSize(Const.WebConstant_BUTTON_FONT_SIZE)
    41. .fontColor($r('app.color.start_window_background'))
    42. .margin({ top: Const.WebConstant_BUTTON_MARGIN_TOP })
    43. .width(Const.WebConstant_BUTTON_WIDTH)
    44. .height(Const.WebConstant_BUTTON_HEIGHT)
    45. .backgroundColor($r('app.color.blue'))
    46. .borderRadius(Const.WebConstant_BUTTON_BORDER_RADIUS)
    47. .onClick(() => {
    48. // 调用js函数的入口
    49. this.webController.runJavaScript('startDraw()');
    50. })
    51. }
    52. .width(Const.WebConstant_FULL_WIDTH)
    53. .height(Const.WebConstant_FULL_HEIGHT)
    54. }
    55. ...
    56. }
    57. }

标签:Web,网络应用,WebviewController,HarmonyOS,controller,组件,webview,加载
From: https://www.cnblogs.com/strengthen/p/18502207

相关文章

  • iis部署tms web core
    iis部署tmswebcore首先准备好你要发布的网站文件夹 1)iis设置网站2)1、打开“IIS信息服务管理器”——》选择你发布的网站——》选择功能视图中的“身份验证”——》右键匿名身份验证,选择“编辑”,选择“特定用户IUSR”;2、右键要发布的网站文件夹,选择“安全”——》“编辑......
  • 【接口】websocket
    背景HTTP(超文本传输协议)缺点:缺乏数据加密、身份验证和会话管理等安全特性;HTTP链接的半双工的,而且通信只能由客户端发起,服务端无法将数据主动推送给客户端HTTPS(安全超文本传输协议):为了解决HTTP的缺点,提出HTTPS,提供传输的安全性websocket:为了解决"HTTP链接的半双工的,而且通信只......
  • 从零开始实现WEB自动化 - 网页操作
    本篇是带领大家一起来搭建自动化操作的Chrome插件网页操作基本只会涉及background.js文件的编写,所以我们来分段实现功能清单的操作可以根据此篇文章来了解ChromeAPI支持功能项,来实现功能需求。chrome谷歌浏览器开发文档谷歌浏览器扩展开发-cenchy.com,chrome,chrome扩展,c......
  • (开题报告)django+vue基于Web的网上书店销售系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景在当今数字化时代,电子商务蓬勃发展,网上书店作为其中的重要组成部分,具有广阔的市场前景。关于Web网上书店销售系统的研究,现有研究主要以大......
  • JavaScript 与 Rust 和 WebAssembly 集成
    偶然一次机会,接触了Rust的代码。当时想给团队小伙伴做演示,发现自己并不能在移动端按照文档生成演示demo。我就想,要是Rust代码能转化成JavaScript就好了。结果一搜,还真有。下面整理成文档,分享给大家。为大家解决问题,多提供一种思路、方式、方法。 一、分享的目的:▪由Rust、We......
  • 基于 Koa + Vue3!一个开源的 Linux 服务器 Web SSH 面板工具!
    大家好,我是Java陈序员。今天,给大家介绍一个Linux服务器WebSSH连接面板工具,基于Koa+Vue3实现!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍EasyNode——一个客户端基于Vue3、服务端基于Koa实现的Linux......
  • HarmonyOS:基于Web组件构建网络应用(1)
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18501721➤如果链接不是为敢技术的博客园地址,则可......
  • go esWebClient基于泛型的通用ES客户端eswebrequest封装
    go1.20自动完成结构体转换。测试用例packageeswebrequestimport("fmt""git.ichub.com/general/webcli120/goconfig/ichubconfig""git.ichub.com/general/webcli120/goconfig/ichublog/golog""git.ichub.com/general/webcli12......
  • WebStorm 和 Rider 现在对非商业用途免费
    JetBrains在程序员节这一天在官方博客上发布了一篇文章:《WebStorm和Rider现在对非商业用途免费》宣布了JetBrains将WebStorm和RiderIDE对非商业用途免费的许可模式变动。这一决策旨在降低使用JetBrainsIDE的门槛,帮助开发者学习、成长并保持创造力。非商业用途包括学习、开......
  • SHCTF(week 2)web-wp
    1.guess_the_number:F12后查看源码并下载,由于可以获得第一个数,要知道seed可以使得每次生成的随机数一样,我们考虑爆seed,写脚本如下:importrandomdefr1(seed):random.seed(seed)returnrandom.randint(1000000000,9999999999)forseedinrange(1000000,9999999):......