ArkWeb

Web 相关标准技术(HTML/CSS/JS),是业内支持性最广泛的技术,可以在最广泛的平台下实现“一次编写到处运行”;大部分对性能无需极致要求的应用页面,都可以使用 Web 技术来实现。

鸿蒙 ArkWeb Kit(方舟 Web)提供了 Web 组件(也称为 Webview 组件),本质就是 HTML/CSS/JS 解释和渲染引擎,用于在应用程序中显示 Web 页面内容,为开发者提供页面加载、页面交互、页面调试等能力。

  • 页面加载:Web 组件提供基础的前端页面加载的能力,包括加载网络页面、本地页面、HTML 格式文本数据。
  • 页面交互:Web 组件提供丰富的页面交互的方式,包括:设置前端页面深色模式,新窗口中加载页面,位置权限管理,Cookie 管理,应用侧使用前端页面 JavaScript 等能力。
  • 页面调试:Web 组件支持使用 Devtools 工具调试前端页面

当前鸿蒙系统中的 Web 组件底层实现是开源的 Chromium 内核(Webkit + V8 组合);华为未来计划完全自主实现该组件。

Web 组件生命周期

  • aboutToAppear:可设置调试模式 / 跨域请求权限 / Cookie 等
  • onControllerAttached:推荐在此 loadUrl / 设置自定义用户代理 / 注入 JS 对象等
  • onLoadIntercept:当 Web 组件加载 url 之前触发该回调,用于判断是否阻止此次访问。默认 false 表允许加载
  • onInterceptRequest:当 Web 组件加载 url 之前触发该回调,用于拦截 url 并返回响应数据
  • onPageBegin:网页开始加载时触发该回调
  • onProgressChange:网页开始加载时触发该回调
  • onPageEnd:网页加载完成时触发该回调,推荐在此回调中执行 runJavaScript()异步执行 JS
  • onPageVisible:当响应的主体开始加载,新页面即将可见时触发该回调;此时外链资源尚不可用
  • onDisAppear:组件卸载消失时触发此回调

加载网络页面

开发者可以在 Web 组件创建时,指定默认加载的网络页面 。在默认页面加载完成后,如果开发者需要变更此 Web 组件显示的网络页面,可以通过调用 loadUrl()接口加载指定的网页。

import { webview } from '@kit.ArkWeb'struct Page{controller = new webview.WebviewController( )build() {Column() {Button('loadUrl').onClick(() => {this.controller.loadUrl('www.10086.cn')       //按钮点击后,加载第二个页面})// 组件创建时,加载第一个页面Web({ src: 'www.baidu.com', controller: this.controller})}}
}

涉及网络资源获取,需要配置 ohos.permission.INTERNET 权限

加载本地页面

将本地页面文件放在应用的 rawfile 目录下,开发者可以在 Web 组件创建的时候指定默认加载的本地页面 ,并且加载完成后可通过调用 loadUrl() 接口变更当前 Web 组件的页面。

import { webview } from '@kit.ArkWeb'struct Page{controller = new webview.WebviewController( )build() {Column() {Button('loadPage').onClick(() => {this.controller.loadUrl( $rawfile("notfound.html") )     //加载第二个页面})// 组件创建时,加载第一个页面Web({ src:  $rawfile("loading.html"), controller: this.controller})}}
}

加载 HTML 数据

Web 组件可以通过 loadData() 接口实现加载 HTML 格式的文本数据。当开发者不需要加载整个页面,只需要显示一些页面片段时,可通过此功能来快速加载页面。

import { webview } from '@kit.ArkWeb'
struct Page{controller = new webview.WebviewController()build() {Column() {Button('loadData').onClick(() => {this.controller.loadData(       //按钮点击后,加载HTML片段"<html><body>Source:<pre>source</pre></body></html>","text/html","UTF-8"  )})// 组件创建时,加载第一个页面Web({ src:  $rawfile("loading.html"), controller: this.controller })}}
}

应用侧和 Web 侧交互

数据通道

Web 侧和应用侧之间可以用 createWebMessagePorts() 创建两个消息端口来实现两端的通信

//应用侧(ArkTS) —— 使用端口1发消息
ports: webview.WebMessagePort[ ] = [ ]this.ports = this.controller.createWebMessagePorts( )   //会创建两个Port对象
this.controller.postMessage('init', [this.ports[0]], '*')this.ports[1].onMessageEvent((msg: webview.WebMessage) => {})
this.ports[1].postMessageEvent('msg')
//Web侧(JS) —— 使用端口0发消息
let port = null;
window.addEventListener("message", (e) => {port = e.ports[0];port.onmessage = (m) => {};
});
bt.onclick = () => {port.postMessage("This is Client - " + Date.now());
};

应用侧调 Web 侧函数

应用侧可以通过 runJavaScript( ) 方法调用前端页面的 JavaScript 相关函数:

前端页面声明 JS 函数:

<script>function startLottery() {//开始}
</script>

应用侧调用前端页面函数:

Button("运行JS代码").onClick(() => {this.controller.runJavaScript("startLottery( )");//需要传参的话也可以在上述函数调用过程中传递,返回值可以在Promise中读取
});

Web 侧调应用侧函数

开发者使用 Web 组件将应用侧代码 注册 到前端页面中,注册完成之后,前端页面中使用注册的对象名称就可以调用应用侧的函数,实现在前端页面中调用应用侧方法。
应用侧注册对象和方法(代理方法)给前端页面:

Web({src: $rawfile("page.html"),controller: this.controller,
}).javaScriptProxy({//给Web侧注册一个代理对象object: this, //被代理的对象name: "appObj", //代理人在Web端的名称methodList: ["back"], //被代理的对象中哪些方法要暴露给Web侧controller: this.controller,
});

前端页面调用应用侧注册来的对象和方法:

<script>btn.onclick = () => {appObj.back(); //需要传参的话可以在形参处传递,返回值可以在Promise中读取};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85310.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85310.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85310.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-迪米特法则(Law of Demeter, LoD)

迪米特法则&#xff08;Law of Demeter, LoD&#xff09; 别名&#xff1a;最少知识原则&#xff08;Least Knowledge Principle&#xff09; 核心思想&#xff1a;一个对象应尽可能少地与其他对象发生交互&#xff0c;只与直接的朋友&#xff08;成员变量、方法参数、方法返回…

python获取AB直线间任意一点经纬度

获取AB直线间任意一点经纬度 1、目标 已知A点经纬度,距离;B点经纬度,距离,如果C点在AB之间,且知道C点距离,求C点的经纬度信息。 目标:在AB这条直线上,根据给定的距离(从A点开始沿直线到某点的距离)来求该点的经纬度。 2、方法 首先计算AB的总长度(大圆距离),…

Android实战——系统字体库加载流程

Android 系统字体库指的是在Android设备上用于显示文本的字体集合。随着Android系统的更新,其对字体的支持也日益增强,允许开发者和用户更灵活地定制界面文字显示。 一、字体库介绍 1、字体库文件 字体库文件是指存储字体数据的文件,这些文件包含了创建文本字符所需的所有…

嵌入式乐鑫音频项目“无声”问题深度调试复盘与方法论总结

前言&#xff1a;一场典型的“工程师寻踪之旅” 本次调试始于一个看似简单却极其顽固的问题&#xff1a;在一个基于乐鑫ESP-ADF&#xff08;音频开发框架&#xff09;的DuerOS示例项目中&#xff0c;移植到M5Stack ATOMIC Echo Base硬件上后&#xff0c;程序能够成功编译、烧录…

地下安全防线:电缆通道防外破地钉如何守护城市隐形生命线

在繁华都市的柏油马路之下、在静谧乡村的泥土深处&#xff0c;纵横交错的地下管线如同城市与乡村的 “隐形生命线”&#xff0c;承载着电力输送、供水供气、通信传输等重要功能&#xff0c;默默维系着现代社会的正常运转。然而&#xff0c;这条 “生命线” 正面临着诸多潜在威胁…

linux时间同步方案

yum install chrony -y # 配置 chrony 使用国内服务器 sed -i s/^pool.*pool.ntp.org/#&/ /etc/chrony.conf cat >> /etc/chrony.conf <<EOF server ntp.aliyun.com iburst server ntp.tencent.com iburst server ntp.ntsc.ac.cn iburst server time1.cloud.t…

C语言笔记(鹏哥)上课板书+课件汇总(KMP算法的动态规划简易处理+字符函数和字符串函数)

一、目录 kmp动态规划简易处理next数组字符函数与字符串函数 一、目录二、引言C语⾔标准库中提供了⼀系列库函数 三、字符分类函数&#xff08;字符相关的函数&#xff09;推荐一个网站 四、字符转换函数&#xff08;字符相关的函数&#xff09;五、strlen&#xff08;字符串相…

Java大模型开发入门 (13/15):拥抱官方标准 - Spring AI框架入门与实践

前言 到目前为止&#xff0c;我们整个系列的旅程都是在功能强大的LangChain4j框架上构建的。它就像一个装备齐全的“瑞士军刀”&#xff0c;为我们提供了构建RAG和Agents所需的所有底层和高层工具。 然而&#xff0c;在Java企业级开发的世界里&#xff0c;有一个名字我们永远…

Github搜索案例

今天的内容是这个案例的实现&#xff0c;以及其中涉及到的内容&#xff0c;需要全部掌握&#xff0c;比如ref&#xff0c;受控组件&#xff0c;props在组件之中的传递&#xff0c;以及Pubsub包的使用这些前端React框架有关的内容。现在进入正题 1.github搜索案例&#xff08;a…

Vue3学习(生命周期,hooks,axios的简单讲解)

一&#xff0c;前言 继续努力&#xff0c;南方见。 二&#xff0c;生命周期 1.对生命周期的理解 例如&#xff1a;人的生命周期&#xff0c;出生&#xff0c;经历&#xff0c;死亡 组件的话就是&#xff0c;创建&#xff0c;挂载&#xff0c;更新&#xff0c;销毁。***在特…

Pytorch实战四 基于 VGG net 搭建一个串联的神经网络结构

系列文章目录 文章目录 系列文章目录前言一、VGG类的搭建1.源码2.初始化类2.1 初始化函数2.2 前向传播函数 forward(self,x) 二、卷积补充卷积 前言 对于标准的 VGG net 输入图像的尺寸是 24 x 24,进行 32 维的下采样之后得到一个 7 x 7 的特征图&#xff0c;然后用 FC 层完成分…

大学专业解读——计算机

我们继续&#xff0c;讲讲排名第二流行的新工科专业——计算机。说到计算机&#xff0c;可能所有人都知道&#xff0c;但具体到细分的专业类别&#xff0c;除了计算机科学&#xff0c;其实大多数人都是不了解的。 序&#xff1a; 计算机主要有如下几个专业&#xff1a; 计算机…

Bootstrap 5学习教程,从入门到精通, Bootstrap 5 列表组(List Group)语法知识点及案例(14)

Bootstrap 5 列表组(List Group)语法知识点及案例 一、列表组基础语法 列表组是Bootstrap中用于显示一系列内容的灵活组件&#xff0c;常用于显示菜单、导航或任何项目列表。 基本列表组结构 <ul class"list-group"><li class"list-group-item&quo…

FPGA基础 -- Verilog 命名事件

Verilog 的“命名事件&#xff08;Named Events&#xff09;”机制 进行一次系统、专业的培训。该机制在 Verilog 中是比较冷门但重要的仿真控制特性&#xff0c;主要用于 模块间同步、行为仿真触发、事件通信&#xff0c;在复杂的 Testbench、行为模型中尤为重要。 一、命名事…

《Go语言圣经》结构体

《Go语言圣经》结构体 一、结构体指针的高效应用 在处理大型结构体时&#xff0c;为避免内存复制&#xff0c;通常使用指针传递和返回结构体&#xff1a; // 通过指针传入结构体&#xff0c;避免值拷贝 func Bonus(e *Employee, percent int) int {return e.Salary * percen…

Ascend上如何进行带宽测试

1 工具安装 1.1 下载链接 https://www.hiascend.com/developer/download/community/result?moduledl%2Bcann 1.2 安装指令&#xff1a; ./Ascend-mindx-toolbox_{version}_linux-{arch}.run --install设置环境变量&#xff1a; source /usr/local/Ascend/toolbox/set_env.…

生产BUG集

磁盘达到阈值导致ES无法删除数据 method [POST], host [http://xx.xxx.xxx.xxx:9200], URI [/security_event/_delete_by_query?slices1&requests_per_second-1&ignore_unavailablefalse&expand_wildcardsopen&allow_no_indicestrue&ignore_throttledtru…

基于FastAPI与Selenium的智能开关状态管理系统实践

引言 在工业物联网&#xff08;IIoT&#xff09;与自动化控制场景中&#xff0c;设备状态的实时监控与自然语言指令执行是提升效率的关键。本文将介绍一种基于 FastAPI 和 Selenium 的智能设备状态管理系统&#xff0c;通过大语言模型&#xff08;LLM&#xff09;解析用户指令…

主体和债项均为“AAA”等级 海尔消金发行10亿金融债

6月18日&#xff0c;继年内发行ABS、落地ESG挂钩银团贷后&#xff0c;海尔消费金融&#xff08;以下简称“海尔消金”&#xff09;在金融市场上又迈出重要一步&#xff0c;成功簿记发行2025年首期规模达10亿元金融债&#xff0c;且主体信用等级仍为“AAA”。这一举措为海尔消金…

n8n:轻松自动化您的工作流

借助开源自动化利器 n8n&#xff0c;释放重复劳动的生产力&#xff01; 引言 n8n 是一款免费、开源的工作流自动化工具&#xff0c;致力于帮助开发者和团队通过连接各种应用和服务&#xff0c;实现重复任务的自动化处理。 它由 Jan Oberhauser 于 2019 年在德国柏林创建&…