我知道这个问题早就被发布了,但是我需要检查一下谷歌是如何做到的,也许有人会发现这很有用。
实际上,谷歌也使用系统剪贴板,但是它有点棘手。如果你使用键盘快捷键,你可以在窗口上捕捉复制/粘贴/剪切事件:
window.addEventListener('copy', function (ev) {
console.log('copy event');
ev.clipboardData.setData('text/plain', 'some text pushed to clipboard');
ev.preventDefault();
});
键盘快捷键的实时示例:http://jsfiddle.net/tyk9U/
不幸的是,这只是针对键盘快捷键的解决方案,而在上下文菜单中存在问题,因为您无法在没有本地(受信任的)复制/剪切/粘贴事件的情况下访问剪贴板数据。但是,Google使用了一个有趣的技巧。有一个API document.execCommand()
,允许您为可编辑元素运行命令,并且有一个名为“copy”的命令,您可以通过document.execCommand('copy')
触发它。但是,当您尝试在Chrome控制台中执行此操作时,它将返回false
。我花了一些时间进行调查,结果发现他们安装了Chrome扩展程序,称为“Google Drive”(转到chrome://apps/,您可以在那里看到它),该扩展程序启用了域drive.google.com和docs.google.com的剪贴板访问权限。打开一些文档或电子表格,在控制台中输入document.execCommand('copy')
- 它将返回true
。当您卸载该扩展程序后,您将无法从上下文菜单中使用剪贴板操作。
您可以通过非常简单的清单文件为自己创建此类应用程序(详细信息在此处:https://developer.chrome.com/apps/first_app):
{
"manifest_version": 2,
"name": "App name",
"description": "App description",
"version": "1.0",
"app": {
"urls": [
"http://your.app.url.here/"
],
"launch": {
"web_url": "http://your.app.url.here/"
}
},
"icons": {
"128": "x-128.png"
},
"permissions": [
"clipboardRead",
"clipboardWrite"
]
}
"permissions"字段在这里开启剪贴板操作。
现在当你启用了它,你可以执行document.execCommand('copy')
并且它会起作用(返回true
)。但这还不是全部-在Chrome中执行document.execCommand('copy')
会触发复制事件,你可以使用与捕获键盘剪贴板快捷键相同的代码来捕获它。这就是Google的做法。
当然,这个描述只适用于Chrome。