菜单

menu 类可以用来创建原生菜单,它可用作应用菜单和context 菜单.

这个模块是一个主进程的模块,并且可以通过 remote 模块给渲染进程调用.

每个菜单有一个或几个菜单项 menu items,并且每个菜单项可以有子菜单.

下面这个例子是在网页(渲染进程)中通过 remote 模块动态创建的菜单,并且右键显示:

  1. <!-- index.html -->
  2. <script>
  3. const remote = require('electron').remote;
  4. const Menu = remote.Menu;
  5. const MenuItem = remote.MenuItem;
  6. var menu = new Menu();
  7. menu.append(new MenuItem({ label: 'MenuItem1', click: function() { console.log('item 1 clicked'); } }));
  8. menu.append(new MenuItem({ type: 'separator' }));
  9. menu.append(new MenuItem({ label: 'MenuItem2', type: 'checkbox', checked: true }));
  10. window.addEventListener('contextmenu', function (e) {
  11. e.preventDefault();
  12. menu.popup(remote.getCurrentWindow());
  13. }, false);
  14. </script>

例子,在渲染进程中使用模板api创建应用菜单:

  1. var template = [
  2. {
  3. label: 'Edit',
  4. submenu: [
  5. {
  6. label: 'Undo',
  7. accelerator: 'CmdOrCtrl+Z',
  8. role: 'undo'
  9. },
  10. {
  11. label: 'Redo',
  12. accelerator: 'Shift+CmdOrCtrl+Z',
  13. role: 'redo'
  14. },
  15. {
  16. type: 'separator'
  17. },
  18. {
  19. label: 'Cut',
  20. accelerator: 'CmdOrCtrl+X',
  21. role: 'cut'
  22. },
  23. {
  24. label: 'Copy',
  25. accelerator: 'CmdOrCtrl+C',
  26. role: 'copy'
  27. },
  28. {
  29. label: 'Paste',
  30. accelerator: 'CmdOrCtrl+V',
  31. role: 'paste'
  32. },
  33. {
  34. label: 'Select All',
  35. accelerator: 'CmdOrCtrl+A',
  36. role: 'selectall'
  37. },
  38. ]
  39. },
  40. {
  41. label: 'View',
  42. submenu: [
  43. {
  44. label: 'Reload',
  45. accelerator: 'CmdOrCtrl+R',
  46. click: function(item, focusedWindow) {
  47. if (focusedWindow)
  48. focusedWindow.reload();
  49. }
  50. },
  51. {
  52. label: 'Toggle Full Screen',
  53. accelerator: (function() {
  54. if (process.platform == 'darwin')
  55. return 'Ctrl+Command+F';
  56. else
  57. return 'F11';
  58. })(),
  59. click: function(item, focusedWindow) {
  60. if (focusedWindow)
  61. focusedWindow.setFullScreen(!focusedWindow.isFullScreen());
  62. }
  63. },
  64. {
  65. label: 'Toggle Developer Tools',
  66. accelerator: (function() {
  67. if (process.platform == 'darwin')
  68. return 'Alt+Command+I';
  69. else
  70. return 'Ctrl+Shift+I';
  71. })(),
  72. click: function(item, focusedWindow) {
  73. if (focusedWindow)
  74. focusedWindow.toggleDevTools();
  75. }
  76. },
  77. ]
  78. },
  79. {
  80. label: 'Window',
  81. role: 'window',
  82. submenu: [
  83. {
  84. label: 'Minimize',
  85. accelerator: 'CmdOrCtrl+M',
  86. role: 'minimize'
  87. },
  88. {
  89. label: 'Close',
  90. accelerator: 'CmdOrCtrl+W',
  91. role: 'close'
  92. },
  93. ]
  94. },
  95. {
  96. label: 'Help',
  97. role: 'help',
  98. submenu: [
  99. {
  100. label: 'Learn More',
  101. click: function() { require('electron').shell.openExternal('http://electron.atom.io') }
  102. },
  103. ]
  104. },
  105. ];
  106. if (process.platform == 'darwin') {
  107. var name = require('electron').remote.app.getName();
  108. template.unshift({
  109. label: name,
  110. submenu: [
  111. {
  112. label: 'About ' + name,
  113. role: 'about'
  114. },
  115. {
  116. type: 'separator'
  117. },
  118. {
  119. label: 'Services',
  120. role: 'services',
  121. submenu: []
  122. },
  123. {
  124. type: 'separator'
  125. },
  126. {
  127. label: 'Hide ' + name,
  128. accelerator: 'Command+H',
  129. role: 'hide'
  130. },
  131. {
  132. label: 'Hide Others',
  133. accelerator: 'Command+Alt+H',
  134. role: 'hideothers'
  135. },
  136. {
  137. label: 'Show All',
  138. role: 'unhide'
  139. },
  140. {
  141. type: 'separator'
  142. },
  143. {
  144. label: 'Quit',
  145. accelerator: 'Command+Q',
  146. click: function() { app.quit(); }
  147. },
  148. ]
  149. });
  150. // Window menu.
  151. template[3].submenu.push(
  152. {
  153. type: 'separator'
  154. },
  155. {
  156. label: 'Bring All to Front',
  157. role: 'front'
  158. }
  159. );
  160. }
  161. var menu = Menu.buildFromTemplate(template);
  162. Menu.setApplicationMenu(menu);

类: Menu

new Menu()

创建一个新的菜单.

方法

菜单 类有如下方法:

Menu.setApplicationMenu(menu)

  • menu Menu
    在 macOS 上设置应用菜单 menu .在windows 和 linux,是为每个窗口都在其顶部设置菜单 menu.

Menu.sendActionToFirstResponder(action) macOS

  • action String
    发送 action 给应用的第一个响应器.这个用来模仿 Cocoa 菜单的默认行为,通常你只需要使用 MenuItem 的属性 role.

查看更多 macOS 的原生 action macOS Cocoa Event Handling Guide .

Menu.buildFromTemplate(template)

  • template Array
    一般来说,template 只是用来创建 MenuItem 的数组 参数 .

你也可以向 template 元素添加其它东西,并且他们会变成已经有的菜单项的属性.

实例方法

menu 对象有如下实例方法

menu.popup([browserWindow, x, y, positioningItem])

  • browserWindow BrowserWindow (可选) - 默认为 null.
  • x Number (可选) - 默认为 -1.
  • y Number (必须 如果x设置了) - 默认为 -1.
  • positioningItem Number (可选) macOS - 在指定坐标鼠标位置下面的菜单项的索引. 默认为-1.
    browserWindow 中弹出 context menu .你可以选择性地提供指定的 x, y 来设置菜单应该放在哪里,否则它将默认地放在当前鼠标的位置.

menu.append(menuItem)

  • menuItem MenuItem
    添加菜单项.

menu.insert(pos, menuItem)

  • pos Integer
  • menuItem MenuItem
    在制定位置添加菜单项.

menu.items()

获取一个菜单项数组.

macOS Application 上的菜单的注意事项

相对于windows 和 linux, macOS 上的应用菜单是完全不同的style,这里是一些注意事项,来让你的菜单项更原生化.

标准菜单

在 macOS 上,有很多系统定义的标准菜单,例如 Services andWindows 菜单.为了让你的应用更标准化,你可以为你的菜单的 role 设置值,然后 electron 将会识别他们并且让你的菜单更标准:

  • window
  • help
  • services

标准菜单项行为

macOS 为一些菜单项提供了标准的行为方法,例如 About xxx,Hide xxx, and Hide Others. 为了让你的菜单项的行为更标准化,你应该为菜单项设置 role 属性.

主菜单名

在 macOS ,无论你设置的什么标签,应用菜单的第一个菜单项的标签始终未你的应用名字.想要改变它的话,你必须通过修改应用绑定的 Info.plist 文件来修改应用名字.更多信息参考About InformationProperty List Files .

为制定浏览器窗口设置菜单 (Linux Windows)

浏览器窗口的setMenu 方法 能够设置菜单为特定浏览器窗口的类型.

菜单项位置

当通过 Menu.buildFromTemplate 创建菜单的时候,你可以使用 position and id 来放置菜单项.

MenuItem 的属性 position 格式为 [placement]=[id]placement 取值为 before, after, 或 endofidid 是菜单已经存在的菜单项的唯一 ID:

  • before - 在对应引用id菜单项之前插入. 如果引用的菜单项不存在,则将其插在菜单末尾.
  • after - 在对应引用id菜单项之后插入. 如果引用的菜单项不存在,则将其插在菜单末尾.
  • endof - 在逻辑上包含对应引用id菜单项的集合末尾插入. 如果引用的菜单项不存在, 则将使用给定的id创建一个新的集合,并且这个菜单项将插入.
    当一个菜档项插入成功了,所有的没有插入的菜单项将一个接一个地在后面插入.所以如果你想在同一个位置插入一组菜单项,只需要为这组菜单项的第一个指定位置.

例子

模板:

  1. [
  2. {label: '4', id: '4'},
  3. {label: '5', id: '5'},
  4. {label: '1', id: '1', position: 'before=4'},
  5. {label: '2', id: '2'},
  6. {label: '3', id: '3'}
  7. ]

菜单:

  1. - 1
  2. - 2
  3. - 3
  4. - 4
  5. - 5

模板:

  1. [
  2. {label: 'a', position: 'endof=letters'},
  3. {label: '1', position: 'endof=numbers'},
  4. {label: 'b', position: 'endof=letters'},
  5. {label: '2', position: 'endof=numbers'},
  6. {label: 'c', position: 'endof=letters'},
  7. {label: '3', position: 'endof=numbers'}
  8. ]

菜单:

  1. - ---
  2. - a
  3. - b
  4. - c
  5. - ---
  6. - 1
  7. - 2
  8. - 3