日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

一、前言

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

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

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

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

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

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

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

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

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

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

  // 網(wǎng)頁(yè)可調(diào)用的方法3:接收網(wǎng)頁(yè)消息
  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();
  // 注冊(cè)到網(wǎng)頁(yè)的ArkUI對(duì)象
  @State testObj: TestObj = new TestObj();
  // 注冊(cè)名稱(網(wǎng)頁(yè)通過(guò)window.[name]訪問(wèn))
  @State regName: string = 'objName';
  // 接收網(wǎng)頁(yè)返回?cái)?shù)據(jù)
  @State webResult: string = '';

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

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

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

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

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

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

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

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

源碼示例

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

項(xiàng)目結(jié)構(gòu)
├── xxx.ets # ArkUI組件代碼
└── index.html # 內(nèi)嵌網(wǎng)頁(yè)文件
圖像 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 >

注意

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

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

審核編輯 黃宇

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

    關(guān)注

    60

    文章

    3035

    瀏覽量

    46200
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2157

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

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

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

    tcp/ip雙向通信

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

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

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

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

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

    HarmonyOS—使用Web組件加載頁(yè)面

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

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

    本文介紹的具有雙向通信功能的標(biāo)準(zhǔn)源,是通過(guò)串行通信接口將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)頁(yè)顯示能力的Web組件,[@ohos.web.webview]提供web控制能力。
    的頭像 發(fā)表于 07-04 15:35 ?2681次閱讀
    <b class='flag-5'>鴻蒙</b>ArkTS聲明式<b class='flag-5'>組件</b>:<b class='flag-5'>Web</b>

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

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

    HarmonyOS 5鴻蒙星閃NearLink詳解

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

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

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

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

    HarmonyOS 5 入門(mén)系列 】鴻蒙HarmonyOS示例項(xiàng)目講解 ##鴻蒙開(kāi)發(fā)能力 #
    的頭像 發(fā)表于 07-07 11:57 ?1225次閱讀
    【 <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b> 入門(mén)系列 】<b class='flag-5'>鴻蒙</b><b class='flag-5'>HarmonyOS</b><b class='flag-5'>示例</b>項(xiàng)目講解
    新河县| 东丽区| 谷城县| 中方县| 扎赉特旗| 大渡口区| 六安市| 仁化县| 宜章县| 资中县| 兴山县| 广昌县| 班玛县| 南靖县| 巢湖市| 海南省| 拜城县| 宝山区| 嘉善县| 海城市| 永定县| 隆化县| 太和县| 鄯善县| 新宾| 临清市| 景宁| 灵丘县| 达拉特旗| 潮州市| 临朐县| 文昌市| 南川市| 河南省| 东乡| 政和县| 罗江县| 大埔区| 阿拉善左旗| 象州县| 措美县|