lilei 3 år sedan
förälder
incheckning
79409083d2
2 ändrade filer med 125 tillägg och 0 borttagningar
  1. 1 0
      public/index.html
  2. 124 0
      public/menus.js

+ 1 - 0
public/index.html

@@ -11,6 +11,7 @@
     <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
     <link rel="stylesheet" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" />
     <% } %>
+     <script src="./menus.js"></script>
     <script>
     	//  非谷歌浏览器或非IE11时,则提示下载谷歌浏览器进行访问
     	function BrowserType () {

+ 124 - 0
public/menus.js

@@ -0,0 +1,124 @@
+const {
+  remote,
+  clipboard
+} = require('electron');
+const { Menu, MenuItem } = remote
+
+// var rightTemplate = [{
+//     label: "复制",
+//     accelerator: 'ctrl+c',
+//     click: function() {
+//       console.log('复制',window.getSelection().toString())
+//       clipboard.writeText(window.getSelection().toString(), 'selection');
+//     }
+//   },
+//   {
+//     label: "粘贴",
+//     accelerator: 'ctrl+v',
+//     click: function() {
+//       console.log('粘贴')
+//       clipboard.readText('selection');
+//     }
+//   }
+// ]
+// console.log(remote)
+// var m = remote.Menu.buildFromTemplate(rightTemplate);
+
+// window.addEventListener('contextmenu', function(e) {
+//   e.preventDefault();
+//   var hasSelection = window.getSelection().toString()
+//   if(hasSelection.length){
+//     m.popup({
+//       window: remote.getCurrentWindow()
+//     });
+//   }
+// })
+
+// const inputs = document.querySelectorAll("input,textarea")
+// console.log(inputs)
+// for (const inp of inputs) {
+//   inp.addEventListener("focus", function(e){
+//     console.log(e)
+//     var hasSelection = window.getSelection().toString()
+//     if(hasSelection.length){
+//       m.popup({
+//         window: remote.getCurrentWindow()
+//       });
+//     }
+//   });
+// }
+
+// 写入剪贴板方法
+function copyString () {
+  const str = getSelections() // 获取选中内容
+  clipboard.writeText(str) // 写入剪贴板
+}
+// 获取剪贴版内容写入当前焦点元素中
+function printString () {
+  if (document.activeElement) {
+    const str = clipboard.readText() // 获取剪贴板内容
+    document.activeElement.value = str // 写入焦点元素
+    var eventchange = new Event('change');
+    var eventinput = new Event('input');
+    document.activeElement.dispatchEvent(eventchange);
+    document.activeElement.dispatchEvent(eventinput);
+    clipboard.clear() // 清空剪贴板
+  }
+}
+
+function getContextMenu(){
+  // 监听contextmenu,实现自定义右键菜单
+    window.addEventListener('contextmenu', function (e) {
+      e.preventDefault()
+      let menu = new Menu()
+  
+      // ↓ 情况一:任何情况下,都显示 复制 和 粘贴 按钮
+      //添加菜单功能, label: 菜单名称, accelerator:快捷键,click:点击方法
+      // menu.append(new MenuItem({ label: '复制', accelerator: 'CommandOrControl+C', click: copyString }))
+      // //添加菜单分割线
+      // menu.append(new MenuItem({ type: 'separator' }))
+      // //添加菜单功能
+      // menu.append(new MenuItem({ label: '粘贴', accelerator: 'CommandOrControl+V', click: printString }))
+      // ↑ 情况一
+  
+      // ↓ 情况二:可复制时,显示复制,可粘贴时显示粘贴
+      let flag = false // menu中是否有菜单项,true有,false没有
+      const tagName = document.activeElement.tagName // 焦点元素的tagName
+      const str = clipboard.readText() // 剪贴板中的内容
+      const selectStr = getSelections() // 选中的内容
+      const text = e.target.innerText || '' // 目标标签的innerText
+      const value = e.target.value || '' // 目标标签的value
+  
+      if (selectStr) { // 如果有选中内容
+        flag = true
+        // 在 选中的元素或者输入框 上面点右键,这样在选中后点别处就不会出现右键复制菜单
+        if (text.indexOf(selectStr) !== -1 || value.indexOf(selectStr) !== -1) menu.append(new MenuItem({ label: '复制', click: copyString }))
+      }
+      if (str && (tagName === 'INPUT' || tagName === 'TEXTAREA')) { // 若为输入框 且 剪贴板中有内容,则显示粘贴菜单
+        flag = true
+        menu.append(new MenuItem({ label: '粘贴', click: printString }))
+      }
+  
+      // ↑ 情况二
+      // menu中有菜单项 且(有选中内容 或 剪贴板中有内容)
+      if (flag && (getSelections() || str)) {
+        // 将此menu菜单作为 当前窗口 remote.getCurrentWindow() 中的上下文菜单弹出。
+        menu.popup(remote.getCurrentWindow())
+      }
+    }, false)
+}
+
+// 获取选中内容
+function getSelections () {
+  var text = ''
+  if (window.getSelection) { // 除IE9以下 之外的浏览器
+    text = window.getSelection().toString()
+  } else if (document.selection && document.selection.type !== 'Control') { //IE9以下,可不考虑
+    text = document.selection.createRange().text
+  }
+  if (text) {
+    return text
+  }
+}
+
+getContextMenu()