Electron学习笔记(二)

一. remote模块

有时候,我们需要在渲染的窗口中打开新的窗口,也就需要在渲染进程中使用主进程中的方法.

当我们知道了Electron有主进程和渲染进程后,我们还要知道一件事,就是Electron的API方法和模块也是分为可以在主进程和渲染进程中使用。那如果我们想在渲染进程中使用主进程中的模块方法时,可以使用Electron Remote解决在渲染和主进程间的通讯。

        const btn = this.document.querySelector('#btn01')
const BrowserWindow =require('electron').remote.BrowserWindow//用remote添加一个类对象

window.onload = function(){
   btn.onclick = ()=>{

        newWin = new BrowserWindow({ //实例化这个类对象,就是新窗口了!
            width:500,
            height:500,
            //这里就不用启动node了
        })
        newWin.loadFile('yellow.html')
        newWin.on('close',()=>{win=null})

    }
}

      

上述代码我们执行会新建一个窗口,并渲染yellow.html页面.

注意: 我们在渲染进程中引入了主进程API,这是需要node支持的!!!!!!所以,main.js中相关的设置:webPreferences:{ nodeIntegration:true} 不可省略!!!

v2-4cf104d469c32e10856927f5bfa360c5_b.jpg

二. 菜单的创建和使用

1.菜单是需要模板的,我们需要新建一个对应的js文件

v2-57296349782b252815c3cb0cbb82cc2f_b.png

2.接下来,要使用menu,我们应该引入Menu组件

        const Menu= require('electron').Menu

      

3.创建一个menu的模板

这个模板其实是一个数组,每个元素都是一个menu对象 每个对象都有label submenu等属性

submenu也是一个menu对象的集合,同时有click属性,可以传入方法对应的处理方法

v2-dc83ee6b17364e35997109b8f0f5773d_b.jpg
        var template = [
    {
        label: '菜单1',
        submenu: [
            {
                label: '菜单1子项1:yellow',
                click: () => {
                    var winForM1S1 = new BrowserWindow({
                        width: 300,
                        height: 300,
                        webPreferences: { nodeIntegration: true }
                    }
                    )
                    winForM1S1.loadFile('yellow.html')
                    winForM1S1.on('closed', () => {
                        winForM1S1 = null
                    })
                }
            },
            { label: '菜单1子项2' },
            {
                label: '菜单1子项3',
                submenu: [
                    { label: '菜单1子项3子子项1' },
                    { label: '菜单1子项3子子项2' },
                    { label: '菜单1子项3子子项3' }
                ]
            }
        ]
    },
    {
        label: '菜单2',
        submenu: [
            { label: '菜单2子项1' },
            { label: '菜单2子项2' },
            { label: '菜单2子项3' },
            { label: '菜单2子项4' }
        ]
    },
]

      

4. 设计完模板后,我们用Menu类的buildFromTemplate构造方法构造一个目录

        var m = Menu.buildFromTemplate(template)

      

5.再把这个实例好的目录传给目录

        Menu.setApplicationMenu(m)

      

6. 最后,在main.js中适合位置引入就可以了

        require('./main/menu.js')

      

例:

main.js

        var electron = require('electron')

var app = electron.app

var BrowserWindow = electron.BrowserWindow;

var mainWindow = null;
app.on('ready', () => {
    mainWindow = new BrowserWindow({
        width: 500,
        height: 500,
        webPreferences: { nodeIntegration: true }//启用node功能
    })
    require('./main/menu.js')

    mainWindow.loadFile('index.html')

    mainWindow.on('closed', () => {
        mainWindow = null
    })

})

      

menu.js

        const { Menu , BrowserWindow} = require('electron')
var template = [
    {
        label: '菜单1',
        submenu: [
            {
                label: '菜单1子项1:yellow',
                accelerator:'ctrl+n',
                click: () => {
                    var winForM1S1 = new BrowserWindow({
                        width: 300,
                        height: 300,
                        webPreferences: { nodeIntegration: true }
                    }
                    )
                    winForM1S1.loadFile('yellow.html')
                    winForM1S1.on('closed', () => {
                        winForM1S1 = null
                    })
                }
            },
            { label: '菜单1子项2' },
            {
                label: '菜单1子项3',
                submenu: [
                    { label: '菜单1子项3子子项1' },
                    { label: '菜单1子项3子子项2' },
                    { label: '菜单1子项3子子项3' }
                ]
            }
        ]
    },
    {
        label: '菜单2',
        submenu: [
            { label: '菜单2子项1' },
            { label: '菜单2子项2' },
            { label: '菜单2子项3' },
            { label: '菜单2子项4' }
        ]
    },
]

var m = Menu.buildFromTemplate(template)

Menu.setApplicationMenu(m)

      

v2-f40042630e1073e2890742af4e5c52a9_b.jpg

v2-672ae5881d8c4ff31b64dc1775c20625_b.jpg
打开菜单1子项1

写完菜单后我们发现,原先的调试菜单已被替换,那我们怎么调试呢?

我们需要在代码中打开调试窗口

        mainWindow.webContents.openDevTools()  //卸载主进程中,让主窗口打开调试窗口

      

v2-8f8d4396f97cdcf07c803399a1549bbb_b.jpg

三. 右键菜单

点击右键是在渲染进程中,所以我们应该在渲染进程中添加响应事件

不如我们先加一个点击事件:

在index.js(渲染进程中)

        window.addEventListener("click",()=>{
    alert('窗口被点击了!!')
})

      

v2-24f15a5614935a512db2f37c9cf15c50_b.jpg

现在我们开始正式添加右键菜单

1.添加右键点击事件

        window.addEventListener("contextmenu",()=>{
    //此处写右键单击事件
})

      

2.阻止默认响应事件

        window.addEventListener("contextmenu",(e)=>{
    e.preventDefault()
})

      

3.引入remote

因为是在渲染进程中写,所以应该引入remote

        const {remote} =require('electron')

      

4.制作目录模板

        const {remote} =require('electron')
var rightTemplate = [
    {
        label: "复制"},
    {
        label: "粘贴"
    },
    {
        label: "选项3"
    }
]

      

5.建立菜单

        var m=Menu.buildFromTemplate(rightTemplate)

      

6.将目录绑定给事件监听器

        window.addEventListener("contextmenu", (e) => {
    //阻止当前窗口默认事件
    e.preventDefault();
    //把菜单模板添加到右键菜单
    m.popup({ window: remote.getCurrentWindow() })
})

      

例子:index.js中

v2-875620aca81c39d6793ecc8acaa98cd2_b.jpg
        const { remote } = require('electron')
var rightTemplate = [
    {
        label: "复制"
    },
    {
        label: "粘贴"
    },
    {
        label: "选项3"
    }
]
var m = remote.Menu.buildFromTemplate(rightTemplate)

window.addEventListener("contextmenu", (e) => {
    //阻止当前窗口默认事件
    e.preventDefault();
    //把菜单模板添加到右键菜单
    m.popup({ window: remote.getCurrentWindow() })
})

      

四. 通过链接打开浏览器

如果我们渲染的页面里有一个a标签,那electron会默认用自己的窗口打开A标签,但是它的解析能力远不如传统浏览器,所以我们需要浏览器打开链接

v2-b306c64d74f1317053cd191bbe0142ac_b.jpg

这里我们是在渲染进程中点击的,所以,代码要写在渲染进程中

  1. 引入shell

首先,要使用此功能,我们用到了electron 的一个 shell 模块

        var { shell }= require('electron')

      

2. 获取a标签,并阻止其默认动作

        var aHerf =document.querySelector('#aHerf')

aHerf.onclick=function (e) {
    e.preventDefault()
}

      

3.在onclick事件中调用shell,并传入a标签链接

例子:

        var { shell }= require('electron')
//引入shell

var aHerf =document.querySelector('#aHerf')
//获取A标签

aHerf.onclick=function (e) {
    e.preventDefault()//禁用默认动作
    var herf= this.getAttribute('href')//获取herf
    shell.openExternal(herf)//将herf传给shell,让它用浏览器打开
}

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值