Electron webview 的 setWindowOpenHandler 在打开新窗口时根本不被调用

问题描述 投票:0回答:1

My Electron (v22.3.6) 应用程序使用

<webview>
标签。

这个webview位于带有<webview>标签的

'main.html'
渲染器进程中。

'main.html'由主进程中的

mainWindow
,一个
BrowserWindow
变量加载。

代码片段:

main.html

<webview id="wv" src="inner.html"></webview>

inner.html

<a href="https://example.com/" target="_blank">New window link inside inner.html</a>

main.js

let winOpts = {
    ...
    webPreferences: {
        plugins: false,
        nodeIntegration: false,
        nodeIntegrationInWorker: false,
        webviewTag: true,
        sandbox: false, // to use some components
        enableRemoteModule: false,
        contextIsolation: true,
        disableBlinkFeatures: "Auxclick",
        webSecurity: true,
        preload: "preload.js"
    }    
};

mainWindow = new BrowserWindow(winOpts);
mainWindow.webContents.setWindowOpenHandler((handler) => {
    //NOT CALLED AT ALL
    return {
        action: "allow"
    };
});

mainWindow.loadFile("main.html");

问题:

当我单击“inner.html”中的链接时,

<a href="newsite" target="_blank">link</a>
, 什么都没发生。甚至 DevTools 中的“console”也没有显示任何内容。 “点击”行为似乎没有触发任何东西。

上图中, 单击“主链接”成功调用

setWindowOpenHandler
。 单击“内部链接”不执行任何操作。既不打开新窗口也不调用
setWindowOpenHandler
.

总而言之,“_blank”目标链接在

<webview>
中不起作用,它位于
BrowserWindow
中。
setWindowOpenHandler
不叫。

javascript reactjs webview electron chromium
1个回答
0
投票

了解如何:

  1. <webview>
    应该和
    allowpopups
    一样
    <webview allowpopups></webview>

  2. 在'主进程'中,应该有一个新生成的监听器

    webContents
    。并且,将
    setWindowOpenHandler
    附加到该侦听器函数中的
    webview
    webContents

    app.on('web-contents-created', (e, wc) => {
        // wc: webContents of <webview> is now under control
        wc.setWindowOpenHandler((handler) => {
            return {action : "deny"}; // deny or allow
        });
    });

解释:

  1. setWindowOpenHandler
    仅适用于
    webContents
    .
  2. webview
    webContents
    应该从主进程访问。
  3. 在渲染器进程中没有直接访问
    webContents
    的方法,也不需要为此使用预加载脚本。
  4. app.on('web-contents-created')
    可以在渲染器进程中生成新的
    webContents
    时检测到新的
    webview
    ,而
    webContents
    负责监视新的窗口链接(target="_blank"或window.open)。
© www.soinside.com 2019 - 2024. All rights reserved.