Javascript 实施';粘贴&x27;在自定义上下文菜单中

Javascript 实施';粘贴&x27;在自定义上下文菜单中,javascript,clipboard,paste,Javascript,Clipboard,Paste,这就是我试图解决的问题——我不确定这是否可能。我有一个web应用程序,需要启用从应用程序到应用程序的数据复制/粘贴,但粘贴有问题。如果我通过CTRL+V快捷键,我可以使用 e.originalEvent.clipboardData.getData('text') 在“粘贴”eventhandler中,它可以正常工作。我需要启用的是自定义上下文菜单中的“粘贴”,我的第一次尝试是像这样手动分派粘贴事件 var event = new KeyboardEvent('paste', { vie

这就是我试图解决的问题——我不确定这是否可能。我有一个web应用程序,需要启用从应用程序到应用程序的数据复制/粘贴,但粘贴有问题。如果我通过CTRL+V快捷键,我可以使用

e.originalEvent.clipboardData.getData('text')
在“粘贴”eventhandler中,它可以正常工作。我需要启用的是自定义上下文菜单中的“粘贴”,我的第一次尝试是像这样手动分派粘贴事件

var event = new KeyboardEvent('paste', {
    view: window,
    bubbles: true,
    cancelable: true
});
document.dispatchEvent(event);

它实际上击中了paste eventhandler,但我无法像上一个例子那样访问剪贴板数据。我知道这是禁止的,因为安全问题-如果允许,任何页面都可以从剪贴板访问数据。我的问题是如何实现这一点-我们能够将数据从excel复制到例如google drive文档,并使用自定义上下文菜单()将其粘贴到那里,因此我相信这是可能的。谢谢大家

因此,在我的web应用程序中,我有一个自定义上下文菜单,其中包含“粘贴”操作(弹出窗口中有一堆
  • 标记)。当用户点击“粘贴”时,我调用这个函数

    if (browser === 'CHROME') {
                    var extensionId = 'some_id';
                    chrome.runtime.sendMessage(extensionId, { message: "getClipboardData" },
                        function (clipboardData) {
                            console.log('Clipboard data: ', clipboardData);
                            var txt = $('.helper_textarea');
                            $(txt).val(clipboardData);
                            // Call 'paste' function we have clipboard data
                        }
                    );
                }
    
    在我的扩展名中,我粘贴了我的.js文件

    function getDataFromClipboard() {
      var bg = chrome.extension.getBackgroundPage();
      var helperTextArea = bg.document.getElementById('sandbox');
      if (helperTextArea == null) {
        helperTextArea = bg.document.createElement('textarea');
        document.body.appendChild(helperTextArea);
      }
      helperTextArea.value = '';
      helperTextArea.select();
    
      // Clipboard data
      var clipboardData = '';
    
      bg.document.execCommand("Paste");
      clipboardData = helperTextArea.value;
      helperTextArea.value = '';
    
      return clipboardData;
    }
    
    chrome.runtime.onMessageExternal.addListener(
      function(req, sender, callback) {
        if (req) {
          if (req.message) {
             if (req.message == "installed") {
               console.log('Checking is extension is installed!');
               callback(true);
             }
             else if(req.message = "getClipboardData") {
               console.log('Get clipboard data');
               callback(getDataFromClipboard());
             }
           }
        }
        return true;
      }
    );
    
    和在清单文件中

       "background" : {
         "scripts" : [ "paste.js" ]
       },
       "externally_connectable": {
         "matches": ["*://localhost:*/*"]
       },
    
    当然

      "permissions": ["clipboardRead" ],
    
    我使用此函数检查是否添加了扩展

       isExtensionInstalled: function (extensionId, callback) {
            chrome.runtime.sendMessage(extensionId, { message: "installed" },
                function (reply) {
                    if (reply) {
                        callback(true);
                    } else {
                        callback(false);
                    }
                });
        },
    

    这很有效。现在的问题是如何将其移植到边缘。Edge中的chrome.runtime.sendMessage与
    的等价物是什么?谢谢你的帮助。

    我想对于你的问题,包括谷歌文档粘贴背后的奥秘,你的回答对我很有帮助,所以我会把它标记为正确答案。我设法做到了这一点,将在一两天内发布代码。创建助手扩展就是一种方法。在Edge中有什么可以帮助您的吗?您不能将评论标记为正确。我使用评论只是因为我只找到了可能的答案的链接。如果你想奖励某人,只需在上面投下一个有帮助的答案