【问题标题】:window.opener not set after a gui.Window.open()在 gui.Window.open() 之后未设置 window.opener
【发布时间】:2014-05-28 05:01:17
【问题描述】:

我目前正在使用 node-webkit 构建一个应用程序,但在打开新窗口时遇到了一些问题。

我的应用中发生的基本上是:

  • 打开 splash.html(启动画面)

    • 使用 gui.Window.open() 打开主应用程序 (main.html) 但将其隐藏
    • 在 'loaded' 事件中,关闭第一个窗口 ( splash.html ) 并显示 main.html
  • 在应用程序中,我可以撰写一封电子邮件,创建一个新窗口 (composer.html)

    • 用户点击撰写按钮 -> 使用 gui.Window.open() 打开撰写器
  • 撰写窗口的逻辑依赖于主窗口,通过 window.opener 访问主窗口

这在使用常规浏览器时非常有效,但是当我将它捆绑在 node-webkit 中时,window.opener 大多是未定义的。我说主要是因为有时(~10%)开瓶器是在撰写窗口中设置的。 我试图找出问题所在,但在这个主题上搜索并没有真正帮助我。

我尝试过的事情:

  • 在打开窗口后将窗口打开器设置为当前窗口 => 失败
  • 下到第一个打开的窗口(在 package.json 中定义的那个)调用 open() => 失败

如果有人对如何解决此问题有任何提示,将不胜感激。如果需要,我很乐意提供更多详细信息。

[编辑]

这里是相关代码:

第一个窗口(闪屏),由 package.json 打开

<html>
  <script>
  var gui = require('nw.gui');
  var config = require('./config.json');
  gui.App.clearCache();
  var nwWin = gui.Window

  var appWin = nwWin.open(config.url, {
    title : 'MyApp',
    show : false,
    toolbar : false,
    frame : false,
    icon : 'favicon.png',
    width : 1000,
    height : 600,
    min_width : 1000,
    min_height : 400,
    position : 'center'
  });

  appWin.on('loaded', function () {
    appWin.show();
    appWin.focus();
    appWin.setAlwaysOnTop(true);
    appWin.setAlwaysOnTop(false);
    nwWin.get().close();
  })
  </script>

  <body>
    <img src="logo.png" />
  </body>

</html>

应用程序中有很多东西,但这里是打开电子邮件编写器的代码:

NWDesktop.prototype.openAppWindow = function (type, url, title) {
    var appWin = nwWin.open(url, {
      position: 'center',
      toolbar: false,
      frame: true,
      title: title,
      icon: 'favicon.png'
    });
  };

在打开的窗口中,window.opener 大多是 = undefined。

【问题讨论】:

  • 你能分享你的代码吗?一个简单的实验显示 window.opener 对我来说工作正常。如果您可以提供在浏览器中运行但在 node-webkit 中无法运行的代码,我可能会提供帮助,否则会非常棘手。
  • 已添加代码,如果您需要更多代码,请告诉我。在一个基本测试中,我还定义了 window.opener,因为它有时会发生在我的代码中,我怀疑某种竞争条件或其他东西,但现在无法弄清楚。
  • 抱歉,我没有看到问题所在。你能发布一个显示问题的完整测试用例吗?
  • 我认为原因是你关闭了开启窗口然后你要求它。

标签: javascript node-webkit


【解决方案1】:

你需要改变一点:

首先出现在您的初始屏幕中:

appWin.on('loaded', function () {
    appWin.show();
    appWin.focus();
    appWin.setAlwaysOnTop(true);
    appWin.setAlwaysOnTop(false);

    nwWin.get().hide();

  })

现在,window.opener 不是 null 或 undefined,您可以在任何地方制作。

我做的其他事情是监听 appWin windows 事件,所以当用户关闭 windows 时杀死 nw 的主进程。

像这样:

appWin.on('close',function(){
            console.log('CLOSE');
            gui.App.quit();
        });

希望对您有所帮助。

【讨论】:

  • 我有一个类似的问题,这并不能解决它。在我的例子中,gui.Window.open() 的结果是undefined,即使创建了窗口。
猜你喜欢
  • 2013-01-16
  • 2017-06-27
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多