获取当前剪贴板内容?

163

我想知道一种方法,可以让我的脚本检测剪贴板的内容,并在页面打开时将其粘贴到文本字段中,而不需要用户输入。如何实现?


除非您在用户复制文本时使用了某种 Flash 后端,否则您无法真正知道用户剪贴板中的内容。 ------- 更新: 这里有一个更“正确”的答案 - Naftali
请阅读以下内容:https://dev59.com/yXVC5IYBdhLWcg3woCnN https://dev59.com/RXVC5IYBdhLWcg3w-mZO - rmflow
4个回答

149

注意,截至2023年2月版本109,此解决方案在Firefox浏览器中无效,因此除非您知道没有用户使用Firefox,否则不要使用此解决方案。

使用新的剪贴板API,通过navigator.clipboard。可以按照以下方式使用:

使用async/await语法:

const text = await navigator.clipboard.readText();

或者使用 Promise 语法:

navigator.clipboard.readText()
  .then(text => {
    console.log('Pasted content: ', text);
  })
  .catch(err => {
    console.error('Failed to read clipboard contents: ', err);
  });

请记住,这将提示用户一个权限请求对话框,因此不可能有任何幽默的事情发生。

如果从控制台调用,上述代码将不起作用。 它只在您运行代码时在活动选项卡中工作。 要从控制台运行代码,您可以设置一个超时并快速点击网站窗口:

setTimeout(async () => {
  const text = await navigator.clipboard.readText();
  console.log(text);
}, 2000);

请参阅Google开发者文档,了解API和用法的更多信息。

规范


27
请注意,从控制台调用时总是会出现错误。但是当您执行直接的用户操作(例如按下页面上的按钮)时,它确实可以工作。 - Klesun
这似乎只返回纯文本...即使剪贴板上有富文本。我该怎么办? - Michael
@Michael,支持图片和其他功能是在最新的Chrome版本(76)中添加的。 - iuliu.net
1
您可以在控制台中使用setTimeout进行测试,然后再单击页面返回。 - edbentley
11
这在Firefox中根本不起作用。 - Robber
请记住,这将提示用户出现权限请求对话框,因此不可能有任何有趣的事情发生。我真的开始想到很多有趣的事情了。 - Shivam Sahil

80

window.clipboardData.getData('Text') 在一些浏览器中可以使用。然而,在许多支持该方法的浏览器上,会提示用户是否允许网页访问剪贴板。


23
除了Internet Explorer,这在其他浏览器中也能用吗? - Anderson Green
8
可能不行。请参考这个问题:https://dev59.com/fHRC5IYBdhLWcg3wJNcN - Dave
9
你可以在这里检查兼容性:http://caniuse.com/#search=clipboardData - Sergey Novikov
2
更好的解决方案是通过节点对象获取,而不是通过窗口对象获取。请参见此处 - rplaurindo
我对Keepass及其安全性感到担忧。该应用程序允许我将我的密码复制到剪贴板上。 - René Winkler

19

您可以使用

window.clipboardData.getData('Text')

在IE浏览器中获取用户剪贴板的内容。但是,在其他浏览器中,您可能需要使用Flash来获取内容,因为没有标准接口可以访问剪贴板。也许您可以尝试使用此插件 Zero Clipboard


2
链接正常工作了(再次)。 - stephanos
7
ZeroClipboard仅允许您将内容复制到剪贴板,而无法从中读取。 - DSimon

7

以下将为您提供所选内容并更新剪贴板。

绑定元素ID与复制事件,然后获取所选文本。您可以替换或修改文本。获取剪贴板并设置新文本。要获得精确的格式,您需要将类型设置为"text/html"。您也可以将其绑定到文档而不是元素。

document.querySelector('element').bind('copy', function(event) {
  var selectedText = window.getSelection().toString(); 
  selectedText = selectedText.replace(/\u200B/g, "");

  clipboardData = event.clipboardData || window.clipboardData || event.originalEvent.clipboardData;
  clipboardData.setData('text/html', selectedText);

  event.preventDefault();
});

33
欢迎来到这个网站!我很高兴你通过回答问题做出了贡献。但请注意,你的答案并没有真正回答问题。问题是从剪贴板中检索内容,并在打开页面时将其粘贴到某处。此外,由于问题没有标签为[jquery],使用jQuery的答案应包含一个说明(jQuery库已被使用)的注释。 - KarelG
这是为了从网页中选择数据并将其设置到剪贴板,问题是要提取剪贴板数据(它可以来自任何来源),因此我们应该能够从剪贴板获取数据,无论从哪里复制。 - balaji dileep kumar

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