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"
    }
}
相关推荐
0思必得011 小时前
[Web自动化] HTML5常见新增标签
前端·python·自动化·html5·web自动化
Alair‎11 小时前
103React数据处理
开发语言·前端·javascript
黛色正浓11 小时前
【React18+TypeScript】React 18 for Beginners
javascript·react.js·typescript
Zhi.C.Yue11 小时前
React 状态更新中的双缓冲机制、优先级调度
前端·javascript·react.js
nnnnna11 小时前
插槽(Slots)(完整详细版)
前端·vue.js
游戏开发爱好者811 小时前
H5 混合应用加密 Web 资源暴露到 IPA 层防护的完整技术方案
android·前端·ios·小程序·uni-app·iphone·webview
hayzone11 小时前
pnpm 你用了吗?
前端
hellsing11 小时前
UniPush 2.0 实战指南:工单提醒与多厂商通道配置
前端·javascript
快手技术11 小时前
入围AA总榜Top 10,Non-Reasoning Model榜单第一!KAT-Coder-Pro V1 新版本踏浪归来!
前端·后端·前端框架
wangpq11 小时前
记录曾经打开半屏小程序遇到的事
前端·微信小程序