为了触发在 Web 引擎上运行的网站中的功能,可以使用 JavaScript CustomEvent。
有关 CustomEvent() 的描述,请单击此处。
可以使用 vrdWebEngines 的 sendEvent() 方法发送 CustomEvent。它采用两个字符串参数。 第一个是 CustomEvent 的标识符,第二个可以包含特定于事件的数据,也可以是空字符串。
在网页中注入的 JavaScript 代码如下所示:
1 var e = new CustomEvent( event
2 {
3 detail: data
4 });
5
6 document.dispatchEvent(e);
始终通过 DOM 文档发送事件。您可以在 Web 引擎上所运行的 JavaScript 代码中安装事件处理程序,用于侦听这些事件并触发其他功能。
以下是一个小示例,说明如何使用 CustomEvent 更改网页的背景颜色。
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>JavaScript Custom Event</title>
7 </head>
8 <body style="background-color:white;">
9 <div class="note">JavaScript Custom Event</div>
10 <script>
11 document.addEventListener("testEvent", function(event) {
12 document.body.style.background = event.detail.color;
13 });
14 </script>
15 </body>
16 </html>
这将创建一个具有白色背景的页面,并为名为“testEvent”的自定义事件安装事件侦听器。 要在 VRED 中使用此项,请创建一个新的前板,并为其指定名称“EventFrontPlate”。 将其内容类型设置为“Web”并复制粘贴上述 HTML 代码。
现在,我们需要一个基础 Web 引擎实例:
we = vrWebEngineService.getWebEngine("EventFrontPlate")
现在,我们创建一个将背景颜色更改为红色的事件:
we.sendEvent("testEvent", "{color: 'red'}")
或者,我们可以将其设置为绿色:
we.sendEvent("testEvent", "{color: 'green'}")
如果不希望将自定义数据传递到事件,则可以对第二个参数使用空字符串。 有关使用多个 CustomEvent 的更详尽的示例,请参见 Web 引擎菜单演示。
本示例说明了如何访问自定义数据参数并使用它在 VRED 中调用 Python 函数。 如上例所示,创建名为“EventFrontPlate”的前板,然后使用下面的 html 代码。
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>JavaScript Custom Event</title>
7 </head>
8 <body style="background-color:white;">
9 <div class="note">JavaScript Custom Event</div>
10 <script>
11 document.addEventListener("testEvent", function(event) {
12 vred.executePython("printFromJavascript('" + event.detail.custom + "')");
13 });
14 </script>
15 </body>
16 </html>
在 VRED 中,必须执行以下 Python 函数:
def printFromJavascript(data):
print(data)
然后,我们可以在 VRED 中调用此事件:
we = vrWebEngineService.getWebEngine("EventFrontPlate")
we.sendEvent("testEvent", "{custom: 'test 123'}")
VRED 生成的自定义事件的 Javascript 代码如下所示:
1 <script>
2 var e = new CustomEvent("testEvent"
3 {
4 detail: {custom: 'test 123' }
5 });
6 </script>
在 VRED 2021.3 中,必须更改 data 参数以允许复杂事件,如上例所示。 sendToWebEngine() 的签名如下:
sendToWebEngine(name, event, data)
在 VRED 2021.3 之前的版本中,将 JavaScript 代码插入网页时,会在内部引用 data 参数。 因此,如果您按如下方式调用它:
sendToWebEngine("EventFrontPlate", "testEvent", "test 123")
Javascript 代码应为:
1 <script>
2 var e = new CustomEvent("testEvent"
3 {
4 detail: "test 123" }
5 });
6 </script>
在 VRED 2021.3 及更高版本中,不会自动引用 test 123。如果需要旧行为,需要写下:
sendToWebEngine("EventFrontPlate", "testEvent", "'test 123'")
需要进行此更改,以便可以执行复杂事件。否则,类似以下的调用:
sendToWebEngine("EventFrontPlate", "testEvent", "{custom: 'test 123'}")
可能会产生:
1 <script>
2 var e = new CustomEvent("testEvent"
3 {
4 detail: "{custom: 'test 123' }"
5 });
6 </script>
词典周围的引号无效,因此该事件不起作用,因为用户无法删除引号。
由于 VRED 使用 QtWebengine,因此您可以使用 Qt 机制调试嵌入式浏览器。 您需要设置环境变量 QTWEBENGINE_REMOTE_DEBUGGING。该值必须是端口号。 示例: 设置 QTWEBENGINE_REMOTE_DEBUGGING=9876
当 VRED 正在运行且 Web 引擎实例处于活动状态时,可以启动 Chrome(或其他基于 Chromium 的浏览器,如 Opera 或 Vivaldi),然后使用其内部远程调试器连接到 VRED 中的 Web 引擎。 要执行此操作,请在 Chrome 中转到此 URL:http://localhost:9876