Electron webview内_blank链接无响应,setWindowOpenHandler未被调用
问题解决:Webview内target="_blank"链接无响应的处理
问题根源
<webview>标签是独立的WebContents实例,主窗口mainWindow.webContents的setWindowOpenHandler仅对主页面自身的链接生效,无法覆盖webview内部的页面内容。
解决方案
在主进程中监听主窗口的did-attach-webview事件,获取webview对应的WebContents对象,单独为它设置窗口打开处理器。
修改main.js,添加以下代码:
mainWindow = new BrowserWindow(winOpts); // 主窗口自身的链接处理 mainWindow.webContents.setWindowOpenHandler((handler) => { return { action: "allow" }; }); // 处理webview内的链接打开请求 mainWindow.webContents.on('did-attach-webview', (event, webviewContents) => { webviewContents.setWindowOpenHandler((handler) => { // 这里可以自定义处理逻辑,比如允许打开新窗口或调用系统浏览器 return { action: "allow" }; // 如果想用系统默认浏览器打开链接,替换为以下代码: // require('electron').shell.openExternal(handler.url); // return { action: "deny" }; }); }); mainWindow.loadFile("main.html");
补充说明
did-attach-webview事件会在webview成功附加到主页面时触发,确保我们能获取到webview的WebContents实例。- 如果需要对webview的链接做更复杂的处理(比如过滤域名、自定义窗口参数),可以在
setWindowOpenHandler中根据handler.url或其他参数调整返回值。
内容的提问来源于stack exchange,提问作者klados
相关产品推荐
相关产品推荐

