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"
    }
}
相关推荐
moshuying1 天前
别让AI焦虑,偷走你本该有的底气
前端·人工智能
GIS之路1 天前
ArcPy,一个基于 Python 的 GIS 开发库简介
前端
可夫小子1 天前
OpenClaw基础-为什么会有两个端口
前端
喝拿铁写前端1 天前
Dify 构建 FE 工作流:前端团队可复用 AI 工作流实战
前端·人工智能
喝咖啡的女孩1 天前
React 合成事件系统
前端
从文处安1 天前
「九九八十一难」组合式函数到底有什么用?
前端·vue.js
前端Hardy1 天前
面试官:JS数组的常用方法有哪些?这篇总结让你面试稳了!
javascript·面试
用户5962585736061 天前
戴上AI眼镜逛花市——感受不一样的体验
前端
yuki_uix1 天前
Props、Context、EventBus、状态管理:组件通信方案选择指南
前端·javascript·react.js
老板我改不动了1 天前
前端面试复习指南【代码演示多多版】之——HTML
前端