首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

鸿蒙HarmonyOS实战-Web组件(前端函数和应用侧函数相互调用)

  • 25-02-22 03:41
  • 4123
  • 9200
blog.csdn.net

 前言

前端函数和应用侧函数相互调用是指前端页面中的JavaScript函数和应用程序侧的函数之间进行相互调用。

在前端开发中,常常会使用JavaScript函数来处理用户的交互事件和操作。这些函数可以在前端页面中定义,例如通过事件监听器或者按钮点击事件来触发函数的执行。这些前端函数可以使用DOM操作、修改页面样式以及向后端发送请求等。

而应用侧函数是指在应用程序中定义的函数,例如后端服务器端脚本、数据库操作函数等。这些函数通常用于处理业务逻辑、数据处理、数据库操作等。

前端函数和应用侧函数可以通过各种方式进行相互调用。例如,前端函数可以通过AJAX请求将数据发送到应用侧函数进行处理,应用侧函数可以返回处理结果给前端函数。另外,前端函数也可以通过调用后端API接口来执行应用侧函数。

不过HarmonyOS的Web组件前端函数和应用侧函数相互调用是已经封装好的。

一、调用前端页面函数

1.应用侧调用前端页面函数

?1.1 前端页面

  1. html>
  2. <html>
  3. <body>
  4. <h1>执行JavaScripth1>
  5. <p id="locationInfo">位置信息p>
  6. <script>
  7. var locationInfo=document.getElementById("locationInfo");
  8. function htmlTest() {
  9. locationInfo.innerHTML='JavaScript Hello World! '
  10. }
  11. script>
  12. body>
  13. html>

?1.2 应用侧

  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. webviewController: web_webview.WebviewController = new web_webview.WebviewController();
  7. build() {
  8. Column() {
  9. Web({ src: $rawfile('local.html'), controller: this.webviewController})
  10. Button('runJavaScript')
  11. .onClick(() => {
  12. this.webviewController.runJavaScript('htmlTest()');
  13. })
  14. }
  15. }
  16. }

在这里插入图片描述

2.前端页面调用应用侧函数

?2.1 前端页面

  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <body>
  5. <button type="button" onclick="callArkTS()">Click Me!</button>
  6. <p id="demo"></p>
  7. <script>
  8. function callArkTS() {
  9. let str = testObjName.test();
  10. document.getElementById("demo").innerHTML = str;
  11. console.info('ArkTS Hello World! :' + str);
  12. }
  13. </script>
  14. </body>
  15. </html>

?2.2 应用侧

☀️2.2.1 初始化时调用
  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview';
  3. class testClass {
  4. constructor() {
  5. }
  6. test(): string {
  7. return 'ArkTS Hello World!';
  8. }
  9. }
  10. @Entry
  11. @Component
  12. struct WebComponent {
  13. webviewController: web_webview.WebviewController = new web_webview.WebviewController();
  14. // 声明需要注册的对象
  15. @State testObj: testClass = new testClass();
  16. build() {
  17. Column() {
  18. // web组件加载本地index.html页面
  19. Web({ src: $rawfile('index.html'), controller: this.webviewController})
  20. // 将对象注入到web端
  21. .javaScriptProxy({
  22. object: this.testObj,
  23. name: "testObjName",
  24. methodList: ["test"],
  25. controller: this.webviewController
  26. })
  27. }
  28. }
  29. }

在这里插入图片描述

☀️2.2.2 初始化后调用
  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview';
  3. // @ts-ignore
  4. import business_error from '@ohos.base';
  5. class testClass {
  6. constructor() {
  7. }
  8. test(): string {
  9. return "ArkUI Web Component";
  10. }
  11. toString(): void {
  12. console.log('Web Component toString');
  13. }
  14. }
  15. @Entry
  16. @Component
  17. struct Index {
  18. webviewController: web_webview.WebviewController = new web_webview.WebviewController();
  19. @State testObj: testClass = new testClass();
  20. build() {
  21. Column() {
  22. Button('refresh')
  23. .onClick(() => {
  24. try {
  25. this.webviewController.refresh();
  26. } catch (error) {
  27. let e: business_error.BusinessError = error as business_error.BusinessError;
  28. console.error(`ErrorCode: ${e.code}, Message: ${e.message}`);
  29. }
  30. })
  31. Button('Register JavaScript To Window')
  32. .onClick(() => {
  33. try {
  34. this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "test"]);
  35. } catch (error) {
  36. let e: business_error.BusinessError = error as business_error.BusinessError;
  37. console.error(`ErrorCode: ${e.code}, Message: ${e.message}`);
  38. }
  39. })
  40. Web({ src: $rawfile('local.html'), controller: this.webviewController })
  41. }
  42. }
  43. }

在这里插入图片描述

3.建立应用侧与前端页面数据通道

?3.1 前端页面

  1. <!--xxx.html-->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>WebView Message Port Demo</title>
  7. </head>
  8. <body>
  9. <h1>WebView Message Port Demo</h1>
  10. <div>
  11. <input type="button" value="SendToEts" onclick="PostMsgToEts(msgFromJS.value);"/><br/>
  12. <input id="msgFromJS" type="text" value="send this message from HTML to ets"/><br/>
  13. </div>
  14. <p class="output">display received message send from ets</p>
  15. </body>
  16. <script>
  17. var h5Port;
  18. var output = document.querySelector('.output');
  19. window.addEventListener('message', function (event) {
  20. if (event.data === '__init_port__') {
  21. if (event.ports[0] !== null) {
  22. h5Port = event.ports[0]; // 1. 保存从ets侧发送过来的端口
  23. h5Port.onmessage = function (event) {
  24. // 2. 接收ets侧发送过来的消息.
  25. var msg = 'Got message from ets:';
  26. var result = event.data;
  27. if (typeof(result) === 'string') {
  28. console.info(`received string message from html5, string is: ${result}`);
  29. msg = msg + result;
  30. } else if (typeof(result) === 'object') {
  31. if (result instanceof ArrayBuffer) {
  32. console.info(`received arraybuffer from html5, length is: ${result.byteLength}`);
  33. msg = msg + 'lenght is ' + result.byteLength;
  34. } else {
  35. console.info('not support');
  36. }
  37. } else {
  38. console.info('not support');
  39. }
  40. output.innerHTML = msg;
  41. }
  42. }
  43. }
  44. })
  45. // 3. 使用h5Port往ets侧发送消息.
  46. function PostMsgToEts(data) {
  47. if (h5Port) {
  48. h5Port.postMessage(data);
  49. } else {
  50. console.error('h5Port is null, Please initialize first');
  51. }
  52. }
  53. </script>
  54. </html>

?3.2 应用侧

  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6. controller: web_webview.WebviewController = new web_webview.WebviewController();
  7. ports: web_webview.WebMessagePort[];
  8. @State sendFromEts: string = 'Send this message from ets to HTML';
  9. @State receivedFromHtml: string = 'Display received message send from HTML';
  10. build() {
  11. Column() {
  12. // 展示接收到的来自HTML的内容
  13. Text(this.receivedFromHtml)
  14. // 输入框的内容发送到html
  15. TextInput({placeholder: 'Send this message from ets to HTML'})
  16. .onChange((value: string) => {
  17. this.sendFromEts = value;
  18. })
  19. Button('postMessage')
  20. .onClick(() => {
  21. try {
  22. // 1、创建两个消息端口。
  23. this.ports = this.controller.createWebMessagePorts();
  24. // 2、在应用侧的消息端口(如端口1)上注册回调事件。
  25. this.ports[1].onMessageEvent((result: web_webview.WebMessage) => {
  26. let msg = 'Got msg from HTML:';
  27. if (typeof(result) === 'string') {
  28. console.info(`received string message from html5, string is: ${result}`);
  29. msg = msg + result;
  30. } else if (typeof(result) === 'object') {
  31. if (result instanceof ArrayBuffer) {
  32. console.info(`received arraybuffer from html5, length is: ${result.byteLength}`);
  33. msg = msg + 'lenght is ' + result.byteLength;
  34. } else {
  35. console.info('not support');
  36. }
  37. } else {
  38. console.info('not support');
  39. }
  40. this.receivedFromHtml = msg;
  41. })
  42. // 3、将另一个消息端口(如端口0)发送到HTML侧,由HTML侧保存并使用。
  43. this.controller.postMessage('__init_port__', [this.ports[0]], '*');
  44. } catch (error) {
  45. console.error(`ErrorCode: ${error.code}, Message: ${error.message}`);
  46. }
  47. })
  48. // 4、使用应用侧的端口给另一个已经发送到html的端口发送消息。
  49. Button('SendDataToHTML')
  50. .onClick(() => {
  51. try {
  52. if (this.ports && this.ports[1]) {
  53. this.ports[1].postMessageEvent(this.sendFromEts);
  54. } else {
  55. console.error(`ports is null, Please initialize first`);
  56. }
  57. } catch (error) {
  58. console.error(`ErrorCode: ${error.code}, Message: ${error.message}`);
  59. }
  60. })
  61. Web({ src: $rawfile('xxx.html'), controller: this.controller })
  62. }
  63. }
  64. }

在这里插入图片描述

 ?写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing?,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新VIP学习资料,请点击→全套鸿蒙HarmonyOS学习资料
  • 或者关注小编后私信回复【666】也可获取资料哦~~

最新鸿蒙Next全套学习资料请扫码
微信名片
注:本文转载自blog.csdn.net的蜀道山QAQ的文章"https://blog.csdn.net/shudaoshanQAQ/article/details/135490911"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top