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
不叫。
了解如何:
<webview>
应该和allowpopups
一样<webview allowpopups></webview>
在'主进程'中,应该有一个新生成的监听器
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
});
});
解释:
setWindowOpenHandler
仅适用于webContents
.webview
的webContents
应该从主进程访问。webContents
的方法,也不需要为此使用预加载脚本。app.on('web-contents-created')
可以在渲染器进程中生成新的webContents
时检测到新的webview
,而webContents
负责监视新的窗口链接(target="_blank"或window.open)。