我注意到blog post from Google如果您使用的是最新版本的Chrome,则会提到将图片直接从剪贴板粘贴到Gmail邮件中的功能。我尝试使用我的Chrome版本(12.0.742.91 beta-m),使用控制键或上下文菜单效果很好。
根据这种行为,我需要假设Chrome中使用的最新版本的webkit能够处理Javascript粘贴事件中的图像,但我无法找到对此类增强的任何引用。我相信ZeroClipboard绑定到按键事件以触发其闪存功能,因此无法通过上下文菜单工作(同样,ZeroClipboard是跨浏览器,帖子说这只适用于Chrome)。
那么,这是如何工作的以及对启用该功能的Webkit(或Chrome)进行增强的地方?
答案 0 :(得分:206)
我花了一些时间试验这个。它似乎跟随新的Clipboard API spec。您可以定义“粘贴”事件处理程序并查看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);
}
}
}
获得数据网址后,您可以在页面上显示图像。如果你想上传它,你可以使用readAsBinaryString,或者你可以使用FormData将它放入XHR。
答案 1 :(得分:47)
尼克的答案似乎需要做些小改动才能继续工作:)
// 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/
所以对nicks的回答是:
var items = event.clipboardData.items;
到
var items = (event.clipboardData || event.originalEvent.clipboardData).items;
此外,我必须从粘贴的项目中获取第二个元素(如果将图像从另一个网页复制到缓冲区,则第一个元素似乎是text / html)。所以我改变了
var blob = items[0].getAsFile();
找到包含图像的项目的循环(见上文)
我不知道如何直接回答尼克的回答,希望这里没问题:$:)
答案 2 :(得分:24)
这是一个包含整个交易的流畅jQuery插件(与Nick's answer基本相同的原则):http://strd6.com/2011/09/html5-javascript-pasting-image-data-in-chrome/
它有一个现场演示,带注释的源代码以及所有内容。
答案 3 :(得分:7)
Web浏览器不断前进。我最近发现了这个:
Code Snippet — Accessing Clipboard Images with Javascript
和此:
The Paste Wasteland (or, why the onPaste event is a mess)
第一个链接描述了仅在Firefox和Chrome上使用JavaScript获取剪贴板图像的方法。第二个链接包含一个后记,提到相同的技术适用于IE(未知版本)。
答案 4 :(得分:2)
据我所知 -
使用HTML 5功能(文件Api和相关) - 现在可以使用普通的javascript访问剪贴板图像数据。
然而,这无法在IE(任何低于IE 10)上工作。不太了解IE10支持。
对于IE,我相信的是&#39;后备&#39;选项是 要么使用Adobe的AIR api 要么 使用已签名的小程序
答案 5 :(得分:1)
答案 6 :(得分:0)
这来自适用于我的项目的angular2打字稿示例。希望它可以帮助某人。其他情况的逻辑也一样。
https://gist.github.com/sandeepsuvit/a8ba77faebba260455985504be24aef7
这是一个实时实施:
https://stackblitz.com/edit/angular-f7kcny?file=app/app.component.ts