注册应用侧代码有两种方式,一种在Web组件初始化调用,使用javaScriptProxy()接口。另外一种在Web组件初始化完成后调用,使用registerJavaScriptProxy()接口。
在下面的示例中,将test()方法注册在前端页面中, 该函数可以在前端页面触发运行。
-
javaScriptProxy()接口使用示例如下。
// xxx.ets import { webview } from '@kit.ArkWeb'; class testClass { constructor() { } test(): string { return 'ArkTS Hello World!'; } } @Entry @Component struct WebComponent { webviewController: webview.WebviewController = new 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 { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; class testClass { constructor() { } test(): string { return "ArkUI Web Component"; } toString(): void { console.log('Web Component toString'); } } @Entry @Component struct Index { webviewController: webview.WebviewController = new webview.WebviewController(); @State testObj: testClass = new testClass(); build() { Column() { Button('refresh') .onClick(() => { try { this.webviewController.refresh(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('Register JavaScript To Window') .onClick(() => { try { this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "toString"]); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).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>
复杂类型使用方法
-
应用侧和前端页面之间传递Array。
// xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; class testClass { constructor() { } test(): Array<Number> { return [1, 2, 3, 4] } toString(param: String): void { console.log('Web Component toString' + param); } } @Entry @Component struct Index { webviewController: webview.WebviewController = new webview.WebviewController(); @State testObj: testClass = new testClass(); build() { Column() { Button('refresh') .onClick(() => { try { this.webviewController.refresh(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('Register JavaScript To Window') .onClick(() => { try { this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "toString"]); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: $rawfile('index.html'), controller: this.webviewController }) } } }
<!-- index.html --> <!DOCTYPE html> <html> <body> <button type="button" onclick="callArkTS()">Click Me!</button> <p id="demo"></p> <script> function callArkTS() { testObjName.toString(testObjName.test()); } </script> </body> </html>
-
应用侧和前端页面之间传递基础类型,非Function等复杂类型。
// xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; class student { name: string = ''; age: string = ''; } class testClass { constructor() { } // 传递的基础类型name:"jeck", age:"12"。 test(): student { let st: student = { name: "jeck", age: "12" }; return st; } toString(param: ESObject): void { console.log('Web Component toString' + param["name"]); } } @Entry @Component struct Index { webviewController: webview.WebviewController = new webview.WebviewController(); @State testObj: testClass = new testClass(); build() { Column() { Button('refresh') .onClick(() => { try { this.webviewController.refresh(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('Register JavaScript To Window') .onClick(() => { try { this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "toString"]); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: $rawfile('index.html'), controller: this.webviewController }) } } }
<!-- index.html --> <!DOCTYPE html> <html> <body> <button type="button" onclick="callArkTS()">Click Me!</button> <p id="demo"></p> <script> function callArkTS() { testObjName.toString(testObjName.test()); } </script> </body> </html>
-
应用侧调用前端页面的Callback。
// xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; class testClass { constructor() { } test(param: Function): void { param("call callback"); } toString(param: String): void { console.log('Web Component toString' + param); } } @Entry @Component struct Index { webviewController: webview.WebviewController = new webview.WebviewController(); @State testObj: testClass = new testClass(); build() { Column() { Button('refresh') .onClick(() => { try { this.webviewController.refresh(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('Register JavaScript To Window') .onClick(() => { try { this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "toString"]); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: $rawfile('index.html'), controller: this.webviewController }) } } }
<!-- index.html --> <!DOCTYPE html> <html> <body> <button type="button" onclick="callArkTS()">Click Me!</button> <p id="demo"></p> <script> function callArkTS() { testObjName.test(function(param){testObjName.toString(param)}); } </script> </body> </html>
-
应用侧调用前端页面Object里的Function。
// xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; class testClass { constructor() { } test(param: ESObject): void { param.hello("call obj func"); } toString(param: String): void { console.log('Web Component toString' + param); } } @Entry @Component struct Index { webviewController: webview.WebviewController = new webview.WebviewController(); @State testObj: testClass = new testClass(); build() { Column() { Button('refresh') .onClick(() => { try { this.webviewController.refresh(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('Register JavaScript To Window') .onClick(() => { try { this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "toString"]); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: $rawfile('index.html'), controller: this.webviewController }) } } }
<!-- index.html --> <!DOCTYPE html> <html> <body> <button type="button" onclick="callArkTS()">Click Me!</button> <p id="demo"></p> <script> // 写法1 class Student { constructor(nameList) { this.methodNameListForJsProxy = nameList; } hello(param) { testObjName.toString(param) } } var st = new Student(["hello"]) // 写法2 //创建一个构造器,构造函数首字母大写 function Obj1(){ this.methodNameListForJsProxy=["hello"]; this.hello=function(param){ testObjName.toString(param) }; } //利用构造器,通过new关键字生成对象 var st1 = new Obj1(); function callArkTS() { testObjName.test(st); testObjName.test(st1); } </script> </body> </html>
-
前端页面调用应用侧Object里的Function。
// xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; class ObjOther { methodNameListForJsProxy: string[] constructor(list: string[]) { this.methodNameListForJsProxy = list } testOther(json: string): void { console.info(json) } } class testClass { ObjReturn: ObjOther constructor() { this.ObjReturn = new ObjOther(["testOther"]); } test(): ESObject { return this.ObjReturn } toString(param: string): void { console.log('Web Component toString' + param); } } @Entry @Component struct Index { webviewController: webview.WebviewController = new webview.WebviewController(); @State testObj: testClass = new testClass(); build() { Column() { Button('refresh') .onClick(() => { try { this.webviewController.refresh(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('Register JavaScript To Window') .onClick(() => { try { this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "toString"]); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: $rawfile('index.html'), controller: this.webviewController }) } } }
<!-- index.html --> <!DOCTYPE html> <html> <body> <button type="button" onclick="callArkTS()">Click Me!</button> <p id="demo"></p> <script> function callArkTS() { testObjName.test().testOther("call other object func"); } </script> </body> </html>
-
Promise场景。
第一种使用方法,在应用侧new Promise。
// xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; class testClass { constructor() { } test(): Promise<string> { let p: Promise<string> = new Promise((resolve, reject) => { setTimeout(() => {console.log('执行完成'); reject('fail');}, 10000);}); return p; } toString(param:String): void { console.log(" " + param); } } @Entry @Component struct Index { webviewController: webview.WebviewController = new webview.WebviewController(); @State testObj: testClass = new testClass(); build() { Column() { Button('refresh') .onClick(() => { try { this.webviewController.refresh(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('Register JavaScript To Window') .onClick(() => { try { this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "toString"]); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: $rawfile('index.html'), controller: this.webviewController }) } } }
<!-- index.html --> <!DOCTYPE html> <html> <body> <button type="button" onclick="callArkTS()">Click Me!</button> <p id="demo"></p> <script> function callArkTS() { testObjName.test().then((param)=>{testObjName.toString(param)}).catch((param)=>{testObjName.toString(param)}) } </script> </body> </html>
第二种使用方法,在前端页面new Promise。
// xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; class testClass { constructor() { } test(param:Function): void { setTimeout( () => { param("suc") }, 10000) } toString(param:String): void { console.log(" " + param); } } @Entry @Component struct Index { webviewController: webview.WebviewController = new webview.WebviewController(); @State testObj: testClass = new testClass(); build() { Column() { Button('refresh') .onClick(() => { try { this.webviewController.refresh(); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Button('Register JavaScript To Window') .onClick(() => { try { this.webviewController.registerJavaScriptProxy(this.testObj, "testObjName", ["test", "toString"]); } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) Web({ src: $rawfile('index.html'), controller: this.webviewController }) } } }
<!-- index.html --> <!DOCTYPE html> <html> <body> <button type="button" onclick="callArkTS()">Click Me!</button> <p id="demo"></p> <script> function callArkTS() { let funpromise var p = new Promise(function(resolve, reject){funpromise=(param)=>{resolve(param)}}) testObjName.test(funpromise) p.then((param)=>{testObjName.toString(param)}) } </script> </body> </html>
最后
小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:
→【纯血版鸿蒙全套最新学习资料】希望这一份鸿蒙学习资料能够给大家带来帮助~
鸿蒙(HarmonyOS NEXT)最新学习路线
该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案
路线图适合人群:
IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术
2.视频学习资料+学习PDF文档
HarmonyOS Next 最新全套视频教程 (鸿蒙语法ArkTS、TypeScript、ArkUI教程……)
纯血版鸿蒙全套学习资料(面试、文档、全套视频等)
鸿蒙APP开发必备
总结
总的来说,华为鸿蒙不再兼容安卓,对程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,才能在这个变革的时代中立于不败之地。