美文网首页HarmonyOS相关
鸿蒙 ~web组件 runJavaScript()、javaSc

鸿蒙 ~web组件 runJavaScript()、javaSc

作者: 胡修波 | 来源:发表于2023-12-18 19:20 被阅读0次

    一、应用侧调用前端页面函数 使用 runJavaScript()

    二、前端页面调用应用侧函数

    注册应用侧代码有两种方式,

    • 一种在Web组件初始化使用调用,使用[javaScriptProxy()
    • 另外一种在Web组件初始化完成后调用,使用registerjavascriptproxy()接口(注意:使用registerJavaScriptProxy()接口注册方法时,注册后需调用refresh()接口生效)

    三、代码 : ets 代码(已编译通过,可运行)

    
    import web_webview from '@ohos.web.webview';
    
    const TAG = "huxiubo"
    
    @Entry
    @Component
    struct Mainindex {
      @State count : number = 0;
      // 定义Web组件的控制器controller
      webviewController: web_webview.WebviewController = new web_webview.WebviewController();
    
      // js中回调 etc 方法
      contentCall = {
        callbackOne : () =>{
          this.count+=1;
          console.log(TAG, 'callbackOne success')
        },
        callbackTwo : () =>{
          this.count-=1;
          console.log(TAG, 'callbackTwo success')
        }
      }
    
      build() {
        Column({space:12}) {
          Text(`js修改ets属性text: ${this.count}`)
            .fontSize(25)
    
          Button('ets调用js方法改变text值+1')
            .fontSize(25)
            .onClick(()=>{
              //调用js方法
              this.webviewController.runJavaScript("change_text_add()")
            })
    
          Button('ets调用js方法改变text值-1')
            .fontSize(25)
            .onClick(()=>{
              //调用js方法
              this.webviewController.runJavaScript("change_text_reduce()")
            })
    
          Button('ets调用js方法改变web显示')
            .fontSize(25)
            .onClick(()=>{
              this.webviewController.runJavaScript("change_html_context('"+this.count+"')")
            })
    
          Web({ src: $rawfile('index.html'), controller: this.webviewController })
            .fileAccess(true)
            .javaScriptAccess(true)
            .zoomAccess(true)
            .imageAccess(true)
            .height(500)
            .padding(20)
              //注入JavaScript对象到window对象中,并在window对象中调用该对象的方法
            .javaScriptProxy({
              object : this.contentCall,
              name : "callBackToApp",
              methodList : ["callbackOne","callbackTwo"],
              controller : this.webviewController
            })
        }
      }
    }
    

    HTML 代码, 需要把index.html 放入对应模块 resources->rawfile 目录中

    <!DOCTYPE html>
    <html>
    <body>
    Hello world!
    <div id="indexjs" contenteditable="true"></div>
    <script>
    
        var INDEX = {};
    
        INDEX.editor = document.getElementById('indexjs'); //获取html中元素
    
        INDEX.setHtml = function(contents) {
            INDEX.editor.innerHTML = contents; //给id=“indexjs”的div元素赋值
        }
    
        function change_html_context(contents) {
            INDEX.setHtml(contents);
        }
    
        //ets调用js方法,间接回调ets的方法
        function change_text_add() {
            console.log('change_text_add start');
            var str = callBackToApp.callbackOne(); //js调用ets方法,实现ets访问
            console.log('change_text_add end');
        }
    
        //ets调用js方法,间接回调ets的方法
        function change_text_reduce() {
            console.log('change_text_reduce start');
            var str = callBackToApp.callbackTwo(); //js调用ets方法,实现ets访问
            console.log('change_text_reduce end');
        }
    </script>
    </body>
    </html>
    
    

    四 官网 例子

    ets

    import web_webview from '@ohos.web.webview';
    
    const TAG = "huxiubo"
    class testClass {
      constructor() {
      }
    
      test(): string {
        console.info(TAG, `hxuibuo`);
        return 'ArkTS Hello World!';
      }
    }
    
    @Entry
    @Component
    struct WebComponent {
      webviewController: web_webview.WebviewController = new web_webview.WebviewController();
      // 声明需要注册的对象
      @State testObj: testClass = new testClass();
    
      build() {
        Column({space: 20}) {
          Button("huxiubo")
          // web组件加载本地index.html页面
          Web({ src: $rawfile('index.html'), controller: this.webviewController})
            // 将对象注入到web端
            .javaScriptProxy({
              object: this.testObj,
              name: "testObjName",
              methodList: ["test"],
              controller: this.webviewController
            })
        }
      }
    }
    

    html

    <!DOCTYPE html>
    <html>
    <body>
    <button type="button" onclick="callArkTS()">Click Me!</button>
    <p id="demo"></p>
    <script>
        function callArkTS() {
            let str = testObjName.test();
            document.getElementById("demo").innerHTML = str;
            console.info('ArkTS Hello World! :' + str);
        }
    </script>
    </body>
    </html>
    

    注意:其中 ets 中 name: "testObjName", 需要和 HTML 中 let str = testObjName.test(); 一致,
    官网上不一致

    五 注意点

    本地模拟上HTML button 不能点击,需要真实手机、远程模拟器、远程真机测试

    相关文章

      网友评论

        本文标题:鸿蒙 ~web组件 runJavaScript()、javaSc

        本文链接:https://www.haomeiwen.com/subject/ahwagdtx.html