
iframe显示
使用iframe的需要注意,因为有的网站并不支持在iframe中打开,所以这种方式并不是很推荐!
但是它的原理是什么样的呢?
就是每当新创建一个标签页的时候,就在页面中生成一个iframe标签,并加载url,当激活某个tab的时候,就让这个tab对应的iframe显示,其他iframe隐藏,如果关闭了这个tab,就从页面中移除这个tab。
webview标签
还有一种就是使用webview标签,这是electron带的,electron22之前其实使用webview的new-window事件就可以了,但是22版本之后就把这个取消了,还让我研究了好久.......
然后就是曲线救国的办法:
1、WebView 尝试打开新窗口时,主进程拦截该请求。
2、主进程通过 IPC 发送消息到渲染进程。
3、渲染进程接收消息并派发自定义事件(new-window)。
4、渲染进程可以根据需要处理此事件,如显示模态框或更新界面等。
注意:
webview中的一个属性allowpopups记得设置(允许打开新弹窗),一定要写这种形式,写成.allowpopups = 'on'的形式不生效!!!大坑

main.js文件中
console.log是为了方便调试,可以删除

mainWindow.webContents.on('did-attach-webview', ...):
这个事件在 WebView 被附加到主窗口时触发。
event 是事件对象,wc 是新创建的 WebView 的 WebContents 对象。
wc.setWindowOpenHandler((details) => {...}):
通过设置窗口打开处理程序,当 WebView 中尝试打开新窗口(例如,点击链接)时会触发这个处理函数。
details 包含有关要打开的新窗口的信息,例如 URL 和其他相关参数。
mainWindow.webContents.send('webview-new-window', wc.id, details):
此行将一个名为 'webview-new-window' 的消息发送到主窗口的 WebContents。
这个消息包含了当前 WebView 的 id 和打开新窗口的 details。
return { action: 'deny' }:
最后,处理程序返回 { action: 'deny' },表示拒绝打开新窗口。这意味着不会创建新窗口,而是通过 IPC 将消息传递给渲染进程。
preload.js文件中

const { ipcRenderer } = require('electron'):
导入 Electron 的 ipcRenderer 模块,用于在渲染进程与主进程之间进行异步通信。
ipcRenderer.on('webview-new-window', (e, webContentsId, details) => {...}):
监听 'webview-new-window' 消息。当主进程发送此消息时,会触发回调函数。
e 是事件对象,webContentsId 是 WebView 的 ID,details 是打开新窗口的详细信息。
console.log('webview-new-window', webContentsId, details):
在控制台输出收到的消息信息,便于调试。
document.getElementById('webview').dispatchEvent(new Event('new-window')):
创建并派发一个名为 'new-window' 的事件,通知与 WebView 相关的 DOM 元素发生了新窗口请求。
renderer.js文件中

webview.addEventListener('new-window', (e) => { () => {...}):
为 WebView 元素添加一个事件监听器,用于监听 'new-window' 事件。
当 'new-window' 事件被派发时,执行回调函数。
console.log('new-window----', e)
在控制台输出一条信息,表明新窗口事件已被捕获。里面包含了新窗口的信息和url
addNewTab就是添加新标签页的方法
最终的效果:

我的electron版本:
{
"name": "pakeplus-win7",
"version": "1.0.0",
"description": "跨平台桌面应用,支持 Windows 7",
"main": "main.js",
"scripts": {
"start": "electron .",
"build": "electron-builder",
"build:win": "electron-builder --win",
"build:win32": "electron-builder --win --ia32",
"build:win64": "electron-builder --win --x64",
"build:mac": "electron-builder --mac",
"build:linux": "electron-builder --linux"
},
"keywords": [
"electron",
"desktop",
"cross-platform"
],
"author": "",
"license": "MIT",
"devDependencies": {
"electron": "^22.3.27",
"electron-builder": "^24.9.1"
},
"build": {
"appId": "com.pakeplus.win7",
"productName": "PakePlus-Win7",
"directories": {
"output": "dist"
},
"files": [
"main.js",
"preload.js",
"config.js",
"package.json"
],
"win": {
"target": [
{
"target": "nsis",
"arch": [
"ia32",
"x64"
]
},
{
"target": "portable",
"arch": [
"ia32",
"x64"
]
}
],
"icon": "build/icon.ico"
},
"mac": {
"target": "dmg",
"icon": "build/icon.icns"
},
"linux": {
"target": [
"AppImage",
"deb"
],
"icon": "build/icon.png"
},
"nsis": {
"oneClick": false,
"allowToChangeInstallationDirectory": true,
"createDesktopShortcut": true,
"createStartMenuShortcut": true
}
},
"dependencies": {
"electron-tabs": "^1.0.4"
}
}