使用JavaScript在Firefox、Safari和Chrome中读取剪贴板是否可行?

35

我正在尝试使用JavaScript读取剪贴板的内容。在Internet Explorer中,可以使用该函数实现。

window.clipboardData.getData("Text")

在Firefox、Safari和Chrome中是否有类似的读取剪贴板的方法?


1
有时候。这取决于安全选项“允许编程访问剪贴板”的设置。在IE7的安全默认设置“中高”中,它被设置为在允许访问之前询问。 - bobince
可能是获取当前剪贴板内容?的重复问题。 - Anderson Green
5个回答

18

Safari支持在onpaste事件期间读取剪贴板:

信息

您想要做类似以下的事情:

someDomNode.onpaste = function(e) {
    var paste = e.clipboardData && e.clipboardData.getData ?
        e.clipboardData.getData('text/plain') :                // Standard
        window.clipboardData && window.clipboardData.getData ?
        window.clipboardData.getData('Text') :                 // MS
        false;
    if(paste) {
        // ...
    }
};

1
如果Firefox能够支持这个功能就好了!它很安全,而且允许访问剪贴板。 - Nico Burns
1
Chrome 中没有 clipboardData 成员。 - Muxa
8
我收回之前的说法 - 我使用了JQuery事件绑定,所以我必须使用e.originalEvent.clipboardData。 - Muxa
我可以使用这个剪贴板类将数据从WinForm应用程序传输到浏览器吗? - user1421044

15

在线电子表格钩取Ctrl+CCtrl+V事件并转移焦点到一个隐藏的TextArea控件,然后将其内容设置为所需的新剪贴板内容以进行复制,或在事件完成后读取其内容以进行粘贴。


你如何测试“事件已经完成粘贴”? - schwerwolf
1
不知道。但是既然整个方法都不是艺术品,我会睡1秒钟 ;) - agsamek
3
感谢上面的评论给我们启示,我们刚刚在 CodeMirror(http://marijn.haverbeke.nl/codemirror)中添加了类似这样的功能。它监听 onbeforepaste 事件,创建一个文本区域,将焦点放在该区域上,等待10毫秒,获取内容,移除文本区域,将焦点返回到之前的位置,并对粘贴的文本进行处理。只能在 IE 中可靠地工作。通过响应 ctrl-V(和 command-V)按键,您还可以使其在 FF 和可能其他浏览器中工作。 - Marijn
1
@Marijn:我正在开发的编辑器中使用了相同的方法,隐藏文本区域的技巧可以在所有主流浏览器中很好地处理键盘粘贴。不幸的是,IE会在打开上下文菜单时立即触发onbeforepaste事件:你有办法解决吗? - Tim Down
这个说明如何从剪贴板复制吗? - Lee Goddard

2

编号,如果您发现了黑客攻击(例如旧版本的Flash),也不要依赖它。

我可以问一下您为什么想从剪贴板读取内容吗?如果用户想要传递剪贴板内容,他们只需要粘贴即可。


2
我正在onpaste事件中读取剪贴板(在IE中),以过滤无效字符(例如,从整数值中删除空格)。 - Gil Faria
12
他们想在粘贴到的字段上使用"onchange"函数吗? - nickf
1
好的,这篇文章是7年前发布的。我只想把这个信息传递给后来者,Midas Demo @ Mozilla会向你展示如何读取剪贴板:http://www-archive.mozilla.org/editor/midasdemo/ 没有FLASH。我用维基百科的一行文字试了一下 - 结果很棒。 - syntaxerror

1

我相信人们使用隐藏的 Flash 元素从你提到的浏览器读取剪贴板数据。


如果这曾经是真的,现在绝对已经不再是了。Flash 9+只能将内容写入剪贴板,而无法从中读取。 - James M. Greene
我之前的评论需要澄清:Flash 10+可以从剪贴板读取,但仅限于用户发起的“粘贴”事件(不是在用户单击后,与复制不同)。 - James M. Greene

1

使用 @agsamek 的建议,我创建了一个小的测试片段并使其工作。在我的情况下,我需要在页面刷新后等待粘贴的输入,因此我专注于一个不可见的文本区域并从那里读取文本。

您可以将其扩展到监听特定键(粘贴组合键),然后聚焦于隐藏字段。肯定还有更多的工作要做,因为我认为您需要重新聚焦于最后聚焦的元素并在那里粘贴内容。

对于我的用例,这已足以使它在最新的Chrome和Firefox中运行。欢迎提供建议。

https://jsfiddle.net/wuestkamp/91dxjv7s/11/

$(function () {

    $('body').prepend('<input type="text" id="hidden_textbox" style="position: absolute; width:0px; height: 0px; top: -100px; left: -100px">');

    var $hiddenTextbox = $('#hidden_textbox');
    $hiddenTextbox.focus();

    $(document).on('paste', function () {
        setTimeout(function () {
            var val = $hiddenTextbox.val();

            console.log('pasted: ' + val);

        }, 50);

    });

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接