【问题标题】:Choose which popups should be allowed from webview in electron app从电子应用程序的 webview 中选择应允许哪些弹出窗口
【发布时间】:2018-06-26 04:07:44
【问题描述】:

我没有使用 allowpopups 属性来允许从电子应用程序中的 webview 打开弹出窗口,而是根据具体情况处理“新窗口”。

这是我的事件处理程序

content.addEventListener('new-window', function (e) {
  var url = e.url;
  var hostname = (new URL(url)).hostname.toLowerCase();

  if (hostname.indexOf('dropbox.com') !== -1 && url.indexOf('chooser') !== -1) {
    // this should open window but it doesnt
    return true;

  } else {
    content.loadURL(url);
    e.preventDefault();
  }  
});

如您所见,触发此处理程序的事件是否具有保管箱的 url(例如)我希望电子允许按预期打开该窗口。

如果不是这样,我应该在电子应用程序中打开该网址。

... 但这不起作用,当使用保管箱 url 时,我什么也得不到。关于我做错了什么的任何建议?

谢谢

【问题讨论】:

    标签: electron


    【解决方案1】:

    感谢蒂姆,我设法找到了解决这个问题的方法。

    如果我们试图阻止打开新窗口或允许它们打开,如果我们试图在渲染器进程中处理它,'new-window' 对我们没有用处。如果我们尝试在渲染器进程中处理该事件,无论我们在该偶数处理程序中做什么,弹出窗口/窗口都会打开。

    解决方案是在主进程中处理该事件,但在此之前,我们需要将allowpopupswebpreferences="nativeWindowOpen=true" 添加到我们的webview 中。

    allowpopups 显然首先允许弹出窗口,webpreferences="nativeWindowOpen=true" 使用原生 Chromium window.open,另外还有一个好处是窗口打开和new-window 事件按顺序发生,而不是异步发生。

    webview 的代码应如下所示:

    <webview src="page.html" webpreferences="nativeWindowOpen=true" allowpopups></webview>
    

    之后在主进程(通常是main.js)中,我们可以处理我们想要在电子弹出窗口中打开的内容以及不允许打开的内容。首先,我们必须正确处理 webview,然后我们才能处理 new-window 事件:

    app.on('web-contents-created', function (webContentsCreatedEvent, contents) {
      if (contents.getType() === 'webview') {
        contents.on('new-window', function (newWindowEvent, url) {
          console.log('block');
          newWindowEvent.preventDefault();
        });
      }
    });
    

    在 Tim 的帮助下,我设法通过在此处https://github.com/electron/electron/pull/9568#issuecomment-306339926 阅读 cmet

    希望这对某人有所帮助。

    【讨论】:

    【解决方案2】:

    您应该在您的BrowserWindow webContents 上挂钩new-window 事件:

    myBrowserWindow.webContents.on('new-window', (event, url) => {
      var hostname = (new URL(url)).hostname.toLowerCase();
    
      if (hostname.indexOf('dropbox.com') !== -1 && url.indexOf('chooser') !== -1) {
        // this should allow open window
      } else {
    
        event.preventDefault();
      } 
    })
    

    【讨论】:

    • 你好,蒂姆。感谢您的帮助,但是我的代码中的 content 是对 webview 的引用,它支持“new-window”事件。我正在编写的客户端应用程序加载在该 webview 中,因此我的代码得到执行。但是,如果我使用您提供的代码并将某些内容记录到控制台,它会被记录但窗口仍然没有打开。
    • 啊,从你的问题中看不清楚!您是否使用allowpopups 属性标记您的网络视图?如果您希望 webview 能够打开窗口,则它是必需的。 github.com/electron/electron/pull/2868
    • 抱歉不清楚,我的错。如果我添加 allowpopups,那么我不能有选择地打开弹出窗口,弹出窗口总是打开的。要明确我想要完成的是允许谷歌驱动器和保管箱打开弹出窗口,并且所有其他外部链接都应该在浏览器中打开。
    • 所以您不能将allowpopupsnew-window 事件一起使用?这在任何地方都有记录吗?我的理解是,没有allowpopupswindow.open 根本无法工作。文档说"If "on", the guest page will be allowed to open new windows.",所以我假设如果它关闭,访客页面将不允许打开新窗口...
    • 蒂姆,谢谢。我终于找到了解决方案,它按预期工作,我会为未来的读者添加答案
    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多