暂没有可以直接校验方法名是否存在的api,根据描述,采用js注入的方式,这边有一份简易demo,js层判断方法是否存在,然后返回结果给ArkTS层,然后ArkTS层根据返回的结果来进行方法的调用。index.html 文件<!DOCTYPE html> <html lang="en-gb"> <body> <h1>run JavaScript Ext demo</h1> </body> <script type="text/javascript"> function test() { return "hello, world"; } function checkMethodExists(methodName){ if(typeof window[methodName] === 'function'){ console.log(methodName + '方法存在'); return "方法存在"; }else{ console.log(methodName + '方法不存在'); return "方法不存在"; } } </script> </html>index.ets 文件import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; @Entry @Component struct WebComponent { controller: webview.WebviewController = new webview.WebviewController(); @State msg1: string = ''; @State msg2: string = ''; build() { Column() { Text(this.msg1).fontSize(20) Text(this.msg2).fontSize(20) Web({ src: $rawfile('index.html'), controller: this.controller }) .javaScriptAccess(true) .onPageEnd(e => { try { // 调用 web.runJavaScriptExt 执行JavaScript代码 this.controller.runJavaScriptExt("checkMethodExists('test')", (error, result) => { if (error) { console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`) return; } if (result) { try { let type = result.getType(); switch (type) { case webview.JsMessageType.STRING: { this.msg1 = "result type:" + typeof (result.getString()); this.msg2 = "result getString:" + ((result.getString())); break; } case webview.JsMessageType.NUMBER: { this.msg1 = "result type:" + typeof (result.getNumber()); this.msg2 = "result getNumber:" + ((result.getNumber())); break; } case webview.JsMessageType.BOOLEAN: { this.msg1 = "result type:" + typeof (result.getBoolean()); this.msg2 = "result getBoolean:" + ((result.getBoolean())); break; } case webview.JsMessageType.ARRAY_BUFFER: { this.msg1 = "result type:" + typeof (result.getArrayBuffer()); this.msg2 = "result getArrayBuffer byteLength:" + ((result.getArrayBuffer().byteLength)); break; } case webview.JsMessageType.ARRAY: { this.msg1 = "result type:" + typeof (result.getArray()); this.msg2 = "result getArray:" + result.getArray(); break; } default: { this.msg1 = "default break, type:" + type; break; } } } catch (resError) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } } }); if (e) { console.info('url: ', e.url); } } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) } } }
暂没有可以直接校验方法名是否存在的api,根据描述,采用js注入的方式,这边有一份简易demo,js层判断方法是否存在,然后返回结果给ArkTS层,然后ArkTS层根据返回的结果来进行方法的调用。
index.html 文件
index.ets 文件