选择应允许从electron应用程序的webview中打开哪些弹出窗口

选择应允许从electron应用程序的webview中打开哪些弹出窗口,electron,Electron,我并没有使用allowpopups属性来允许在electron应用程序中从webview打开弹出窗口,而是根据具体情况处理“新窗口” 这是我的事件处理程序 content.addEventListener('new-window', function (e) { var url = e.url; var hostname = (new URL(url)).hostname.toLowerCase(); if (hostname.indexOf('dropbox.com') !==

我并没有使用allowpopups属性来允许在electron应用程序中从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();
  }  
});
正如您所看到的,触发此处理程序的事件是否具有dropbox的url,例如,我希望electron允许按预期打开该窗口

如果不是这样,我应该在electron应用程序中打开该url

。。。但这不起作用,当使用dropbox url时,我什么也得不到。关于我做错了什么有什么建议吗

谢谢

您应该将活动挂接到浏览器窗口的网络内容上:

您应该在BrowserWindow WebContent上挂起事件:


多亏了蒂姆,我终于找到了解决这个问题的办法

若我们试图阻止打开新窗口或允许它们打开,“新窗口”对我们来说并没有用处,若我们试图在渲染过程中处理它。若我们试图在渲染器进程中处理该事件,那个么无论我们在该处理程序中做什么,弹出窗口/窗口都将打开

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

allowpopups显然首先允许弹出窗口,而webpreferences=nativeWindowOpen=true使用本机Chromium window.open,另外一个好处是窗口打开和新窗口事件是按顺序发生的,而不是异步发生的

webview的代码应如下所示:

<webview src="page.html" webpreferences="nativeWindowOpen=true" allowpopups></webview>
我在Tim的帮助下,通过阅读这里关于pull请求的评论,成功地解决了这个问题


希望这对某人有所帮助。

多亏了蒂姆,我才找到了解决这个问题的办法

若我们试图阻止打开新窗口或允许它们打开,“新窗口”对我们来说并没有用处,若我们试图在渲染过程中处理它。若我们试图在渲染器进程中处理该事件,那个么无论我们在该处理程序中做什么,弹出窗口/窗口都将打开

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

allowpopups显然首先允许弹出窗口,而webpreferences=nativeWindowOpen=true使用本机Chromium window.open,另外一个好处是窗口打开和新窗口事件是按顺序发生的,而不是异步发生的

webview的代码应如下所示:

<webview src="page.html" webpreferences="nativeWindowOpen=true" allowpopups></webview>
我在Tim的帮助下,通过阅读这里关于pull请求的评论,成功地解决了这个问题


希望这对某人有所帮助。

你好,蒂姆。感谢您的帮助,但我的代码中的内容是对webview的引用,它支持“新建窗口”事件。我正在编写的客户机应用程序加载到该webview中,因此执行了我的代码get。然而,如果我使用您提供的代码,并将某些内容记录到控制台,它会被记录,但窗口仍然没有打开。啊,您的问题还不清楚!是否使用该属性标记web视图?如果希望webview能够打开windows,则需要此选项。对不起,我不太清楚。如果我添加allowpopups,那么我不能有选择地打开弹出窗口,弹出窗口总是打开的。要明确的是,我想实现的是允许google drive&dropbox打开弹出窗口,所有其他外部链接都应该在浏览器中打开。所以你不能在新窗口事件中使用allowpopups?有记录吗?我的理解是,如果没有AllowPopus,window.open根本无法工作。文件说,如果启用,来宾页面将被允许打开新窗口。所以我假设如果关闭,来宾页面将不允许打开新窗口…Tim,谢谢。我终于找到了解决方案,它如预期的那样工作,我将为未来的读者添加答案Hello Tim。感谢您的帮助,但我的代码中的内容是对webview的引用,它支持“新建窗口”事件。我正在编写的客户机应用程序加载到该webview中,因此执行了我的代码get。然而,如果我使用您提供的代码,并将某些内容记录到控制台,它会被记录,但窗口仍然没有打开。啊,您的问题还不清楚!是否使用该属性标记web视图?如果希望webview能够打开windows,则需要此选项。对不起,我不太清楚。如果我添加allowpopups,那么我不能有选择地打开弹出窗口,弹出窗口总是打开的。要明确的是,我想实现的是允许google drive&dropbox打开弹出窗口,所有其他外部链接都应该在浏览器中打开。所以你不能在新窗口事件中使用allowpopups?有记录吗?我的理解是,如果没有AllowPopus,window.open根本无法工作。文件说,如果启用,来宾页面将被允许打开新窗口。所以我假设如果关闭,来宾页面将不允许打开新窗口…Tim,谢谢。我终于找到了解决办法,它成功了 正如预期的那样,我将为未来的读者添加答案
app.on('web-contents-created', function (webContentsCreatedEvent, contents) {
  if (contents.getType() === 'webview') {
    contents.on('new-window', function (newWindowEvent, url) {
      console.log('block');
      newWindowEvent.preventDefault();
    });
  }
});