当 nativeWindowOpen 在父窗口中为真时,electron.js 中 webview 中基于 target=_blank 的链接未打开

Posted

技术标签:

【中文标题】当 nativeWindowOpen 在父窗口中为真时,electron.js 中 webview 中基于 target=_blank 的链接未打开【英文标题】:target=_blank based link in webview in electron.js are not opening when nativeWindowOpen is true in parent window 【发布时间】:2021-11-11 07:49:42 【问题描述】:

我有一个简单的electron.js 应用程序,electron-quick-start 我在其中使用<webview>

默认情况下,设置了target=_blank 的链接不会在webview 内打开。

通过收听在Can't open Electron webview links with target = blank 给出的new-window 事件有一些解决方法

但是当nativeWindowOpen: true in webPreferences 在父窗口中时,此解决方法不起作用。当我在MacOS 上添加allowpopups 并出现错误exited with signal SIGSEGV 时,应用程序会崩溃

const mainWindow = new BrowserWindow(
    width: 800,
    height: 600,
    webPreferences: 
      preload: path.join(__dirname, 'preload.js'),
      webviewTag: true,
      nativeWindowOpen: true // This flag is not letting recieve new-window event from webview
    
  )

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    <webview id="foo" src="https://www.w3schools.com/tags/att_a_target.asp" style="display:inline-flex; width:640px; height:480px" allowpopups></webview>

    <h1>click on Try it yuorself button in webview</h1>

    <!-- You can also require other files to run in this process -->
    <!-- <script src="./renderer.js"></script> -->
  </body>
</html>

我怎样才能在 target=_blank 工作的地方获得 webview 链接,而 nativeWindowOpen: true 保持在父窗口中?

根据Planned Breaking API Changes (15.0),nativeWindowOpen将默认设置为true

【问题讨论】:

不需要在webview标签webpreferences="nativeWindowOpen=yes" allowpopups上设置nativeWindowOpentrue吗? 我尝试添加webpreferences="nativeWindowOpen=yes",但仍然没有接到new-window事件的调用。添加allowpopups 也会使我的电子应用程序崩溃。 为什么allowpopups 会导致您的应用崩溃?粘贴您用来拦截新窗口的代码?没看到 关于***.com/questions/48914542 的进一步请求,我没有时间构建测试代码,但也许您可以在文档electronjs.org/docs/api/window-open 中查看:“自定义或取消创建窗口,您可以选择在主进程中使用 webContents.setWindowOpenHandler() 设置覆盖处理程序。返回 false 会取消窗口,而返回一个对象会设置创建窗口时使用的 BrowserWindowConstructorOptions ....." @pushkin:我已经添加了index.html 的代码,或者您也可以尝试在我的代码中设置nativeWindowOpen: trueallowpopups,就像在我的index.html 中一样,然后尝试单击具有target=_blank。在我的 MacOS 上它崩溃了 【参考方案1】:

我试过用 Electron fiddle 写一个要点。也许我没有发现你的问题,但对我来说它正在工作 https://gist.github.com/deb6ed0fa37860fdfc0d51c6782f4152

【讨论】:

我已经添加了我的index.html 代码。您也可以尝试在我的代码中设置nativeWindowOpen: true,在我的index.html 中设置allowpopups,然后尝试单击具有target=_blank 的链接。在我的 MacOS 上它崩溃了【参考方案2】:

这是一个错误 https://github.com/electron/electron/pull/29874 已修复。

electron 12.0.14 或更高版本可以很好地解决这个问题。

【讨论】:

以上是关于当 nativeWindowOpen 在父窗口中为真时,electron.js 中 webview 中基于 target=_blank 的链接未打开的主要内容,如果未能解决你的问题,请参考以下文章

从子组件传递时,FormData 在父组件中为空

在父类中为多个孩子定义方法

sh 在父文件夹中为每个仓库提取最新信息

IE9 - 下载文件的信息栏出现在父窗口上;不是最新的

C++ 虚拟方法:我必须在父类中为子级和父级不共享的每个方法创建一个虚拟方法吗?

如何在父窗口中运行子窗口