javascript - Electron 主流程脚本是否可以通过 `postMessage`函数监听页面发布的消息?

标签 javascript html electron w3c

我想在由Electron渲染器进程加载的页面脚本中使用标准的 postMessage API函数。

我想在渲染器进程脚本中坚持使用Web API,因为该应用程序旨在在Electron和Web上运行(在用户首选的Web浏览器中)。我不想用if(typeof electron != "undefined") ...或类似的代码对源代码阅读器征税。

在Electron主过程脚本中,是否有办法监听postMessage函数生成的消息或脚本窗口调度的事件?这将使我能够在渲染器进程脚本中保持优美的后备状态-如果未在Electron中运行,则未处理的已发布消息也不会生成运行时错误。

到目前为止,我一直在使用 preload property of the webPreferences object being passed to BrowserWindow constructor加载以下预加载脚本,该脚本设置了我所追求的“通信桥”:

(() => {
    const electron = require("electron");
    addEventListener("message", ev => {
        switch(ev.data.type) {
            case "foobar":
                electron.ipcRenderer.send("foobar", ev.data.foobar); break;
        }
    });
})();

然后,我可以将postMessage({ type: "foobar", foobar: { foo: 1, bar: true } }, "*")作为任何渲染器进程脚本的一部分进行处理,基本上,这将导致渲染器进程将消息发送到主进程,并由预加载脚本进行上述设置。

理想情况下,尽管可能的话,我希望避免使用预加载脚本,但是就像我说的那样,我根本不想在渲染器进程脚本中使用任何Electron API。如果我可以直接在主流程中收听由渲染器脚本“窗口”发布的消息或由其分发的事件,则可以消除对预加载脚本的需求。但是我不知道是否可行,阅读文档给我的印象是我正在盘旋,或者我已经用尽了其他选择。

最佳答案

并非直接,但是您可以在浏览器窗口上预加载一个js片段,以便在渲染器进程上接收该消息,然后将其复制到ipcRenderer.send或调用

关于javascript - Electron 主流程脚本是否可以通过 `postMessage`函数监听页面发布的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62051816/

相关文章:

javascript - Jquery 事件不会在 ajax 调用后触发

javascript - Chromium 在 Electron 应用程序中永久显示滚动条?

javascript - 使用 jQuery 动画缓入

php - 文件版本控制以消除浏览器缓存问题

javascript - 在此 javascript 中随机化输出

javascript - 使用PHP和JavaScript的幻灯片放映

node.js - 如何使 SQLite 与 Angular 4+、Electron 和 NodeJS 一起工作

angular - Electron + Angular 6黑屏在生产中的应用

javascript - 如何使函数与相同的类一起工作?

javascript - 如何在函数中编写 if/else 语句来告诉我一个数字是否可以被 2 整除(在 javascript 中)