99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【HarmonyOS 5】鴻蒙Web組件和內(nèi)嵌網(wǎng)頁雙向通信DEMO示例

HarmonyOS解決方案 ? 來源:HarmonyOS解決方案 ? 作者:HarmonyOS解決方案 ? 2025-07-11 18:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

HarmonyOS 5】鴻蒙Web組件和內(nèi)嵌網(wǎng)頁雙向通信DEMO示例

##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財(cái)#

一、前言

在 ArkUI 開發(fā)中,Web 組件(Web)允許開發(fā)者在應(yīng)用內(nèi)嵌入網(wǎng)頁,實(shí)現(xiàn)混合開發(fā)場景。

本文將通過完整 DEMO,詳解如何通過WebviewController實(shí)現(xiàn) ArkUI 與內(nèi)嵌網(wǎng)頁的雙向通信,涵蓋 ArkUI 調(diào)用網(wǎng)頁 JS、網(wǎng)頁調(diào)用 ArkUI 對象的核心技術(shù)點(diǎn)。

二、雙向通信實(shí)現(xiàn)原理

1、雙向通信概念
Web 到 ArkUI(反向通信)通過registerJavaScriptProxy將 ArkUI 對象注冊到網(wǎng)頁的window對象,允許網(wǎng)頁通過window.xxx調(diào)用 ArkUI 暴露的方法。?

ArkUI 到 Web(正向通信)通過runJavaScript執(zhí)行網(wǎng)頁 JS 代碼,支持回調(diào)獲取返回值,實(shí)現(xiàn)原生代碼調(diào)用網(wǎng)頁函數(shù)。

2、雙向通信流程圖
ArkUI Web
┌──────────────┐ ┌──────────────┐
│ registerJS ├─────────────? window.objName │
│ (反向注冊) │ ├──────────────┤
├──────────────┤ │ call test() │
│ runJavaScript├─────────────? execute JS code │
│ (正向調(diào)用) │ ├──────────────┤
└──────────────┘ └──────────────┘

三、雙向通信實(shí)現(xiàn)步驟

1、ArkUI 定義可被網(wǎng)頁調(diào)用的對象
創(chuàng)建一個TestObj類,聲明允許網(wǎng)頁調(diào)用的方法(白名單機(jī)制):

class TestObj {
  // 網(wǎng)頁可調(diào)用的方法1:返回字符串
  test(): string {
    return "ArkUI Web Component";
  }

  // 網(wǎng)頁可調(diào)用的方法2:打印日志
  toString(): void {
    console.log('Web Component toString');
  }

  // 網(wǎng)頁可調(diào)用的方法3:接收網(wǎng)頁消息
  receiveMessageFromWeb(message: string): void {
    console.log(`Received from web: ${message}`);
  }
}

2、ArkUI 組件核心代碼
初始化控制器與狀態(tài)

@Entry
@Component
struct WebComponent {
  // Webview控制器
  controller: webview.WebviewController = new webview.WebviewController();
  // 注冊到網(wǎng)頁的ArkUI對象
  @State testObj: TestObj = new TestObj();
  // 注冊名稱(網(wǎng)頁通過window.[name]訪問)
  @State regName: string = 'objName';
  // 接收網(wǎng)頁返回?cái)?shù)據(jù)
  @State webResult: string = '';

  build() { /* 組件布局與交互邏輯 */ }
}

布局與交互按鈕,添加三個核心功能按鈕:

Column() {
  // 顯示網(wǎng)頁返回?cái)?shù)據(jù)
  Text(`Web返回?cái)?shù)據(jù):${this.webResult}`).fontSize(16).margin(10);

  // 1. 注冊ArkUI對象到網(wǎng)頁
  Button('注冊到Window')
    .onClick(() = > {
      this.controller.registerJavaScriptProxy(
        this.testObj,  // ArkUI對象
        this.regName,  // 網(wǎng)頁訪問名稱
        ["test", "toString", "receiveMessageFromWeb"]  // 允許調(diào)用的方法白名單
      );
    })

  // 2. ArkUI調(diào)用網(wǎng)頁JS
  Button('調(diào)用網(wǎng)頁函數(shù)')
    .onClick(() = > {
      this.controller.runJavaScript(
        'webFunction("Hello from ArkUI!")',  // 執(zhí)行網(wǎng)頁JS代碼
        (error, result) = > {  // 回調(diào)處理返回值
          if (!error) this.webResult = result || '無返回值';
        }
      );
    })

  // 3. Web組件加載
  Web({ src: $rawfile('index.html'), controller: this.controller })
    .javaScriptAccess(true)  // 開啟JS交互權(quán)限
    .onPageEnd(() = > {  // 頁面加載完成時觸發(fā)
      // 頁面加載后自動調(diào)用網(wǎng)頁測試函數(shù)
      this.controller.runJavaScript('initWebData()');
    })
}

3. registerJavaScriptProxy的實(shí)際作用是,將 ArkUI 對象綁定到網(wǎng)頁window,實(shí)現(xiàn)反向通信。

registerJavaScriptProxy(
  obj: Object,        // ArkUI中定義的對象
  name: string,       // 網(wǎng)頁訪問的名稱(如window.name)
  methods: string[]   // 允許調(diào)用的方法白名單(嚴(yán)格匹配方法名)
);

源碼示例

完整代碼已上傳至Gitee 倉庫,歡迎下載調(diào)試!如果有任何問題,歡迎在評論區(qū)留言交流~

項(xiàng)目結(jié)構(gòu)
├── xxx.ets # ArkUI組件代碼
└── index.html # 內(nèi)嵌網(wǎng)頁文件
圖像 20.jpeg

WebViewPage.ets

import { webview } from '@kit.ArkWeb';
import { BusinessError } from '@kit.BasicServicesKit';

class TestObj {
  constructor() {
  }

  test(): string {
    return "ArkUI Web Component";
  }

  toString(): void {
    console.log('Web Component toString');
  }

  receiveMessageFromWeb(message: string): void {
    console.log(`Received message from web: ${message}`);
  }
}

@Entry
@Component
struct WebViewPage {
  controller: webview.WebviewController = new webview.WebviewController();
  @State testObjtest: TestObj = new TestObj();
  @State name: string = 'objName';
  @State webResult: string = '';

  build() {
    Column() {
      Text(this.webResult).fontSize(20)
      Button('refresh')
        .onClick(() = > {
          try {
            this.controller.refresh();
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
      Button('Register JavaScript To Window')
        .onClick(() = > {
          try {
            this.controller.registerJavaScriptProxy(this.testObjtest, this.name, ["test", "toString", "receiveMessageFromWeb"]);
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
      Button('deleteJavaScriptRegister')
        .onClick(() = > {
          try {
            this.controller.deleteJavaScriptRegister(this.name);
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
      Button('Send message to web')
        .onClick(() = > {
          try {
            this.controller.runJavaScript(
              'receiveMessageFromArkUI("Hello from ArkUI!")',
              (error, result) = > {
                if (error) {
                  console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
                  return;
                }
                console.info(`Message sent to web result: ${result}`);
              }
            );
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
      Button('Get data from web')
        .onClick(() = > {
          try {
            this.controller.runJavaScript(
              'getWebPageData()',
              (error, result) = > {
                if (error) {
                  console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
                  return;
                }
                if (result) {
                  this.webResult = result;
                  console.info(`Data from web: ${result}`);
                }
              }
            );
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
      Web({ src: $rawfile('index.html'), controller: this.controller })
        .javaScriptAccess(true)
        .onPageEnd(e = > {
          try {
            this.controller.runJavaScript(
              'test()',
              (error, result) = > {
                if (error) {
                  console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
                  return;
                }
                if (result) {
                  this.webResult = result;
                  console.info(`The test() return value is: ${result}`);
                }
              }
            );
            if (e) {
              console.info('url: ', e.url);
            }
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
        .width("100%")
        .height("50%")
    }
    .width("100%")
    .height("100%")
    .backgroundColor(Color.Black)
  }
}

index.html

< !DOCTYPE html >
< html lang="en" >

< head >
    < meta charset="UTF-8" >
    < meta name="viewport" content="width=device-width, initial-scale=1.0" >
    < title >Web Communication< /title >
< /head >


"callArkUIMethod()"< /span?> >Call ArkUI Method< /button >
"sendMessageToArkUI()"< /span?> >Send message to ArkUI< /button >
"messageFromArkUI">
< script >
    function callArkUIMethod() {
        const result = window.objName.test();
        console.log("Result from ArkUI: ", result);
    }

    function sendMessageToArkUI() {
        window.objName.receiveMessageFromWeb('Hello from web!');
    }

    function receiveMessageFromArkUI(message) {
        const messageDiv = document.getElementById('messageFromArkUI');
        messageDiv.textContent = `Received message from ArkUI: ${message}`;
    }

    function getWebPageData() {
        return "Data from web page";
    }

    function test() {
        return "Test function result from web";
    }
< /script >
< /body >

< /html >

注意

組件銷毀時調(diào)用deleteJavaScriptRegister(name)取消注冊,避免內(nèi)存泄漏:

onDestroy() {
  this.controller.deleteJavaScriptRegister(this.regName);
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2620

    瀏覽量

    44063
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2126

    瀏覽量

    33092
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    鴻蒙OS開發(fā)實(shí)例:【Web網(wǎng)頁

    HarmonyOS平臺通過Web控件可支持網(wǎng)頁加載展示,Web在中是作為專項(xiàng)參考的。 本篇文章將從Android和iOS平臺研發(fā)角度出發(fā)來實(shí)踐學(xué)習(xí)API功能
    的頭像 發(fā)表于 03-28 21:47 ?2352次閱讀
    <b class='flag-5'>鴻蒙</b>OS開發(fā)實(shí)例:【<b class='flag-5'>Web</b><b class='flag-5'>網(wǎng)頁</b>】

    鴻蒙開發(fā)基礎(chǔ)-Web組件之cookie操作

    當(dāng)前會話cookie信息,免去多余的登錄操作。 該頁面布局同樣簡單,由應(yīng)用導(dǎo)航標(biāo)題“Web組件”、內(nèi)部標(biāo)題“Web組件內(nèi)”、加載的網(wǎng)頁組成
    發(fā)表于 01-14 21:31

    單線雙向通信協(xié)議

    請問有沒有什么開放的單線雙向通信協(xié)議,想學(xué)習(xí)下,謝謝
    發(fā)表于 06-10 14:57

    tcp/ip雙向通信

    rt,現(xiàn)在有兩個電腦,要通過tcp/ip協(xié)議進(jìn)行雙向通信,單向的收發(fā)已經(jīng)解決了,但是雙向的就不知道該怎么做了,想了兩三個,試過都不行,求大神幫忙,說下思路也好,3q~~~~
    發(fā)表于 07-20 23:40

    NRF2401無線模塊的雙向通信怎么實(shí)現(xiàn)?

    目前在做一個無線模塊的雙向通信,甲機(jī)發(fā)一次,乙機(jī)收一次,乙機(jī)發(fā)一次,甲機(jī)收一次,就不能雙向通信啦!怎么解決?用的是原子哥的程序!
    發(fā)表于 05-18 04:19

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-Web組件開發(fā)體驗(yàn)

    ;) }}}*附件:HarmonyOSOpenHarmony應(yīng)用開發(fā)-Web組件開發(fā)體驗(yàn).docx示例效果:參考文檔:https
    發(fā)表于 12-12 15:14

    HarmonyOS—使用Web組件加載頁面

    通過調(diào)用??loadUrl()??接口加載指定網(wǎng)絡(luò)網(wǎng)頁。 在下面的示例中,在Web組件加載完“www.example.com”頁面后,開發(fā)者可通過loadUrl接口將此
    發(fā)表于 08-31 17:51

    具有雙向通信功能的標(biāo)準(zhǔn)源

    本文介紹的具有雙向通信功能的標(biāo)準(zhǔn)源,是通過串行通信接口將PC機(jī)與標(biāo)準(zhǔn)源相連以實(shí)現(xiàn)雙向通信功能的系統(tǒng)。PC機(jī)的通信功能是利用Visual Basic 6.0這種可視化編程軟件得以實(shí)現(xiàn),標(biāo)
    發(fā)表于 02-25 11:25 ?15次下載

    基于8051的Proteus仿真-單片機(jī)之間雙向通信

    基于8051的Proteus仿真-單片機(jī)之間雙向通信
    發(fā)表于 09-01 23:33 ?17次下載

    DSPeCAN總線中斷方式與上位機(jī)的雙向通信

    DSPeCAN總線中斷方式與上位機(jī)的雙向通信
    發(fā)表于 10-20 10:57 ?5次下載
    DSPeCAN總線中斷方式與上位機(jī)的<b class='flag-5'>雙向通信</b>

    鴻蒙ArkTS聲明式組件Web

    提供具有網(wǎng)頁顯示能力的Web組件,[@ohos.web.webview]提供web控制能力。
    的頭像 發(fā)表于 07-04 15:35 ?1402次閱讀
    <b class='flag-5'>鴻蒙</b>ArkTS聲明式<b class='flag-5'>組件</b>:<b class='flag-5'>Web</b>

    HarmonyOS 5鴻蒙頁面和組件生命周期函數(shù)

    HarmonyOS 5鴻蒙頁面和組件生命周期函數(shù) ##鴻蒙開發(fā)能力 ##HarmonyOS
    的頭像 發(fā)表于 07-11 18:24 ?294次閱讀

    HarmonyOS 5鴻蒙星閃NearLink詳解

    HarmonyOS 5鴻蒙星閃NearLink詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##
    的頭像 發(fā)表于 07-11 18:24 ?323次閱讀
    【<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b>】<b class='flag-5'>鴻蒙</b>星閃NearLink詳解

    HarmonyOS 5】金融應(yīng)用開發(fā)鴻蒙組件實(shí)踐

    HarmonyOS 5】金融應(yīng)用開發(fā)鴻蒙組件實(shí)踐 ##鴻蒙開發(fā)能力 ##HarmonyOS S
    的頭像 發(fā)表于 07-11 18:20 ?289次閱讀
    【<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b>】金融應(yīng)用開發(fā)<b class='flag-5'>鴻蒙</b><b class='flag-5'>組件</b>實(shí)踐

    HarmonyOS 5 入門系列 】鴻蒙HarmonyOS示例項(xiàng)目講解

    HarmonyOS 5 入門系列 】鴻蒙HarmonyOS示例項(xiàng)目講解 ##鴻蒙開發(fā)能力 #
    的頭像 發(fā)表于 07-07 11:57 ?154次閱讀
    【 <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b> 入門系列 】<b class='flag-5'>鴻蒙</b><b class='flag-5'>HarmonyOS</b><b class='flag-5'>示例</b>項(xiàng)目講解