从剪贴板功能粘贴图像在Gmail和Google Chrome 12+中如何工作?


148

我注意到Google一篇博客文章提到,如果您使用的是最新版的Chrome,可以将剪贴板中的图像直接粘贴到Gmail邮件中。我在我的Chrome版本(12.0.742.91 beta-m)中进行了尝试,使用控制键或上下文菜单效果很好。

从这种行为,我需要假设Chrome中使用的最新版本的Webkit能够处理Javascript粘贴事件中的图像,但是我无法找到对这种增强功能的任何引用。我相信ZeroClipboard绑定到按键事件以触发其Flash功能,因此无法通过上下文菜单使用(此外,ZeroClipboard是跨浏览器,并且该帖子说这仅适用于Chrome)。

那么,这是如何工作的以及对启用该功能的Webkit(或Chrome)进行了增强?


3
似乎它也可以与Firefox一起使用。有人知道Firefox是否应该支持此功能吗?
塞巴斯蒂安

Answers:


231

我花了一些时间对此进行试验。似乎遵循了新的Clipboard API规范。您可以定义“粘贴”事件处理程序,并查看event.clipboardData.items,然后在它们上调用getAsFile()以获取Blob。有了Blob后,可以在其上使用FileReader来查看其中的内容。您可以通过以下方式获取刚刚粘贴到Chrome中的内容的数据网址:

// window.addEventListener('paste', ... or
document.onpaste = function(event){
  var items = (event.clipboardData || event.originalEvent.clipboardData).items;
  console.log(JSON.stringify(items)); // will give you the mime types
  for (index in items) {
    var item = items[index];
    if (item.kind === 'file') {
      var blob = item.getAsFile();
      var reader = new FileReader();
      reader.onload = function(event){
        console.log(event.target.result)}; // data url!
      reader.readAsDataURL(blob);
    }
  }
}

拥有数据URL后,您可以在页面上显示图像。如果要上传,则可以使用readAsBinaryString,也可以使用FormData将其放入XHR 。


6
这里有很多麻烦,但是有什么想法为什么在Safari 5.1中event.clipboardData.items似乎是“未定义”的?甚至如何在Safari中获取文件/ blob的剪贴板内容?在Chrome浏览器中效果很好。您会认为webkit就是webkit :(
Gavin Gilmour

7
@SenicaGonzalez,这是因为该数据仅在事件持续时间内存在。事件之后,它消失了,因此,当您尝试在检查器中翻转打开对象时,您什么也看不到。
Nick Retallack 2012年

3
我在Firefox上运行此代码,并且var blob = items [0] .getAsFile()引发TypeError:项未定义
chinna_82 2013年

2
您介意举例说明如何使用该图像数据提交XMLHttpRequest吗?:D
poitroae

1
这是您可以使用XMLHttpRequest提交的方法,我在实现后将其写在博客中:blog.securevideo.com/2013/11/27/…–
JT Taylor,

56

尼克的答案似乎需要进行一些小的更改才能继续工作:)

// window.addEventListener('paste', ... or
document.onpaste = function (event) {
  // use event.originalEvent.clipboard for newer chrome versions
  var items = (event.clipboardData  || event.originalEvent.clipboardData).items;
  console.log(JSON.stringify(items)); // will give you the mime types
  // find pasted image among pasted items
  var blob = null;
  for (var i = 0; i < items.length; i++) {
    if (items[i].type.indexOf("image") === 0) {
      blob = items[i].getAsFile();
    }
  }
  // load image if there is a pasted image
  if (blob !== null) {
    var reader = new FileReader();
    reader.onload = function(event) {
      console.log(event.target.result); // data url!
    };
    reader.readAsDataURL(blob);
  }
}

示例运行代码:http : //jsfiddle.net/bt7BU/225/

因此,刻痕答案的变化是:

var items = event.clipboardData.items;

var items = (event.clipboardData  || event.originalEvent.clipboardData).items;

另外,我还必须从粘贴的项目中提取第二个元素(如果将图像从另一个网页复制到缓冲区中,则第一个元素似乎是text / html)。所以我改变了

  var blob = items[0].getAsFile();

循环查找包含图像的项目(请参见上文)

我不知道如何直接回答尼克的答案,希望在这里是可以的:$ :)


1
我们应该如何将图像数据提交为XMLHttpRequest?
poitroae

对于其他阅读
此书的人

4
我不明白 当我在浏览器中粘贴文件时,clipboardData.items谷歌浏览器中的始终为空(Firefox可以正常工作)。chrome现在需要几乎与IE一样多的优化。
托马什Zato -恢复莫妮卡

1
小修改:if(blob!= null){(或在初始化中设置blob = null)
Pancakeo 2014年

1
event.clipboardData.items在最新版的Chrome上对我来说效果还不错,不确定何时event.originalEvent...有用?
鲁宾·马丁内斯(Ruben Martinez)


5

Web浏览器不断前进。我最近发现了这一点:

代码段—使用Javascript访问剪贴板图像

还有这个:

Paste Wasteland(或为什么onPaste事件是一团糟)

第一个链接描述了仅在Firefox和Chrome上使用JavaScript获取剪贴板图像的方法。第二个链接包含一个后记,其中提到了针对IE(未知版本)改编的相同技术。


Firefox甚至没有激活Edit | 为我粘贴菜单项,因此根本看不到它在Firefox中的工作方式。
播客

评论时,这些链接中的任何一个都不起作用。
Crazywako

2

我所知道的 -

有了HTML 5功能(文件Api和相关的功能),现在可以使用普通的javascript访问剪贴板图像数据。

但是,这无法在IE(小于IE 10的版本)上运行。对IE10支持也不太了解。

对于IE,我认为是“后备”选项的优化程序是使用Adobe的AIR api或使用签名的applet



0

这来自适用于我的项目的angular2打字稿示例。希望它能帮助某人。其他情况的逻辑也一样。

https://gist.github.com/sandeepsuvit/a8ba77faebba260455985504be24aef7

这是一个实时实现:

https://stackblitz.com/edit/angular-f7kcny?file=app/app.component.ts


1
您能解释一下您遵循的流程吗?您可以打开https://stackblitz.com/edit/angular-f7kcny?file=app/app.component.tsChrome中的链接,然后右键单击任何网站上的图像。然后将其粘贴到提供的文本框中。它应该以这种方式工作。
Sandeep K Nair

从网络图像作品复制。我尝试了Windows资源管理器中的图像,这就是为什么它当时不起作用的原因。您是否知道有什么方法可以处理从Windows资源管理器复制的图像并将其粘贴到网页上?
战鹰

我还没有尝试过此选项。希望您可以从这些库中获得见解https://github.com/layerssss/paste.js/https://github.com/JoelBesada/pasteboard。这些链接上有演示,您可以尝试。
Sandeep K Nair

当我在Windows操作系统计算机上粘贴图像时event.clipboardData为空。有人可以解释为什么会发生这种情况吗?
TunçDoğan12:
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.