web.view 基于微软 WebView2(Edge/Chromium内核),
WebView2 稳定可靠、性能强悍、接口简洁,可生成体积很小的独立 EXE 程序。 WebView2 支持 Win10 以及之后的系统。
Win11 已自带 WebView2,Win10 1803 以及之后的系统早已自动推送 WebView2。 实际上现在 WebView2 已经是无法卸载的系统级组件。
没有自带 WebView2 的旧系统已经非常罕见,可以忽略不记。 只要简洁,不求完美!
Win7 在市场上已经接近消失,现在开发软件再处处考虑 Win7 兼容是不必要的。
web.view 支持库不再支持 Win7,可通过 web.view.7 扩展库导入兼容 Win7 的旧版 web.view 。 在网页上点右键菜单项(Inspect / 检查)或按 F12 键可以打开网页开发工具( DevTools ),
在开发工具的「设置 / 语言」(Settings / Language」)界面可切换开发工具的界面语言。
在 DevTools 控制台(Console)可查看程序错误信息。必读
web.view(winform,{
extensions = true;
language = "zh-CN";
startArguments = {acceptLang = "zh-CN" };
/*extensions 是否启用浏览器扩展,启用后可调用 loadExtension 函数加载扩展。
userDataDir 一般可省略,不同的 userDataDir 创建不同的会话。
language 指定浏览器界面语言,也影响 --accept--lang 参数的值。
一般自动指定为系统语言,可省略。
startArguments 指定浏览器启动参数,
可以是 string.args 兼容的字符串、表对象都可以。
compatibleBrowserVersion 指定最低兼容的浏览器版本,可省略。
*/})
创建浏览器控件,
参数 @winform 指定嵌入网页的宿主窗口,
└── @winform 可指定窗体对象或 static,custom 等控件对象。└── 不指定 @winform 则自动创建 messageOnly 隐藏窗口。
可选用参数 @userDataDir 参数自定义用户数据目录,
可选用参数 @browserArguments 传入一个命令行参数表或多个非 null 命令行参数。
所有命令行参数调用 string.args.joinEx 合成为 WebView2 的启动参数。
表参数中的驼峰参数名自动转为连字符风格并加 -- 前缀。
其他规则请参考原码与 string.args.joinEx 说明。
└── 例如修改 UA:--user-agent="Mozilla/5.0 aardio"
└──例如切换语言:--accept-lang=zh-CN
└──更多参数:
参数 @browserArguments 也可用数值指定要启动的远程调试端口,
└── 调试端口为 0 则自动分配空闲端口,
└── 同一用户数据目录不能同时使用远程调试与内置 CDP 接口
如果未指定 @browserArguments,则取 web.view.browserArguments 设为默认启动参数。
@browserArguments 之后的参数仍会合成到启动参数内
WebView2(Edge/Chromium内核)控件,
可生成体积很小的独立 EXE 程序。
WebView2 支持 Win10 以及之后的系统。
Win11 已自带 WebView2,Win10 1803 以及之后的系统也已经自动推送 WebView2。
因为 Win10 会自动更新,版本小于 1803 的 Win10 数量极少,可以忽略不计。
其他检测到未安装 WebView2 的系统 —— aardio 会自动安装(不需要写任何代码)
创建 WebView2(Edge/Chromium内核) 浏览器控件。
此对象支持多线程界面回调,可传入工作线程使用
用于指定默认的浏览器启动参数。
可以指定一个 string.args.joinEx 支持的命令行参数表或字符串。
也可以指定一个可以返回上述参数的函数。
如果未安装 WebView2 Runtime 就自动下载安装
获取 WebView2 Runtime 安装信息
未安装返回 null
重装 WebView2 Runtime
创建浏览器控件传入的窗口对象
调整页面大小到适合窗口
调用 WebView2 内置 CDP(Chrome DevTools Protocol) 接口。
调用内置 CDP(Chrome DevTools Protocol)接口,多个 WebView2 不会冲突。
但同一用户数据目录不能在使用内置 CDP 接口的同时开放远程调试端口
调用 WebView2 内置 CDP 接口。
参数 @method 指定 CDP 方法,例如:"Page.navigate" 。
参数 @param 用一个表对象,或 JSON 字符串指定调用参数。
成功返回一个表对象,失败返回 null,错误代码
异步调用 WebView2 内置 CDP 接口。
不等待 CDP 调用完成,而是在调用完成异步回调 callback 函数。
参数 @method 指定 CDP 方法,例如:"Page.navigate" 。
参数 @param 用一个表对象,或 JSON 字符串指定调用参数。
@callback 指定回调函数,
回调参数@1为 CDP 返回的表对象,回调参数@2 为错误代码。
成功返回 true,失败返回 null,错误代码
使用 WebView2 内置 CDP 接口查询 DOM 节点。
调用内置 CDP(Chrome DevTools Protocol)接口,多个 WebView2 不会冲突。
但同一用户数据目录不能在使用内置 CDP 接口的同时开放远程调试端口
使用 WebView2 内置 CDP 接口查询节点。
@selector 指定 CSS 选择器,
@parent 可选指定父节点或父节点的 nodeId。
不指定父节点则 @parent 默认取页面根节点。
成功返回表对象,失败返回 null,错误代码
异步调用 WebView2 内置 CDP 接口查询节点。
不等待 CDP 调用完成,而是在调用完成异步回调 callback 函数。
@selector 指定 CSS 选择器,
@parent 可选指定父节点或父节点的 nodeId。
不指定父节点则 @parent 默认取页面根节点。
@callback 指定回调函数,
回调参数@1为 CDP 返回的表对象,回调参数@2 为错误代码。
成功返回 true,失败返回 null,错误代码
订阅 CDP 事件
回调函数的参数为参数表对象。
如果回调函数返回一个函数,则先结束事件,然后异步执行该函数。
调用此函数总是会取消之前订阅的同名事件。
如果回调函数为 null,则仅取消订阅
调用 WebView2 内置 CDP 接口并等待返回非 null 值。
调用内置 CDP(Chrome DevTools Protocol)接口,多个 WebView2 不会冲突。
但同一用户数据目录不能在使用内置 CDP 接口的同时开放远程调试端口
调用 WebView2 内置 CDP 接口并等待返回非 null 值。
参数 @method 指定 CDP 方法,例如:"DOM.getDocument" 。
参数 @param 用一个表对象,或 JSON 字符串指定调用参数。
可选用 @timeout 指定超时,单位毫秒,默认在窗口关闭前一直等待。
成功返回一个表对象,失败返回 null,错误代码。
超时错误代码为 0x102/*_WAIT_TIMEOUT*/。
使用 WebView2 内置 CDP 接口查询并等待 DOM 节点。
调用内置 CDP(Chrome DevTools Protocol)接口,多个 WebView2 不会冲突。
但同一用户数据目录不能在使用内置 CDP 接口的同时开放远程调试端口
使用 WebView2 内置 CDP 接口接口查询并等待节点,
@selector 指定 CSS 选择器,
@parent 可选指定父节点或父节点的 nodeId。
不指定父节点则 @parent 默认取页面根节点。
可选用 @timeout 指定超时,单位毫秒,默认在窗口关闭前一直等待。
成功返回表对象,失败返回 null,错误代码。
超时错误代码为 0x102/*_WAIT_TIMEOUT*/
网页默认背景色, GDI+ 兼容的 ARGB 格式数值
颜色透明度仅支持透明或不透明
执行 字符串参数@1 指定的 JS 脚本
执行JS代码,
不指定回调函数时,JS代码放入匿名函数体内执行
WebView2Object.doScript(js,function(result){
/*执行JS代码成功在当前界面线程异步回调此函数,
@result参数为JS代码的返回值*/
} )
设置是否启用默认右键菜单。
参数 @1 可指定 true 或 false 。
必须在加载网页前设置
设置是否启用网页开发工具。
参数 @1 可指定 true 或 false 。
必须在加载网页前设置
是否允许在网页窗口底部显示默认状态栏,默认不显示。
参数 @1 可指定 true 或 false
运算 JS 代码并返回值
返回值使用 JSON 转换为 aardio 值。
此函数会阻塞直到调用返回。
在被网页回调 aardio 函数内调用 webView.xcall,webView.eval 可能导致阻塞,
应改用非阻塞的 webView.invoke 函数,或用 winform.setTimeout 异步调用 webView.xcall,webView.eval 函数
运算JS代码并返回值,
等待返回值过程中会继续处理界面消息,
如果指定多个参数,则首先调用 string.format 格式化所有参数
导出 aardio 函数为 JS 全局变量
注意 JS 调用这里导出的本地函数时,
传入 JS 参数通过 JSON 转换为 aardio对象,
返回值通过 JSON 转换为 JS 对象
在被网页回调 aardio 函数内执行 JS 时要避免在 JS 中再次回调此 aardio 函数。
被网页回调的 aardio 函数内不要调用可能阻塞的 webView.xcall,webView.eval 函数。
应改用非阻塞的 webView.invoke 函数,或通过 winform.setTimeout 异步调用 webView.xcall,webView.eval 函数
导出aardio函数为JS全局变量,
参数也可以使用一个表包含多个需要绑定到JS的变量名值对,值必须是函数。
JS脚本中调用这里绑定的本地函数返回值为 Promise 对象
直接导出 aardio 对象到 JavaScript,
直接转换为 COM 对象,中间不需要经过 JSON 转换,
用法请参考: https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2?view=webview2-1.0.705.50#addhostobjecttoscript
直接导出 aardio 对象到 JavaScript,
可导出表对象、函数对象、COM 对象等,
在js中通过 chrome.webview.hostObjects的成员访问此对象,
中间不会经过JSON转换,而是直接转换为 COM 对象,
用这个方法导出函数时,
要特别注意参数中的 JavaScript 对象会被转换为 COM 对象,
而返回给 JavaScript 的 aardio 对象会被转换为 Promise 对象
WebView2Object.external = {
/*导出为 JavaScript 中可访问的全局对象 aardio
JS中该对象的所有成员都是 Promise 对象。
通过此对象调用 aardio 函数时参数中的 JS 对象会转换为 COM 对象,
而返回给 JS 的 aardio 对象会被转换为 Promise 对象
被网页回调的 aardio 函数内不要调用可能阻塞的 webView.xcall,webView.eval 函数。
应改用非阻塞的 webView.invoke 函数,或通过 winform.setTimeout 异步调用 webView.xcall,webView.eval 函数*/
}
网页窗口设置为输入焦点
全屏。
参数指定是否全屏,不指定参数则切换全屏。
返回值为当前是否全屏
打开网址或文件地址。
如果需要用这个函数打开工程内的资源文件,
请提前导入 wsock.tcp.simpleHttpServer 或 wsock.tcp.asynHttpServer 。
如果要在打开的网页上跳转锚点(也就是跳转 # 开头的网址),
可改用 location 属性跳转
打开 @url 参数指定的网址。
如果提前导入 wsock.tcp.simpleHttpServer 或 wsock.tcp.asynHttpServer
则 io.localpath 支持的路径转换为通过嵌入 HTTP 服务器访问的网址。
使用 HTTP 嵌入服务器可自动支持嵌入资源路径与 SPA 单页应用。
如果同时文件名为 index.html 或 index.aardio。
则上级目录设为 documentBase 根目录,后续请求路径应当以 "/" 代替 documentBase。
可选使用@devPort参数指定前端项目开发环境调试端口,
可选用@devTimeout参数指定检测调试端口超时
@devPort,@devTimeout参数仅在开发环境中有效
WebView2Object.html = /**
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style type="text/css">
html,body{ height:100%; margin:0; } /*将网页写入内存。
支持 aardio 模板语法,模板的 owner 参数为当前 web.view 对象。
包含 HTML 的块注释可赋值为字符串,首尾星号数目要一致。
WebView2 通过 html 属性内存加载体积太大的 HTML 会卡住,改用本地文件可流畅打开。
如果要引用其他本地文件,也必须改用 wb.go 打开 html 文件。*/
</style>
<script></script>
</head>
<body></body>
</html>
**/
网页窗口句柄
调用 JS 函数但不会等待返回值。
此函数使用 JSON 在 JS/aardio 之间转换参数与返回值
调用 JS 函数但不会等待返回值,
等待返回值过程中会继续处理界面消息。
参数 @1 指定要调用的函数名或返回函数的表达式,
如果参数 @1 不包含回车或换换行、分号、大括号、圆括号,
则参数 @1最后一个点号前的对象作为调用 JS 函数的 this 参数
浏览器控件是否显示
加载浏览器扩展目录。
参数 @1 必须指定浏览器扩展配置文件 manifest.json 所在的目录。
如果事先导入 chrome.extensions 库,
则参数可指定系统浏览器扩展 ID、或名称、描述包含的关键字(忽略大小写)。
在浏览器扩展管理页面可查看 ID。
获取或设置当前网址。
可以用于跳转锚点(也就是指定#开头的网址)。
如果当前已经打开其他网页,则修改 location.href 跳转。
否则调用 go 函数跳转
通知 WebView2 控件父窗口已移动
WebView2Object.onDocumentInit = function(url){
/*打开网页并创建 document 对象后触发此事件,
url为当前网址*/
}
WebView2Object.onFullScreen = lambda(enabled) owner.fullscreen(enabled);/*响应网页全屏事件,
参数 enabled 表示网页是否请求全屏,此函数忽略返回值。
设为 null 移除事件*/
WebView2Object.onNewWindow = function(url){
/*返回 false 继续打开新窗口。
返回 true 阻止打开新窗口。
返回函数则阻止打开新窗口,并异步执行该函数。
耗时或阻塞浏览器控件的操作应放入返回的异步函数内执行*/
}
创建 web.socket.chrome 远程调试对象,
请先导入web.socket.chrome
返回对象:websocketchromeClientObject
将 字符串参数@1 指定的 JS 脚本添加为网页默认加载脚本,
在网页初始化时执行,保证在 window.onload 事件前执行,
不会覆盖之前添加的脚本
远程调试端口,只读属性
推迟执行指定的函数或代码。
此函数异步执行参数中指定的函数,不会阻塞当前代码继续执行。
网页回调 aardio 函数时,
如果要使用 webView.eval, webView.xcall 等阻塞调用网页的函数,
应通过 setTimeout 函数异步调用
延时参数是可选参数,以毫秒为单位,默认为0毫秒。
可选用附加参数指定调用延时函数的实参。
返回值为定时器 ID
创建浏览器控件指定的浏览器用户数据目录
如果该目录下数据异常会导致浏览器异常组件并显示空白,
此时关闭程序并清空或更新用户数据目录即可
等待参数@1指定的网址打开,
参数@2支持模式匹配语法,
在指定的网页创建 document 对象后返回,
窗口关闭也会返回。
成功返回页面 URL
等待文档对象准备就绪。
也就是页面的 document.readyState 为 "interactive" 时返回 true。
如果参数 @1 为 true 则 document.readyState 为 "complete" 时返回 true。
可选用参数 @2 指定超时。
等待网页创建指定节点
等待网页创建指定节点
@selector 参数指定CSS选择器,
省略参数@2时同步等待节点出现。
成功返回 CSS 选择器,失败返回 null,错误对象(表对象或字符串)
异步等待网页创建指定节点
@selector 参数指定CSS选择器,
参数@2指定 aardio 回调函数,
找到节点回调参数@1为选择器,
失败回调参数@2为错误信息,回调参数@1为null,
可选用参数@3指定超时,单位毫秒
异步等待网页创建指定节点
@selector 参数指定CSS选择器,
找到节点执行参数@2指定的 JavaScript 代码,
执行JS代码时自动绑定this对象为找到的节点,
可选用参数@3指定超时,单位毫秒
等待参数@1指定的网址打开,支持模式匹配。
参数 @1 的等待规则与 wait 函数相同。
参数 @2 指定要等待的 URL 参数名,
如果找到该参数则返回参数值,否则继续等待到参数出现或社会窗口关闭
调用JS函数并返回值。
此函数使用 JSON 在 JS/aardio 之间转换参数与返回值
此函数会阻塞直到调用返回。
如果不需要返回值建议改用异步非阻塞的 webView.invoke 函数。
在被网页回调 aardio 函数内调用 webView.xcall,webView.eval 可能导致阻塞,
应改用非阻塞的 webView.invoke 函数,或用 winform.setTimeout 异步调用 webView.xcall,webView.eval 函数
调用 JS 函数并返回值,
此函数使用 JSON 在 JS/aardio 之间转换参数与返回值。
等待返回值过程中会继续处理界面消息,
参数@!指定要调用的函数名或返回函数的表达式,
如果参数 @1 不包含回车或换换行、分号、大括号、圆括号,
则参数 @1最后一个点号前的对象作为调用 JS 函数的 this 参数