【问题标题】:Is it possible to read the clipboard in Firefox, Safari and Chrome using JavaScript?是否可以使用 JavaScript 在 Firefox、Safari 和 Chrome 中读取剪贴板?
【发布时间】:2010-09-19 00:32:55
【问题描述】:

我正在尝试使用 JavaScript 读取剪贴板的内容。使用 Internet Explorer 可以使用该功能

window.clipboardData.getData("Text")

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

【问题讨论】:

  • 有时。这取决于安全选项“允许编程剪贴板访问”的设置。在 IE7 的安全默认“中高”中,它设置为在允许访问之前询问。

标签: javascript cross-browser clipboard


【解决方案1】:

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

Information

你想做这样的事情:

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) {
        // ...
    }
};

【讨论】:

  • 如果只有 Firefox 会支持这个!它安全且允许访问剪贴板。
  • Chrome 中没有 clipboardData 成员
  • 我收回它 - 我正在使用 JQuery 事件绑定,所以我不得不使用 e.originalEvent.clipboardData
  • 我可以使用这个剪贴板类将数据从winform应用程序传输到浏览器
【解决方案2】:

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

【讨论】:

  • 如何测试“事件完成后粘贴”?
  • 不知道。但是由于整个方法无论如何都不是一件艺术品,所以我会睡 1 秒钟;)
  • 我们刚刚在 CodeMirror (marijn.haverbeke.nl/codemirror) 中添加了类似的内容(感谢上述评论的启发)。它监听 onbeforepaste,创建一个 textarea,聚焦它,休眠 10 毫秒,抓取内容,移除 textarea,将焦点返回到它之前的位置,然后对粘贴的文本进行肮脏的处理。仅在 IE 上可靠运行。通过对 ctrl-V(和 command-V)按下作出反应,您还可以让它在 FF 和其他一些浏览器中工作。
  • @Marijn:我在我正在使用的编辑器中使用了相同的方法,并且隐藏的 textarea 技巧在所有主要的键盘粘贴浏览器中都可以正常工作。不幸的是,IE 会在您打开上下文菜单时立即触发 onbeforepaste:您设法解决了这个问题吗?
  • 这是否解释了如何从剪贴板复制?
【解决方案3】:

不。如果您确实发现了一个 hack(例如旧版本的 flash),请不要依赖它。

我能问一下你为什么要从剪贴板读取吗?如果用户想要传递剪贴板内容,他们需要做的就是粘贴。

【讨论】:

  • 我正在读取 onpaste 事件(在 IE 中)的剪贴板以过滤掉无效字符(例如,从整数值中删除空格)。
  • 在他们粘贴到的字段上使用 onchange?
  • 嗯,这篇文章是 7 年前的。我只想将信息传递给以后的任何人,Midas Demo@Mozilla 将向您展示如何阅读剪贴板:www-archive.mozilla.org/editor/midasdemoNO FLASH。尝试使用 Wikipedia 行 - 结果很棒。
【解决方案4】:

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

【讨论】:

  • 这绝对不再是真的,如果它曾经是的话。 Flash 9+ 只能写入到剪贴板,不能读取。
  • 澄清我之前的评论:Flash 10+ 可以从剪贴板读取,但只能在用户发起的 paste 事件期间(NOT 在用户点击之后,与复制不同)。
【解决方案5】:

使用@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);

    });

});

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多