电子 - 如何知道渲染器窗口何时准备就绪

时间:2017-02-16 21:07:21

标签: electron

在我的主要过程中,我创建了一个渲染器窗口:

var mainWindow = new BrowserWindow({
    height: 600,
    width: 800,
    x: 0,
    y: 0,
    frame: false,
    resizable: true
});
mainWindow.openDevTools();
mainWindow.loadURL('file://' + __dirname + '/renderer/index.html');

然后我想以某种方式与它沟通:

mainWindow.webContents.send('message', 'hello world');

但是主窗口没有收到此消息,因为在我尝试发送消息时没有完全创建。

我通过将后一个代码包装在setTimeout()中暂时解决了这个问题,但这绝对不是解决竞争条件的正确方法。

主窗口准备就绪时是否有回调?我尝试了准备好的节目'文档中提到的事件但它没有用。

6 个答案:

答案 0 :(得分:13)

“mainWindow”上的监听器对我不起作用。我用的是“mainWindow.webContents”。

mainWindow.webContents.once('dom-ready', () => {});

答案 1 :(得分:3)

查看Electron browser-window documentation中提到的did-finish-load事件。

mainWindow.once('did-finish-load', () => {
   // Send Message
})

似乎还有dom-ready event

答案 2 :(得分:2)

检查以下内容:https://github.com/electron/electron/blob/master/docs/api/web-contents.md

您可以使用此事件来知道main.js中的窗口是否已准备好[案例1],但是如果想知道页面何时完全加载,则应在index.html中添加一个事件[案例2]然后可以附加一个函数,该函数使用IPCrenderer和IPCmain向父代Main.js发送一条消息,告知他已经准备好

案例1

main.js:

mainWindows.webContents.on('did-finish-load',WindowsReady);

function WindowsReady() {
    console.log('Ready');
}

案例2

html:

<script>
const {ipcRenderer} = require('electron');
document.addEventListener('DOMContentLoaded',pageLoaded);

 function pageLoaded(){
     alert('The page is loade');
     ipcRenderer.send('Am_I_Ready',"Im ready");
 }
</script>

Main.js:

const {ipcMain} = electron;

ipcMain.on('Am_I_Ready', doSomething)

function doSomething(){
  console.log('Everything is ready.');
}

答案 3 :(得分:1)

在先前的答案中未提及,loadURL返回一个承诺,该承诺在触发“ did-finish-load”事件的同时进行解析;也就是说,它们本质上是等效的,除了一个是一个承诺,另一个是一个回调。

答案 4 :(得分:1)

像这样使用mainWindow.webContents:

mainWindow.webContents.on('did-finish-load', () => {
  mainWindow.webContents.send('message', 'hello world');
}

答案 5 :(得分:0)

这几天,您使用“准备展示”事件。

https://electronjs.org/docs/api/browser-window#using-ready-to-show-event