Web中webview和H5交互

Webview中的H5调用原生JS代码。

HarmonyOS
2024-05-26 17:30:43
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
十根玉米

核心API

javaScriptProxy

runJavaScript

javaScriptAccess

核心代码解释

定义一个JsBridge的ets文件,用来桥接ArkTS和Webview。

export default class JsBridge { 
  controller: WebView.WebviewController; 
  
  constructor(controller: WebView.WebviewController) { 
    this.controller = controller; 
  } 
  
  /** 
   *将JavaScript对象注入窗口,并调用窗口中的函数。 
   *@返回javaScriptProxy对象。 
   */ 
  get javaScriptProxy(): JavaScriptItem { 
    let result: JavaScriptItem = { 
      object: { 
        call: this.call 
      }, 
      name: "JSBridgeHandle", 
      methodList: ['call'], 
      controller: this.controller 
    } 
    return result; 
  } 
  /** 
   *初始化网桥。 
   */ 
  initJsBridge(): void { 
    this.controller.runJavaScript(code); 
  } 
  /** 
   *ArkTS通过runJavaScript调用WebView。 
   */ 
  callback = (id: number, data: string): void => { 
    this.controller.runJavaScript(`JSBridgeCallback("${id}", ${JSON.stringify(data)})`); 
  } 
}

JsBridge里的callback方法通过runJavaScript方法调用原生JS代码。

export const code = ` 
  const JSBridgeMap = {}; 
  let callID = 0; 
  
  
  function JSBridgeCallback (id, params){ 
    JSBridgeMap[id](params); 
    JSBridgeMap[id] = null; 
    delete JSBridgeMap[id]; 
  } 
  
  window.ohosCallNative = { 
    callNative(method, params, callback){ 
      const id = callID++; 
      const paramsObj = { 
          callID: id, 
          data: params || null 
      } 
      JSBridgeMap[id] = callback || (() => {}); 
      JSBridgeHandle.call(method, JSON.stringify(paramsObj)); 
    } 
  } 
`;

之后在index里声明一个JSBridge,在web加载本地html文件后走JavaScriptProxy接口,通过this.jsBridge.JavaScriptProxy调用原生js代码和JsBridge类实现webview和H5交互。

Web({ 
  src: $rawfile('MainPage.html'), 
  controller: this.webController 
}) 
  .javaScriptAccess(true) 
  .javaScriptProxy(this.jsBridge.javaScriptProxy) 
  .height($r('app.float.web_height')) 
  .onPageBegin(() => { 
    this.jsBridge.initJsBridge(); 
  })
分享
微博
QQ
微信
回复
2024-05-27 22:11:29
相关问题
HarmonyOS web原生H5如何交互
443浏览 • 1回复 待解决
HarmonyOS webH5交互
569浏览 • 1回复 待解决
Web组件h5页面如何交互
163浏览 • 1回复 待解决
HarmonyOS H5应用侧数据交互
218浏览 • 1回复 待解决
HarmonyOS webH5两端数据交互
740浏览 • 1回复 待解决
HarmonyOS webview h5的localstorage
338浏览 • 1回复 待解决
webview加载Vue h5失败
17711浏览 • 5回复 待解决
HarmonyOS web组件加载h5h5拉起摄像头
504浏览 • 1回复 待解决
如何在webview中使用H5的alert
1375浏览 • 1回复 待解决
H5页面如何与ArkTS交互
2962浏览 • 1回复 待解决
H5的图片在Web组件显示异常
198浏览 • 1回复 待解决
HarmonyOS h5ArkTS通信
167浏览 • 1回复 待解决
HarmonyOS H5与应用侧数据交互的Demo
476浏览 • 1回复 待解决
HarmonyOS web通过loadData加载h5标签
171浏览 • 1回复 待解决
HarmonyOS h5HarmonyOS怎么通信?
72浏览 • 1回复 待解决
Web能直接加载h5代码吗?
2998浏览 • 2回复 待解决