我希望能够在用户点击时启动真正的粘贴事件.我可以理解这可能是一个安全问题,因为如果任何网页有权访问用户剪贴板,那就不好了.所以我认为所有浏览器都不允许访问剪贴板数据.
但是例如在谷歌文档(在类似文字的应用程序中),我可以从自定义上下文菜单粘贴(鼠标右键单击假装为上下文菜单的html元素),即使剪贴板数据已被复制到剪贴板中应用程序,如Microsoft Paint.这适用于Google Chrome浏览器,这是我感兴趣的浏览器.
我认为他们使用闪光灯,但即使我完全禁用闪光灯,它仍然有效.关于这个问题已经有了问题,但提到的答案并不正确.该问题的另一个答案表明谷歌正在使用Chrome扩展程序,但即使我禁用了Chrome中的所有扩展程序,它仍然有效.
如何在Windows中重现:
在Chrome中禁用闪存,禁用所有扩展名
重新开始
转到谷歌文档并打开新的空写作文档(文档,而不是电子表格)
在Windows中运行microsoft paint应用程序
在microsoft paint中绘制一些东西,按Ctrl + A选择全部,按Ctrl + C进行复制
切换回chrome到docs空白页面,然后右键单击空白页面
选择人工上下文菜单粘贴(注意上下文菜单中是不是从Windows本机菜单,但它来自谷歌文档的Html网页)
您将看到剪贴板图像已粘贴到docs文档(!)
他们如何做到这一点?
如果用户在我的网页上按下Ctrl + V,我知道如何访问剪贴板数据,因为这会在当前窗口中触发粘贴事件.但是,如何在用户只需单击按钮或div时,在javascript(或使用jquery)中访问剪贴板数据或启动实际剪贴板数据(例如,在mspaint中复制的位图)的粘贴?
我希望能够在用户点击时启动真正的粘贴事件.我可以理解这可能是一个安全问题,因为......
以上是底线..
有这个代码JS小提琴
var Copy = document.getElementById('copy'),
Cut = document.getElementById('cut'),
Paste = document.getElementById('paste');
// Checking Clipboard API without an action from the user
console.log('Copy:' + document.queryCommandSupported('copy'));
console.log('Cut:' + document.queryCommandSupported('cut'));
console.log('Paste:' + document.queryCommandSupported('paste'));
//Now checking the clipboard API upon a user action
Copy.addEventListener('click', function(){
console.log('Copy:' + document.queryCommandSupported('copy'));
});
Cut.addEventListener('click', function(){
console.log('Cut:' + document.queryCommandSupported('cut'));
});
Paste.addEventListener('click', function(){
console.log('Paste:' + document.queryCommandSupported('paste'));
});
自定义粘贴适用于Chrome,但只能通过扩展程序.如果你看一下谷歌文档代码,你会发现没有安装扩展程序,你就无法粘贴.你可以尝试在Firefox中使用上下文菜单粘贴,它会告诉你它不可用,你需要使用CTRL+ V.你可以在google docs源代码中找到它:
复制和粘贴需要免费的Google云端硬盘网络应用.这使我们可以访问您的剪贴板,以便您可以剪切,复制和粘贴.
因此很明显,粘贴命令需要扩展才能工作.
一种方法是使用execCommand('paste')
从页面调用时不起作用,但实际上在扩展内容脚本中工作.您只需要将clipboardRead添加到manifest.json权限,如下所示:
permissions: { ... "clipboardRead" ... }
然后在您的内容脚本document.execCommand('paste')
中将工作.
编辑:
正如@ tomas-M和@ Mi-Creativity所指出的,Chrome浏览器上google文档的实现似乎是在Chrome本身,而不是在暴露的扩展中.也许这可以提供关于定义位置的线索:https://code.google.com/p/chromium/codesearch#chromium/src/chrome/common/extensions/api/_permission_features.json&q=clipboardRead&sq=package : chromium&dr = C&L = 164
很难说它是否真的像它的工作方式,但无论如何,你可以execCommand('paste')
通过扩展"解锁" 其他网站.不太实用,但它有效.
并且document.execCommand('paste')
在控制台中测试,而在谷歌文档上给出了真实,而在其他页面上它给出了错误,所以我真的认为这是在谷歌文档中实现这个功能的方式.