Electron实现多tab页案例,BrowserView/iframe/webview不同方式的区别

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"
    }
}
相关推荐
Predestination王瀞潞17 小时前
2.4 编码->W3C XML 1.0标准(W3C Recommendation):XML(Extensible Markup Language)
xml·前端
紫_龙17 小时前
最新版vue3+TypeScript开发入门到实战教程之DOM操作
javascript·vue.js·typescript
SuperEugene17 小时前
JS/TS 编码规范实战:Vue 场景变量 / 函数 / 类型标注避坑|编码语法规范篇
开发语言·javascript·vue.js
FlyWIHTSKY17 小时前
vue3中const的使用和定义
前端·javascript·vue.js
Chengbei1117 小时前
Chrome浏览器渗透利器支持原生扫描!JS 端点 + 敏感目录 + 原型污染自动化检测|VulnRadar
javascript·chrome·安全·web安全·网络安全·自动化·系统安全
小璐资源网17 小时前
如何写出干净、易维护的 HTML 结构
前端·html
gongzemin17 小时前
怎么在VS Code 调试vue3 源码
前端·vue.js
C澒17 小时前
微前端容器标准化 —— 公共能力篇:CDN 能力
前端·架构
wulijuan88866618 小时前
ECharts图表性能优化的那些事
前端·javascript·echarts
❀͜͡傀儡师19 小时前
通过npm 手动安装、Docker 部署 OpenClaw小龙虾
前端·docker·npm