[文章]鸿蒙原生应用元服务开发-Web前端页面调用应用侧函数

阅读量0
0
0

开发者使用Web组件将应用侧代码注册到前端页面中,注册完成之后,前端页面中使用注册的对象名称就可以调用应用侧的函数,实现在前端页面中调用应用侧方法。

注册应用侧代码有两种方式,一种在Web组件初始化使用调用,使用javaScriptProxy()接口。另外一种在Web组件初始化完成后调用,使用registerJavaScriptProxy()接口。

在下面的示例中,将test()方法注册在前端页面中, 该函数可以在前端页面触发运行。

javaScriptProxy()接口使用示例如下。

// xxx.ets

import web_webview from '@ohos.web.webview';

 

class testClass {

  constructor() {

  }

 

  test(): string {

    return 'ArkTS Hello World!';

  }

}

 

@Entry

@Component

struct WebComponent {

  webviewController: web_webview.WebviewController = new web_webview.WebviewController();

  // 声明需要注册的对象

  @State testObj: testClass = new testClass();

 

  build() {

    Column() {

      // web组件加载本地index.html页面

      Web({ src: $rawfile('index.html'), controller: this.webviewController})

        // 将对象注入到web端

        .javaScriptProxy({

          object: this.testObj,

          name: "testObjName",

          methodList: ["test"],

          controller: this.webviewController

        })

    }

  }

}

应用侧使用registerJavaScriptProxy()接口注册。

// xxx.ets

import web_webview from '@ohos.web.webview';

import business_error from '@ohos.base';

 

class testClass {

  constructor() {

  }

 

  test(): string {

    return "ArkUI Web Component";

  }

 

  toString(): void {

    console.log('Web Component toString');

  }

}

 

@Entry

@Component

struct Index {

  webviewController: web_webview.WebviewController = new web_webview.WebviewController();

  @State testObj: testClass = new testClass();

 

  build() {

    Column() {

      Button('refresh')

        .onClick(() => {

          try {

            this.webviewController.refresh();

          } catch (error) {

            let e: business_error.BusinessError = error as business_error.BusinessError;

            console.error(`ErrorCode: ${e.code},  Message: ${e.message}`);

          }

        })

      Button('Register JavaScript To Window')

        .onClick(() => {

          try {

            this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "toString"]);

          } catch (error) {

            let e: business_error.BusinessError = error as business_error.BusinessError;

            console.error(`ErrorCode: ${e.code},  Message: ${e.message}`);

          }

        })

      Web({ src: $rawfile('index.html'), controller: this.webviewController })

    }

  }

}

说明,使用registerJavaScriptProxy()接口注册方法时,注册后需调用refresh()接口生效。

index.html前端页面触发应用侧代码。

<!-- index.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>`

本文参考引用HarmonyOS官方开发文档,基于API9。

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友