Electron窗口
窗口间传递参数
当然了, 用ipc可以解决这个问题, 有兴趣的同学可以看旁边的关于ipc的blog. 但是, ipc传一个消息, 等同于呼一个事件, 很多时候, 我们并不需要那么强的功能, 我们就是想读一个参数而已
方法一remote
//browser端
let myWindow: any = new BrowserWindow({ .....})
myWindow.custom = {
'whatever': 'youwant'
}
//某个加载到window的html
var electron = require('electron');
var currentWindow = electron.remote.getCurrentWindow();
console.log(currentWindow.custom);
方法二global
// In main.js of browser process
global.sharedObject = {};
// js in page-1.html
require('remote').getGlobal('sharedObject').someProperty = 'some value';
// js in page-2.html
console.log(require('remote').getGlobal('sharedObject').someProperty);
官方推荐的其他方法
- 在两个网页(渲染进程)间共享数据最简单的方法是使用浏览器中已经实现的 HTML5 API。 其中比较好的方案是用 Storage API, localStorage,sessionStorage 或者 IndexedDB。
- 基础的api, https://developer.mozilla.org/en-US/docs/Web/API/Storage
- local实现, https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
- session实现, https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage
- 大量数据的类db实现, https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
- https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API
- 老式的cookie也可以, 不过据说用起来比较累.
global的atom方法
// main process
win1.loadURL(`file://${__dirname}/app/app.html?id=${id}`);
// rendered process
console.log(global.location.search);
纯html方法
- 每个窗口都有window.opener
- window.postMessage, window.addEventlistener(‘message’)
-
ipc方法
参考: 2018-01-28-electron-ipc
窗口更多内容
拿到获得焦点的窗口, 在主流程中
- BrowserWindow.getFocusedWindow()
- 参考: https://electronjs.org/docs/api/browser-window
有一个bug, title不展示, 这个不科学.
- 有结论了, 如果模板html有title, 那么browserwindow.settitle就失效了.
- 官方建议是放到webcontents.did-finish-load里面处理. (但是这个解决方案形成了业务代码不必要的分散)
- 那么放到browserwindows.ready-to-show在大部分情况下也是可行的. 参见下面样例代码
- event.preventDefault()阻止自动更新title, 是zcbenz认为最正确的方法.
//once方法
win.once('ready-to-show', () => {
win.show()
//如果不是新建空白文件, 这个判断没必要, 默认初始空白文件要求存在, 但是用户理应可以修改
//if(win.sname!=blankname)
win.setTitle(win.sname) //放到这里试试. 果然成功了, 因为官方说了, 一般情况下, 这个是在did-finish-load后面的.
log(win.getTitle())
})
//下面这个是官方建议的方法, 更靠谱. 但是不能用, 因为我另存文件的时候还是要修改title的, 所以从on改成once, 但是还是不靠谱, 因为总有某些模板是没有title的, 那么就阻止了第一次保存的修改title, 而且如果这个bug发生的时候, 灰常难于调试.
win.once('page-title-updated', (e)=>{
e.preventDefault()
})
参考:
- https://github.com/electron/electron/issues/1594
- https://github.com/electron/electron/blob/master/docs/api/browser-window.md#event-page-title-updated
- 最主要的主流程接口, 最外层的接口https://electronjs.org/docs/api/app