HarmonyOS web组件的runJavaScriptExt方法调用时如何判断网页的window上是否存在需要调用的方法,存在再调用,否则不调用?

如题:HarmonyOS web组件的runJavaScriptExt方法调用时如何判断网页的window上是否存在需要调用的方法,存在再调用,否则不调用?

阅读 507
1 个回答

暂没有可以直接校验方法名是否存在的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}`);
          }
        })
    }
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进