HarmonyOS鸿蒙Next中通过web组件集成H5页面,new Function调用不能正常获取结果
HarmonyOS鸿蒙Next中通过web组件集成H5页面,new Function调用不能正常获取结果 鸿蒙通过web组件集成H5页面,在H5页面通过new Function这种动态函数调用方式调用鸿蒙注册的函数,能否正常调用成功呢?怎么获取到返回结果呢?
例如:调用方式 const token = new Function(‘window.hm.getToken()’).apply()
ArkTs中对JS部分语法存在限制:
eval和new Function无法使用。
若是需要在H5中调用原生侧的方法,可以通过javaScriptProxy,如:
import { webview } from '@kit.ArkWeb';
class TestObj {
constructor() {
}
async test(): Promise<string> {
let p: string = await new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
}, 1000);
});
return p;
}
}
@Entry
@Component
struct Index {
controller: webview.WebviewController = new webview.WebviewController();
testObj = new TestObj();
build() {
Column() {
Web({ src: $rawfile('index.html'), controller: this.controller })
.javaScriptAccess(true)
.javaScriptProxy({
object: this.testObj,
name: "objName",
methodList: ["test"],
controller: this.controller,
})
}
}
}
<!Document>
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<p id="text">HTML页面内容</p>
<button onclick="new Function('console.log('测试测试测试')')">click</button>
</body>
<script type="text/javascript">
function clickFun(){
objName.test().then((str)=>{
console.log('Promise返回值:',str);
})
}
</script>
</html>
更多关于HarmonyOS鸿蒙Next中通过web组件集成H5页面,new Function调用不能正常获取结果的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,Web组件集成H5页面时,new Function调用异常可能源于鸿蒙的安全沙箱限制。鸿蒙对Web组件的JavaScript执行环境实施了严格的安全策略,禁止动态代码执行。建议检查以下配置:确保Web组件的JavaScript接口已正确启用,验证H5页面的CSP策略是否允许内联脚本执行,并确认new Function的参数格式符合鸿蒙规范。若问题持续,需排查H5代码是否存在兼容性问题。
在HarmonyOS Next中,通过Web组件集成H5页面时,使用new Function
动态调用鸿蒙侧注册的JavaScript接口(如window.hm.getToken()
)是可行的,但需注意以下几点:
-
接口注册与注入
确保鸿蒙侧已通过WebViewController
的registerJavaScriptProxy()
方法正确注册了hm
对象及getToken
方法,并在页面加载前完成注入(例如在onPageBegin
回调中调用refreshJavaScriptProxy()
)。 -
调用时机与上下文
H5页面中的动态函数调用需在鸿蒙接口注入完成后执行。若页面加载过程中过早调用,可能因接口未就绪而失败。建议在页面onLoad
事件或鸿蒙侧通过runJavaScript
主动通知后触发。 -
返回值传递
- 若
getToken
为同步方法,可直接通过new Function
获取结果(如示例代码)。 - 若为异步方法(如涉及Promise或回调),需通过鸿蒙的
runJavaScript
方法或registerJavaScriptProxy
的回调机制传递结果。例如:// 鸿蒙侧注册异步方法 hm.getToken = (callback) => { // 获取token后回调H5 callback(token); }; // H5侧调用 new Function('window.hm.getToken(cb)').apply();
- 若
-
常见问题排查
- 检查Web组件的
javaScriptAccess
属性是否设置为true
。 - 确认H5页面未启用严格模式(
'use strict'
),否则new Function
可能受限。 - 通过DevEco Studio的Web调试器查看Console日志,确认接口注入及调用过程中的报错信息。
- 检查Web组件的
示例代码(鸿蒙侧):
// 注册JavaScript接口
webViewController.registerJavaScriptProxy({
hm: {
getToken: () => {
return "example_token";
}
}
}, "window");
// 页面加载时刷新注入
webViewController.refreshJavaScriptProxy();
通过以上步骤,可确保动态函数调用正常执行并获取返回结果。