Chrome扩展程序execCommand(' copy')不会复制

时间:2015-09-22 23:20:11

标签: google-chrome google-chrome-extension

刚开始测试chrome扩展,基本上我想更改右键单击的链接并发送到剪贴板,请参阅:

background.js

var convert_buylink = function(event){
    var parser = document.createElement('a');
    parser.href = event.linkUrl;
    parser.hostname = 'cart.local.co.nz';
    parser.protocol = 'http';
    var link = document.createElement('input');
    //link.value = parse.href;
    link.value = 'abc';
    link.focus();
    link.select();
    document.execCommand('SelectAll');
    document.execCommand("Copy")
}

chrome.contextMenus.create({title: "Copy Local BuyLink", contexts:["link"], onclick: convert_buylink});

的manifest.json

{
  "manifest_version": 2,
  "name": "Local Buylink",
  "description": "Changes buylink to local cart",
  "version": "1.0",
  "background": {
    "scripts": ["background.js"]
  },
  "permissions": [
    "contextMenus",
    "tabs",
    "clipboardWrite"
   ]
}

我已经阅读了谷歌关于副本无法正常工作的一些结果,所有人都说它不能在内容页面上工作,但根据documentation

  

扩展系统将生成一个后台页面,其中包含scripts属性中列出的每个文件。

1 个答案:

答案 0 :(得分:0)

您在后台页面的文档对象中创建input,但由于copy命令工作所需的用户手势(上下文菜单点击)在另一个中执行,因此失败文档对象:网页。您创建的元素也不属于document,它是一个分离的节点。

解决方案:在网页内创建一个隐藏的input

  • background.js:

    function convert_buylink(info, tab) {
        var parser = new URL(info.linkUrl);
        parser.hostname = 'cart.local.co.nz';
        parser.protocol = 'http';
        clipboardCopy(parser.href);
    }
    
    function clipboardCopy(text) {
        chrome.tabs.executeScript({code: "\
            var input = document.createElement('input');\
            input.value = '" + text.replace(/'/g, "\\'") + "';\
            input.style.cssText = 'opacity:0; position:fixed';\
            document.body.appendChild(input);\
            input.focus();\
            input.select();\
            document.execCommand('Copy');\
            input.remove();\
        "});
    }
    
  • 的manifest.json:

      "permissions": [
           ..............
           "activeTab"
      ],