窗口间传递参数

当然了, 用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不展示, 这个不科学.
  1. 有结论了, 如果模板html有title, 那么browserwindow.settitle就失效了.
  2. 官方建议是放到webcontents.did-finish-load里面处理. (但是这个解决方案形成了业务代码不必要的分散)
  3. 那么放到browserwindows.ready-to-show在大部分情况下也是可行的. 参见下面样例代码
  4. 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()
})

参考:

  1. https://github.com/electron/electron/issues/1594
  2. https://github.com/electron/electron/blob/master/docs/api/browser-window.md#event-page-title-updated
  3. 最主要的主流程接口, 最外层的接口https://electronjs.org/docs/api/app