Node.js Electron window.opener完全支持浏览器中的功能

Node.js Electron window.opener完全支持浏览器中的功能,node.js,shared-memory,electron,Node.js,Shared Memory,Electron,我正在处理一个基于多窗口桌面的应用程序,我需要与应用程序的其他窗口共享主应用程序进程中的对象实例。目前在浏览器(Chrome 52.0.2743.116)中,您可以参考window.opener来实现这一点。在浏览器中,window.opener(在子窗口中)将为您提供调用window.opent(myURL)的窗口对象的实例 例如,如果在window.myData={}中设置;(主窗口)相同的myData实例将在(子窗口)中可用,并将通过(window.opener.myData)访问 在El

我正在处理一个基于多窗口桌面的应用程序,我需要与应用程序的其他窗口共享主应用程序进程中的对象实例。目前在浏览器(Chrome 52.0.2743.116)中,您可以参考window.opener来实现这一点。在浏览器中,window.opener(在子窗口中)将为您提供调用window.opent(myURL)的窗口对象的实例

例如,如果在
window.myData={}中设置;(主窗口)
相同的
myData
实例将在(子窗口)中可用,并将通过(
window.opener.myData
)访问

在Electron中,当我通过
(window.opent(myURL))
window.opener被BrowserWindowProxy(Electron API)替换,它不公开调用
(window.open(myURL))
的窗口(窗口对象实例)。在Electron中有没有一种方法可以像在浏览器中一样访问window.opener


使用remote.sharedObject(Electron API)不是一个选项,因为它只序列化/反序列化数据,可以用于将数据从一个窗口传递给其他窗口,但不允许跨窗口访问相同的对象实例。

我认为您对
remote
API的看法不正确。从:

远程模块返回的每个对象(包括函数)表示主进程中的一个对象(我们称之为远程对象或远程函数)

试试这个:

'use strict'
let Electron = require('electron')
let mainWindow = null

class myObj {
  constructor(d) {
    console.log('constructor ' + d)
    this.d = d
  }

  get data() {
    console.log('get ' + this.d)
    return this.d
  }

  set data(d) {
    this.d = d
    console.log('set ' + this.d)
  }
}

global.someObj = new myObj(1)

Electron.app.on('ready', () => {
  mainWindow = new Electron.BrowserWindow()
  mainWindow.loadURL(`file://${__dirname}/index.html`)
  mainWindow.webContents.openDevTools()
  mainWindow.on('closed', () => {
    mainWindow = null
  })
})
Electron.app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    Electron.app.quit()
  }
})


让obj=require('electron').remote.getGlobal('someObj'))
控制台日志(obj)
控制台日志(对象数据)
obj.data=2
控制台日志(对象数据)

以更正window.opener,并使用facebook(和其他)登录

您需要使用
webPreferences.nativeWindowOpen=true
,并为主窗口和打开的窗口设置相同的
webPreferences.affinity
(钩住
mainWindow.webContents.on('new-window')

Tnx先生,你写的东西听起来很合理:)会测试它并给你反馈。
<!DOCTYPE html>
<html>
  <head>
    <script>
      let obj = require('electron').remote.getGlobal('someObj')
      console.log(obj)
      console.log(obj.data)
      obj.data = 2
      console.log(obj.data)
    </script>
  </head>
  <body></body>
</html>