You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Access 365的Edge浏览器控件中捕获JavaScript事件监听器传递的变量数据

如何在Access 365的Edge浏览器控件中捕获JavaScript事件监听器传递的变量数据

嘿,我完全理解你现在的迷茫——刚接触JavaScript和Access浏览器控件的交互,确实容易摸不着方向,咱们一步步来搞定这个问题!

首先,核心思路是搭建JavaScript和Access VBA之间的通信桥梁,因为浏览器控件和Access是两个独立的运行环境,得让它们能互相传递数据。下面是具体的实现步骤:

1. 先在Access里创建一个“通信桥梁”类模块

这个模块的作用是接收来自JavaScript的数据,相当于给JS留一个可以调用的接口:

  • 打开Access的VBA编辑器(按Alt+F11),右键点击你的数据库项目,选择「插入」→「类模块」
  • 把这个类模块命名为JSBridge(名字随便起,但后面要对应上)
  • 在类模块里写入以下代码:
Public Sub ReceiveArrayEventData(tagName As String, eventAction As String, metadata As String)
    ' 这里是你处理数据的地方,可以根据需求修改
    ' 比如弹出消息框确认收到数据
    MsgBox "成功捕获事件数据:" & vbCrLf & _
           "组件名称:" & tagName & vbCrLf & _
           "用户操作:" & eventAction & vbCrLf & _
           "元数据:" & metadata
           
    ' 如果要把数据存入Access表,示例代码(记得替换成你的表名和字段名)
    ' 注意:实际使用要处理字符串转义,避免SQL注入问题
    ' DoCmd.RunSQL "INSERT INTO 事件记录表 (组件名, 用户操作, 元数据) VALUES ('" & Replace(tagName, "'", "''") & "', '" & Replace(eventAction, "'", "''") & "', '" & Replace(metadata, "'", "''") & "')"
End Sub

2. 在窗体加载时绑定桥梁到浏览器控件

假设你的Edge浏览器控件名叫WebBrowser0(如果名字不一样,记得替换),打开窗体的VBA代码窗口,写入以下内容:

Private objJSBridge As JSBridge

Private Sub Form_Load()
    ' 初始化桥梁对象
    Set objJSBridge = New JSBridge
    ' 把桥梁绑定到浏览器控件,这样JS就能调用我们的VBA方法了
    WebBrowser0.ObjectForScripting = objJSBridge
End Sub

3. 修改网页里的JavaScript代码,把数据传给Access

现在需要让你的JS事件监听器在捕获到array-event时,把数据发送给刚才创建的VBA方法。因为元数据是对象类型,我们需要把它转成JSON字符串才能传递,修改后的JS代码如下:

<script>
    window.addEventListener("array-event", function arrayEvent(arrayEvent) {
        const {
            tagName,
            event,
            metadata = {},
        } = arrayEvent.detail;
        console.log("component: " + tagName + "; user action: " + event);
        if (metadata){console.log(metadata);}
        
        // 关键:调用Access的VBA方法传递数据
        window.external.ReceiveArrayEventData(
            tagName,
            event,
            JSON.stringify(metadata) // 把对象转成JSON字符串
        );
    });
</script>

一些需要注意的小细节

  • 确保你的Edge浏览器控件是用现代Edge模式运行,旧的IE模式可能不支持JSON.stringify或者window.external的部分特性。如果遇到兼容性问题,可以检查Access的WebBrowser控件是否配置为Edge模式。
  • 类模块里的方法必须是Public的,而且参数类型要和JS传递的内容匹配(JS的字符串对应VBA的String,数字对应Integer/Double,对象必须转成JSON字符串)。
  • 测试的时候可以先简化:比如在JS里直接写window.external.ReceiveArrayEventData("测试组件", "点击", '{"id":123}'),看Access能不能弹出消息框,确认通信正常后再对接真实的事件数据。

慢慢来,先把基础的通信打通,之后再根据需求调整数据处理的逻辑就好啦!

备注:内容来源于stack exchange,提问作者Mark Carlyle

火山引擎 最新活动