在chrome扩展中正确使用execcommand(“paste”)

时间:2011-08-22 08:16:03

标签: javascript google-chrome-extension

我正在尝试使用带有chome扩展名的execcommand("paste")将剪贴板数据粘贴到textarea中,但我似乎无法让它工作。 权限已设置。 我试图在textarea上设置focus(),但document.execCommand("paste")什么都不做,我没有错误。 从后台页面调用execcommand("paste")也不会做任何事情。

<form>
     <textarea id="ta"></textarea>    
</form>
<script type="text/javascript">
    document.findElemetById("ta").focus();
    document.execCommand("paste");
</script>

3 个答案:

答案 0 :(得分:39)

剪贴板功能是my extension的关键部分,所以我看到了所有正常的问题。在我的背景页面上,我公开了copypaste函数,页面本身包含<textarea id="sandbox"></textarea>;

function copy(str) {
    var sandbox = $('#sandbox').val(str).select();
    document.execCommand('copy');
    sandbox.val('');
}

function paste() {
    var result = '',
        sandbox = $('#sandbox').val('').select();
    if (document.execCommand('paste')) {
        result = sandbox.val();
    }
    sandbox.val('');
    return result;
}

我使用jQuery来简化,但你明白了。现在,只要我想使用剪贴板功能,我只需调用相关功能即可。我的扩展程序中的其他网页可以通过chrome.extension.getBackgroundPage()访问此API,但如果您的背景页是chrome.runtime.getBackgroundPage(callback),也可以使用event page

我不确定这是不是最佳做法,或者这个功能是否存在,但这对我来说非常有用并且非常干净。

答案 1 :(得分:18)

这对于Alasdair的出色回应的评论太长了,所以我正在创造另一个答案。 Alasdair的答案非常好,对我来说很有用,但作为Chrome扩展程序的新手,它仍然需要一段时间才能让它运行起来。对于处于类似职位的人来说,这是他答案的扩展。

如果您已请求相应的权限,则背景/事件页面可以与系统剪贴板进行交互。它们无法与用户加载的页面的DOM进行交互。内容脚本无法与系统剪贴板交互,但它们可以与用户已加载的页面的DOM进行交互。请查看explanation of the extension architecture,了解所有这些内容。

这实际上意味着您需要在事件/背景页面中从系统剪贴板执行复制/粘贴操作,这正是Alasdair上面概述的内容。从用户正在查看的页面的DOM中粘贴或复制必须在您的内容脚本中进行。这两个脚本可以很容易地与message passing进行通信。

我有an extension,唯一的目的是粘贴,而这个架构主要来自这篇文章。如果您想在实践中看到上述技术,take a look at the code。特别是background.htmlbackground.jscontentscript.js

如果你真的很匆忙,here is a gist

答案 2 :(得分:0)

  function PasteString() {
    var editor = document.getElementById("TemplateSubPage");
    editor.focus();
  //  editor.select();
    document.execCommand('Paste');
}

function CopyString() {
    var input = document.getElementById("TemplateSubPage");
    input.focus();
   // input..select();
    document.execCommand('Copy');
    if (document.selection) {
        document.selection.empty();
    } else if (window.getSelection) {
        window.getSelection().removeAllRanges();
    }
}

希望这对你有用