如何点击粘贴?它适用于谷歌文档

2024-05-04

我希望能够在用户单击时启动真正的粘贴事件。我可以理解这可能是一个安全问题,因为如果任何网页可以访问用户剪贴板,那就不好了。所以我认为所有浏览器都不允许访问剪贴板数据。

但例如在 google 文档(在类似 word 的应用程序中)中,我可以从自定义上下文菜单粘贴(右键单击假装为上下文菜单的 html 元素),即使剪贴板数据已以不同的方式复制到剪贴板像微软画图这样的应用程序。这适用于 Google Chrome 浏览器,这是我感兴趣的浏览器。

我以为他们用闪光灯来做到这一点,但它仍然有效即使我在 Chrome 中完全禁用 Flash。有一个question https://stackoverflow.com/questions/9658282/javascript-cut-copy-paste-to-clipboard-how-did-google-solve-it已经关于这一点了,但是那里提到的答案不正确。该问题的另一个答案表明谷歌正在为此使用 Chrome 扩展,但它仍然有效即使我禁用 chrome 中的所有扩展。

如何在windows下重现:

  • 禁用chrome中的Flash,禁用所有扩展
  • restart
  • 转到谷歌文档并打开新的空书写文档(文档,而不是电子表格)
  • 在 Windows 中运行 Microsoft Paint 应用程序
  • 在microsoft Paint中画一些东西,按Ctrl+A全选,Ctrl+C复制
  • 切换回 chrome 到文档空白页面,然后右键单击空白页面
  • 从人工上下文菜单中选择“粘贴”(请注意,上下文菜单不是 Windows 的本机菜单,而是来自 google docs 的 html 网页)
  • 您将看到剪贴板图像已粘贴到文档文档中(!)
  • 他们如何做到这一点?

我知道如果用户在我的网页上按 Ctrl+V,如何访问剪贴板数据,因为这会触发当前窗口上的粘贴事件。但是,我该怎么办访问剪贴板数据 or 启动实际剪贴板数据的粘贴(例如,在 mspaint 中复制的位图)在 javascript(或使用 jquery)中,而用户只需单击按钮或 div?


我希望能够在用户单击时启动真正的粘贴事件。我可以理解这可能是一个安全问题,因为......

以上是底线..

有了这个代码JSFiddle https://jsfiddle.net/Mi_Creativity/8ewhvh6n/

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'));
});
<button id="copy">Copy</button>
<button id="cut">Cut</button>
<button id="paste">Paste</button>

如果您使用不同的浏览器进行检查,您会发现浏览器在处理剪贴板API http://www.w3.org/TR/clipboard-apis/ using queryCommandSupported()结果是:

铬47:

  • 无需用户操作,复制:false , Cut:false , Past:false
  • 通过用户操作,复制:true , Cut:true, 粘贴:false

火狐 43:

  • 无需用户操作,复制:true , Cut:true , Past:false
  • 通过用户操作,复制:true , Cut:true, 粘贴:false

IE11: - 我相信Edge也是一样

  • 无需用户操作,复制:true , Cut:true , Past:true
  • 通过用户操作,复制:true , Cut:true, 粘贴:true
  • 虽然所有选项均正确,但 IE 会要求用户获得对上述所有操作的许可。

Safari: - iOS Safari 也一样

  • 仅在有效选择上触发复制事件,并且仅在聚焦的可编辑字段中剪切和粘贴。
  • 操作系统剪贴板只能通过快捷键读写,不能通过document.execCommand().

有关剪贴板 API 的详细浏览器支持caniuse.com/#search=clip http://caniuse.com/#search=clip

浏览器还支持使用右键单击上下文菜单进行粘贴conteneditable="true"像这样的元素JS 小提琴 2 https://jsfiddle.net/Mi_Creativity/36vv156n/2/


但例如在 google 文档(在类似 word 的应用程序中)中,我可以从自定义上下文菜单粘贴(右键单击假装为上下文菜单的 html 元素),即使剪贴板数据已以不同的方式复制到剪贴板像微软画图这样的应用程序。

我以为他们使用闪光灯来做到这一点,但即使我在 Chrome 中完全禁用闪光灯,它仍然有效。

From 用于开发 Google Apps 插件的 Google Apps 脚本文档 https://developers.google.com/apps-script/add-ons/:
"该平台:Apps 脚本代码编辑器是一个网络应用程序,您可以从 Google 表格、文档或表单中启动。该语言基于 JavaScript,but executes on Google's servers rather than directly in the user's browser(客户端用户界面除外......".

由于它是在他们的服务器上执行的,我认为他们可以启用某些功能,甚至使用 Java,以获得更好的体验。


EDIT 1:
如果你检查剪贴板.js https://zenorocha.github.io/clipboard.js/,您会看到该库没有“粘贴”选项,只有“复制”和“剪切”选项,也在“浏览器支持在页面末尾的“部分,您将看到该库依赖于执行命令 https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommandAPI,在 Safari 中不起作用。


EDIT 2:
Upon an update of the question as well as comments, for the Google docs part, I pressed Prt Sc to have a screen-shot in the clipboard, opened Google docs in Chrome, right-clicked then clicked on "Paste" from the custom context menu and for sure it works, opened Google docs in Firefox and as soon I clicked on "paste" option I got this response https://i.stack.imgur.com/AMCRA.png

另外郑重声明,我尝试在 IE11 中执行相同操作,但自 21 分钟以来它仍在尝试启动 Google 文档。

所以结论很可能是,而且大部分是,“Google“ Chrome 有一个例外: - 类似条件语句的东西 - for "Google“我认为他们的浏览器中的文档和其他谷歌服务@朱利安·格雷瓜尔 https://stackoverflow.com/users/4867993/julien-gr%C3%A9goire关于它是 Firefox 的扩展是正确的。

From 此 Google 文档支持页面 https://support.google.com/docs/answer/161768?hl=en:

出于安全原因,大多数浏览器不允许文档、表格和幻灯片等网络应用程序通过菜单使用计算机的剪贴板。

但是,如果您使用 Chrome,则可以通过安装 Google Drive Chrome 应用程序来授予访问剪贴板的权限。这允许您使用右键单击菜单复制和粘贴内容(或从工具栏的编辑菜单中选择“复制”或“粘贴”)。要安装该应用程序,请访问 Chrome 网上应用店。

And 这个小型企业页面 http://smallbusiness.chron.com/copy-paste-google-docs-not-working-53088.html:

如果没有键盘快捷键,您还有两个复制和粘贴选项:转到“编辑”菜单并选择“复制”或“粘贴”,或者右键单击文档并选择“复制”或“粘贴”上下文菜单。在 Google 文档中,这两个选项仅适用于安装了 Google Drive Web 应用的 Chrome 用户。该应用程序是免费的,但不适用于其他浏览器。

看来他们已经将该应用程序作为内置功能实现在较新版本的 Chrome 中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何点击粘贴?它适用于谷歌文档 的相关文章

  • 如何在 Windows 网络中的 Intranet Web 应用程序中获取用户的用户名

    我内部有一个简单的 HTML 页面 它只显示一个表单并要求用户填写 我想自动捕获Windows域用户名和机器名 并将其与表单中收集的数据一起提交 我可以在客户端这样做吗 HTML JavaScript 或者我被迫在服务器端执行此操作 我还不
  • 仅从功能区打开一个对话框

    我有一个带有登录按钮的功能区 可打开登录对话框 我想将对话框的数量限制为一个 我正在使用函数 displayDialogAsync startAddress options callback https learn microsoft co
  • 插件 gulp-babel 错误:插件/预设文件不允许导出对象,只能导出函数

    我现在尝试在我的 Ionic v1 应用程序中使用 JavaScript 2015 ES6 包 json name test version 1 0 0 dependencies ionic native deeplinks 4 18 0
  • 公开闭包内的方法

    当我们在闭包内创建一个方法时 该方法将成为该闭包的私有方法 并且在我们以某种方式公开它之前无法访问它 怎么可能暴露呢 您可以返回对它的引用 var a function var b function I m private alert go
  • 等待异步 grunt 任务完成

    我收到了 grunt 设置 其中一个新任务应该执行 grunt task run 已经存在的任务 要执行的任务是异步的 新任务应该等待异步任务完成 执行此操作的首选方法是什么 grunt 已经涵盖了这一点 你应该将你的任务声明为异步任务 并
  • 基于范围内变量的角度设置形式动作

    我一直在尝试设置一个搜索表单 可以在其中注入表单操作属性 在我的表格中我有
  • 使用 eval 时不会受到 XSS 威胁

    我正在制作 不是现在 但我仍然对这个感到好奇 一款使用 HTML5 和 JS 的游戏 我想要的是人们可以插入自定义脚本 但要安全 function executeCustomJS code eval code bad 当然这段代码非常糟糕
  • iPhone 上的锁定方向 UIWebView

    有没有办法锁定 UIWebView 的方向 使用 Obj C JS 还是 Html 我不想有按钮或任何东西 我只想在应用程序打开时将其锁定为纵向 好像这个堆栈溢出帖子 https stackoverflow com questions 43
  • 无法从 JQuery ajax 调用接收 JSON

    我已经确定来自服务器的 JSON 是有效的 手动进行 ajax 调用 但我真的很想使用 JQuery 我还使用 firebug 确定发送到服务器的 post URL 是正确的 但是 错误回调仍然被触发 解析错误 我还尝试了数据类型 文本 我
  • JS:修改 JS 对象中的值/对

    我正在尝试找出修改对象的最佳方法 而无需三次写出类似的对象 所以我有这三个对象 var object1 start start end end type 1 var object2 start start end end type 2 va
  • 当 Chrome 中嵌套滚动中的数据更改时防止页面滚动

    我在页面中有一个固定大小的元素 带有 溢出 滚动 其内容经常更改 我预计该元素内部发生的更改会影响该元素的滚动 但不会影响页面滚动 但是当这个元素位于页面顶部时 页面本身开始滚动 我怎样才能防止这种情况发生 要重现此行为 我在 chrome
  • 将默认搜索文本添加到搜索框 html

    我正在努力将 搜索 文本添加到搜索框 我正在努力实现 onfocus 消失文本 And onblur 重新出现文本 到目前为止 我已经实现了这一点 但我必须将其硬编码为 html eg
  • 为什么 console.log() polyfill 不使用 Function.apply()?

    我一直在看一些流行的console log 包装 填充 保罗 爱尔兰的 http paulirish com 2009 log a lightweight wrapper for consolelog 本阿尔曼的 http benalman
  • WebpackError:ReferenceError:Gatsby 上未定义窗口

    我已经在互联网上进行了大量搜索 但无法解决这个问题 我正在使用 Gasby 开发静态页面 但遇到此错误 WebpackError ReferenceError window is not defined 我的线索是 这与我正在使用的引导 模
  • 如何捕获文本区域上的 Enter 按键而不是 Shift+Enter? [复制]

    这个问题在这里已经有答案了 I m doing it for texarea A function should be called when the user press Enter but nothing should be done
  • D3 强制布局,较大的节点聚集在中心

    我一直在修改将用于标签云的强制布局 每个标签都由一个
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 使用严格模式编译指示时如何声明全局变量

    使用自调用函数来包装严格模式兼容代码 通常称为严格模式编译指示 被认为是一种很好的做法 function use strict Strict code here 我的问题是在这种情况下如何声明全局变量 我今天知道的三种替代方案 替代方案 1
  • Radiobutton-带有纯 html/css 的按钮

    是否可以创建像这样的单选按钮JQuery http jqueryui com demos button radio那些 用纯html css thanks 试试这个小提琴 http jsfiddle net mcXm7 1 http jsf
  • 拉斐尔路径交叉点不起作用

    我对拉斐尔和 pathIntersection method JSFiddle 示例 http jsfiddle net t6gWt 2 您可以看到有两条线都与曲线相交 但当我使用 pathIntersection method 有一个未解

随机推荐

  • 为什么向列表<>添加新值会覆盖列表<>中以前的值

    我本质上是试图将多个项目添加到列表中 但最后所有项目的值都等于最后一个项目 public class Tag public string TagName get set List
  • Java 6 内存使用过多

    对于大型应用程序 Java 6 消耗的内存是否比您预期的要多 我有一个已经开发多年的应用程序 到目前为止 在我的特定测试配置中 该应用程序占用了大约 30 40 MB 的空间 现在 对于 Java 6u10 和 11 活动时需要数百个时间
  • 如果 POST 成功但没有创建任何新内容,我们应该返回什么状态代码?

    我们有一个端点 当您发布创建新版本的资源时 它会返回 201 和新创建的资源的位置 它根据当前版本和发布的版本 使用类似 semver 的规则集 的比较来确定新版本号 如果您发布的版本与现有版本相同 则不会更新版本号 在这种情况下我们应该返
  • Windows 10 上具有 kernel32.dll 的 Dependency Walker

    我尝试打开kernel32 dll在 Windows 10 上使用 Dependency Walker 我收到以下错误和警告 错误 未找到至少一个所需的隐式或转发依赖项 警告 至少未找到一个延迟加载依赖模块 Screenshot 我运行的是
  • 强制 Scala 特征实现某种方法

    有没有办法指定特征必须提供方法的具体实现 给定一些 mixin class A extends B with C foo 如果出现以下任一情况 程序将编译A B or C实施foo 但是我们如何才能强制 例如 B包含装有foo的实施 您可以
  • 装饰器错误:NoneType 对象不可调用

    我写了一个这样的函数装饰器 def tsfunc func def wrappedFunc print s called func name return func return wrappedFunc tsfunc def foo pas
  • Android 多点触控:ACTION_UP 并不总是被调用?

    我开发了一个在视图中处理多点触控的 Android 应用程序 我基本上跟踪可能发生的几个 MotionEvent 例如 ACTION UP ACTION MOVE 我在 View 类中覆盖的 onTouch 方法如下所示 public bo
  • Kafka 0.8.2 中是否可以向现有主题添加分区

    我有一个Kafka https kafka apache org 集群运行有 2 个分区 我一直在寻找一种将分区计数增加到 3 的方法 但是 我不想丢失有关该主题的现有消息 我尝试停下来Kafka https kafka apache or
  • 向 Windows 任务栏缩略图添加按钮 JavaFX?

    这个问题已经闲置一年多了 我的问题仍然没有解决方案 我编辑此内容是为了澄清我的问题并引起人们对它的新关注 如果您使用 Windows 您可能知道将程序图标悬停在任务栏上时显示的小预览图像 缩略图 某些程序 例如 Spotify Git 扩展
  • 从应用服务中运行的 .net core 应用程序发送日志以进行日志分析

    我尝试寻找 net core 2 0 应用程序将应用程序日志发送到日志分析工作区的最简单方法 该应用程序在azure中的应用服务下运行 我尝试启用 诊断设置 并将日志存档到日志分析 但是 我没有在 AppServiceHTTPLogs 中看
  • 两个具有共享缓冲区的等待线程(生产者/消费者)

    我试图让一堆生产者线程等待 直到缓冲区有空间容纳某个项目 然后将项目放入缓冲区 如果没有更多空间 则返回睡眠状态 同时应该有一堆消费者线程等待 直到缓冲区中有东西 然后尽可能地从缓冲区中获取东西 如果缓冲区为空则返回睡眠状态 在伪代码中 这
  • 如何使用 #pragma 在 G++ 中启用优化

    我想在没有命令行参数的情况下启用 g 优化 我知道 GCC 可以通过写来做到这一点 pragma GCC optimize 2 在我的代码中 但它似乎在 G 中不起作用 此页面可能有帮助 http gcc gnu org onlinedoc
  • 我如何解决 React+Material UI 中的此错误

    当我尝试在 Mac 和 Ubuntu 中运行该应用程序时 出现以下错误 但在Windows平台下运行没有任何错误 我该如何解决这个问题 Material UI beta 版本 v1 0 0 beta 46 中是否有任何平台特定的代码 我使用
  • pandas 数据框中不重叠的滚动窗口

    我熟悉 Pandas 滚动窗口函数 但它们的步长始终为 1 我想在 Pandas 中执行移动聚合函数 但条目不重叠 In this Dataframe df rolling 2 min 将产生 N A 519 566 727 1099 12
  • 场景 - 根据 iPad 或 iPhone 使用专用故事板

    Apple 现在希望我们使用 场景 而不是窗口和屏幕来显示 iPad 和 iPhone 的内容 现在添加了对场景的支持 我似乎失去了使用故事板定位 iPad 或 iPhone 的能力 I set my scenes inside plist
  • 突然我无法为 iPhone 模拟器构建

    有时人们真的很讨厌苹果的开发环境 说真的 有必要这么复杂吗 我的问题是这样的 我无法再在模拟器上构建我的项目 我收到以下错误 我意识到这是一个链接器错误 我不明白的是 1 为什么它突然不再工作 2 它为什么不会选择正确的 SDK 这是链接器
  • 检测字符串中的所有大写字母

    我在尝试在 JavaScript 中编写正则表达式时遇到问题 该正则表达式可以检测以全部大写字母键入的至少 2 个字符的整个单词 这是我尝试过的并且似乎有效 b Wa z0 9 b 但是 我会检测用户是否开始字符串 我喜欢你 因为 I 是大
  • Objective-C 中如何检查一个字符是否为数字?

    我需要检查一个字符是否是数字 NSString strTest Test55 char c strTest characterAtIndex 4 我需要找出 c 是否是数字 我怎样才能在 Objective C 中实现这个检查 Note 返
  • Android 模拟器冻结

    在上一个 SDK 版本发布之前 我的 Android 模拟器在 x86 架构上运行得非常好 安装了 Intel HAXM 并在 AVD Manager 中为设备启用了 GPU 使用最新的 SDK 版本 我重新安装了 Windows 从 8
  • 如何点击粘贴?它适用于谷歌文档

    我希望能够在用户单击时启动真正的粘贴事件 我可以理解这可能是一个安全问题 因为如果任何网页可以访问用户剪贴板 那就不好了 所以我认为所有浏览器都不允许访问剪贴板数据 但例如在 google 文档 在类似 word 的应用程序中 中 我可以从