<!-- MainPage.html --><!DOCTYPE html><html><head><linkrel="stylesheet"type="text/css"href="./css/main.css"><metacharset="utf-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Test App</title></head><script>window.ohosCallNative={callNative:function (func,params,callback){// This is a placeholder for the actual native call implementationif (typeofcallback==='function'){callback('Mock Data from Native');}}};// Simulating getting the proportion and setting font sizedocument.addEventListener('DOMContentLoaded',function (){window.ohosCallNative.callNative('getProportion',{},function (data){document.getElementsByTagName("html")[0].style.fontSize=data+'px';});});functionchangeVal(event){// This function can be used to handle input changes if needed}functiontowebview(){consttel=document.getElementById('phone').value;window.ohosCallNative.callNative('changeTel',{tel:tel});}</script><body><divclass="container"><divclass="selectConcat"><divclass="flex-input"><inputtype="tel"id="phone"placeholder="Enter data to transfer"oninput="changeVal(event)"value=""/></div></div><divclass="bottom-tip"onclick="towebview()">Send Data to ArkUI</div><divclass="select_tips"><divid="phone_tip">Data from ArkUI</div><divid="concat_tip"></div></div></div><script src="./js/mainPage.js"></script></body></html>
ArkUI Code Implementation
import{webview}from'@kit.ArkWeb';import{display}from'@kit.ArkUI';import{promptAction}from'@kit.ArkUI';importJSBridgefrom'../common/utils/JsBridge';import{CommonConstants}from'../common/constant/CommonConstant';importLoggerfrom'../common/utils/Logger';@Extend(TextInput)functioninputStyle(){return{placeholderColor:$r('app.color.placeholder_color'),height:45,fontSize:18,backgroundColor:$r('app.color.background'),width:'80%',padding:{left:0},margin:{top:12}};}@Extend(Line)functionlineStyle(){return{width:'100%',height:1,backgroundColor:$r('app.color.line_color')};}@Extend(Text)functionblackTextStyle(size?:number,height?:number){return{fontColor:$r('app.color.black_text_color'),fontSize:18,fontWeight:FontWeight.Medium};}@Entry@ComponentstructSelectContact{@StorageLink('isClick')isClick:boolean=false;@StorageLink('tel')phoneNumber:string='';@StorageLink('proportion')proportion:number=0;@Statetowebstr:string='';@StatechargeTip:Resource=$r('app.string.recharge_button');webController:webview.WebviewController=newwebview.WebviewController();privatejsBridge:JSBridge=newJSBridge(this.webController,this.towebstr,"Data received from H5");aboutToAppear(){display.getAllDisplays((err,displayClass:display.Display[])=>{if (err.code){Logger.error('SelectContact Page','Failed to obtain all display objects. Code: '+JSON.stringify(err));return;}this.proportion=displayClass[0].densityDPI/CommonConstants.COMMON_VALUE;Logger.info('SelectContact Page','Succeeded in obtaining all display objects. Data: '+JSON.stringify(displayClass));});}build(){Column(){Web({src:$rawfile('MainPage.html'),controller:this.webController}).javaScriptAccess(true).javaScriptProxy(this.jsBridge.javaScriptProxy).height('50%').onPageBegin(()=>{this.jsBridge.initJsBridge();});Row(){Text('Native').blackTextStyle();TextInput({placeholder:'Enter data to send to H5'}).maxLength(12).type(InputType.Normal).inputStyle().onChange((value:string)=>{this.towebstr=value;}).margin({left:20});}.justifyContent(FlexAlign.SpaceBetween).width('100%').margin({top:8});Line().lineStyle().margin({left:80});Button('Send Data to Web').width(CommonConstants.FULL_SIZE).height($r('app.float.button_height')).margin({bottom:$r('app.float.button_margin_bottom'),top:20}).onClick(()=>{Logger.error("Data to send: "+this.towebstr);this.jsBridge.chooseContact();this.webController.runJavaScript(`window.fromNative("${this.towebstr}")`);});Row(){Text('Data from H5').fontSize(15).fontColor(Color.Gray);Text(this.phoneNumber).fontSize(20).fontColor(Color.Red);}.justifyContent(FlexAlign.Center).margin({top:20});}.width(CommonConstants.FULL_SIZE).height(CommonConstants.FULL_SIZE).backgroundColor($r('app.color.page_color')).padding({left:$r('app.float.margin_left_normal'),right:$r('app.float.margin_right_normal')});}}
JavaScript Bridge Implementation
import{WebviewController}from'@ohos.arkui';interfaceParamsItem{callID?:string;data?:{tel?:string};}interfaceJavaScriptItem{object:{call:(func:string,params:string)=>void;};name:string;methodList:string[];controller:WebviewController;}classJSBridge{privatewebController:WebviewController;privatetowebstr:string;privatebridgeName:string;constructor(webController:WebviewController,towebstr:string,bridgeName:string){this.webController=webController;this.towebstr=towebstr;this.bridgeName=bridgeName;}getjavaScriptProxy():JavaScriptItem{return{object:{call:this.call},name:'JSBridgeHandle',methodList:['call'],controller:this.webController};}initJsBridge(){// Initialization logic if needed}call=(func:string,params:string):void=>{constparamsObject:ParamsItem=JSON.parse(params);letresult:Promise<string>=newPromise((resolve)=>resolve(''));switch (func){case'chooseContact':result=this.chooseContact();break;case'changeTel':result=this.changeTel(paramsObject);break;case'changeAmount':result=this.changeAmount();break;case'getProportion':result=this.getProportion();break;default:break;}result.then((data:string)=>{this.callback(paramsObject?.callID,data);});}privatecallback(callID:string|undefined,data:string){if (callID){this.webController.runJavaScript(`window.handleNativeCallback(${callID}, '${data}')`);}}privatechooseContact():Promise<string>{returnnewPromise((resolve)=>{// Implementation logicresolve('Contact chosen');});}privatechangeTel(params:ParamsItem):Promise<string>{consttel:string=params.data?.tel??'';// Store the phone number or perform other operationsreturnnewPromise((resolve)=>{resolve('Phone number updated');});}privatechangeAmount():Promise<string>{returnnewPromise((resolve)=>{// Implementation logicresolve('Amount changed');});}privategetProportion():Promise<string>{returnnewPromise((resolve)=>{// Implementation logicresolve('Proportion retrieved');});}}
Top comments (0)