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"
    }
}
相关推荐
时间不说谎2 小时前
linux上编译electron源码
electron
国服第二切图仔2 小时前
Electron for 鸿蒙PC实战案例Gitcode口袋工具之HTTP请求封装的技术实现与设计解析
http·electron·gitcode
Amos_Web2 小时前
Rust实战(四):数据持久化、告警配置与Web API —— 构建监控系统的功能闭环
前端·后端·rust
java水泥工2 小时前
基于Echarts+HTML5可视化数据大屏展示-物流大数据展示
大数据·前端·echarts·html5·可视化大屏
U***e632 小时前
Vue自然语言
前端·javascript·vue.js
用户761736354012 小时前
浏览器渲染原理
前端·浏览器
拉不动的猪2 小时前
Vue 跨组件通信底层:provide/inject 原理与实战指南
前端·javascript·面试
得物技术2 小时前
从数字到版面:得物数据产品里数字格式化的那些事
前端·数据结构·数据分析
用户6600676685392 小时前
用 Symbol 解决多人协作中的对象属性冲突实战
前端·javascript