У меня есть приложение Electron, которое отображает HTML-файл с содержимым в соответствии с:

<html>
  <head>
    <script>
      var myfunc = function() {
        var data = "Some stuff to display in another window.";
        var secondWindow = window.open();
        secondWindow.document.write(data);
      };
    </script>
  </head>
  <body>
    <button onclick="myfunc();">Open Second Window</button>
  </body>
</html>

Теперь это работает в моем обычном браузере (Firefox), но в приложении Electron, когда я JSON.stringify(secondWindow); получаю {'closed': false}, а не фактический дескриптор окна (хотя открывается пустое окно).

Может ли кто-нибудь пролить дополнительный свет на это поведение и, возможно, способ достичь желаемого результата с помощью Electron?

Электронное приложение:

const {app, BrowserWindow} = require("electron");
const path = require("path");
const url = require("url");

let win

function createWindow () {
  win = new BrowserWindow({width: 800, height: 600})
  win.loadURL(url.format({
    pathname: path.join(__dirname, 'index.html'),
    protocol: 'file:',
    slashes: true
  }))
  win.webContents.openDevTools({"detach": true})
  win.on('closed', () => {
    win = null
  })
}

app.on('ready', createWindow)

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  if (win === null) {
    createWindow()
  }
})
0
FatalKeystroke 29 Май 2017 в 07:25

2 ответа

Лучший ответ

Вы должны создать BrowserWindow и вызвать метод loadURL

// In the main process.
const {BrowserWindow} = require('electron')

// Or use `remote` from the renderer process.
// const {BrowserWindow} = require('electron').remote

let win = new BrowserWindow({width: 800, height: 600})
win.on('closed', () => {
  win = null
})

// Load a remote URL
win.loadURL('https://github.com')

// Or load a local HTML file
win.loadURL(`file://${__dirname}/app/index.html`)

< Сильный > UPDATE Пожалуйста, обработайте событие click на главном контроллере:

var remote = require('electron').remote;
$(document).on('click', '#btn', function() {
    // Hide current window
    var currWindow = remote.getCurrentWindow();
    currWindow.hide();
});

Обработайте событие скрытия главного окна, чтобы убедиться, что главное окно закрыто

win.on('hide', function(e) {
    showNewWindow();
});


var showNewWindow = function() {
    newWindow = new BrowserWindow(windowOption);
    newWindow .loadURL(`file://${__dirname}/app/new.html`)
}
1
Toan Tran 29 Май 2017 в 06:25

Это работает по-другому. Все экземпляры окон вашего браузера управляются вашим основным процессом, вам нужно создать новый экземпляр окна в вашем основном процессе и установить его поверх текущего окна, или вы можете перезагрузить URL в текущем главном окне. Если эта необходимость возникает из-за логики в процессе рендеринга, вам необходимо уведомить ваш основной процесс (через ipcRenderer.send), чтобы выполнить какое-то действие в основном процессе с определенной дескриптором окна браузера. В вашем текущем коде вы просто создаете одно окно браузера, когда вы вызываете window.open в процессе визуализации, этот новый экземпляр отсоединяется от основного процесса и не может контролироваться.

0
Anatoly Strashkevich 29 Май 2017 в 06:05