aardio 文档
aardio 范例: web.view( WebView2 浏览器控件) - 调用 JS 函数
回调 JS 函数
//web.view( WebView2 浏览器控件) - 调用 JS 函数
import win.ui;
/*DSG{{*/
var winform = win.form(text="WebView2 - 调用 JS 函数";right=966;bottom=622)
winform.add(
btnCallJavaScript={cls="button";text="调用 JS 函数";left=615;top=537;right=869;bottom=606;color=0xD77800;db=1;dr=1;font=LOGFONT(h=-14);note="在 aardio 中调用 JavaScript 函数。";z=2};
static={cls="static";left=8;top=6;right=956;bottom=503;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/
import web.view;
var wb = web.view(winform.static);
/*
第一原则:在 JS 与 aardio 代码交互时应避免同步发起反向调用。
违反此原则可能导致 WebView2 调用异常、卡顿等问题。
- 在 aardio 中调用 JS 总是异步发起调用,
但 调用 wb.eval, wb.xcall 时默认会阻塞等待 JS 返回值,
除非在指定了接收 JS 返回值的回调函数(异步调用,不会阻塞调用代码)。
在被网页回调的 aardio 函数内部应避免阻塞调用导致阻塞后续调用。
如果不需要返回值,改用 wb.invoke, wb.doScript 更轻量且不需要处理返回值与回调。
或者通过 winform.setTimeout, thread.invoke 也可以异步执行代码。
- 在 JS 中虽然 aardio 函数的返回值是异步对象,但这不等于发起调用的过程是异步的。
一个正被 aardio 回调的 JS 函数内如果要反向回调 aardio,则应通过 setTimeout 异步发起调用。
*/
// aardio 按钮事件
winform.btnCallJavaScript.oncommand = function(id,event){
/*
wb.xcall 阻塞调用 JS 全局函数并等待 JS 返回值,
参数 @1 指定函数名,可添加任个调用参数。
*/
wb.xcall("setData",{
name = "测试1";
passowrd = "123456"
});
/*
调用 wb.eval, wb.xcall 时默认会阻塞等待 JS 返回值,
除非在指定了接收 JS 返回值的回调函数(异步调用,不会阻塞调用代码)。
在被网页回调的 aardio 函数内部应避免阻塞调用导致阻塞后续调用。
如果不需要返回值,改用 wb.invoke, wb.doScript 更轻量且不需要处理返回值与回调
wb.invoke 的用法与 wb.xcall 相同,
唯一的区别是 wb.invoke 不会阻塞并等待返回值。
**使用 WebView2 应当异步优先**:
总是优先用 wb.invoke, wb.doScrip 这样异步非阻塞的函数。
回调 JS 函数: https://www.aardio.com/zh-cn/doc/example/WebUI/web.view/js-callback.html
*/
/*
如果参数@1 不包含回车、换行、分号、大括号,圆括号,
则最后一个点号前的对象设为被调用函数的 this 参数。
*/
wb.invoke("emitter.emit",
"setData",{
name = "测试2";
passowrd = "123456"
});
//参数 @1 也可以指定返回函数对象的 JS 表达式。
wb.invoke("function(args){
emitter.emit('setData',args)
}", {
name = "测试3";
passowrd = "123456"
});
}
wb.external = {
nativeFunc = function(str){
winform.text = str;
}
}
wb.html = /**
<!DOCTYPE html><html>
<head>
<meta charset="utf-8" />
<script>!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).mitt=n()}(this,function(){return function(e){return{all:e=e||new Map,on:function(n,t){var f=e.get(n);f?f.push(t):e.set(n,[t])},off:function(n,t){var f=e.get(n);f&&(t?f.splice(f.indexOf(t)>>>0,1):e.set(n,[]))},emit:function(n,t){var f=e.get(n);f&&f.slice().map(function(e){e(t)}),(f=e.get("*"))&&f.slice().map(function(e){e(n,t)})}}}});
emitter = mitt();//github.com/developit/mitt </script>
</head>
<body>
<script>
//响应事件
emitter.on("setData", function(v){
document.body.insertAdjacentHTML("beforeEnd", JSON.stringify(v) + "<br>" )
} );
//定义全局函数
window.setData = function(v){
document.body.insertAdjacentHTML("beforeEnd", JSON.stringify(v) + "<br>" )
//正被 aardio 回调的 JS 反向回调 aardio 时仍应使用 setTimeout 异步发起调用
setTimeout(()=>{
aardio.nativeFunc("正被 aardio 回调的 JS 函数反向回调 aardio 函数")
})
}
</script>
</body>
**/
winform.show();
win.loopMessage();
Markdown 格式