【发布时间】:2015-11-12 22:52:00
【问题描述】:
我有一个像这样的input HTML 元素:
<input title="clipboard" id="clipboard-input" type="text" value="">
我已经将它的粘贴事件与 jquery 绑定到一个不相关的自定义代码,但是当元素聚焦时按下 ctrl+v 时,此绑定有效。
现在,我创建了一个用于触发粘贴事件的按钮。这只是一个简单的button,点击事件绑定到一个函数,其主体如下:
$("#clipboard-input")[0].focus();
document.execCommand("paste");
按下按钮时会触发click事件,剪贴板元素获得焦点,但execCommand不会触发粘贴事件。阅读文档这应该可以工作,因为它是调用 execCommand 但由于某种原因 execCommand 返回 false 的用户启动操作,这意味着它失败了。
我正在寻找一个不使用 Flash 的跨浏览器解决方案。
编辑:
我创建了 MWE(最小的非工作示例)here。尝试直接在输入字段中粘贴一些内容,粘贴处理程序将被调用,更改段落中的文本。但是当按钮被按下时,输入字段被聚焦但execCommand未能触发粘贴事件。
【问题讨论】:
-
我认为这是一个安全问题,您无法从剪贴板中读取。
-
我不是试图从中读取,而是触发一个标准事件,最终触发 onpaste 处理程序。只有这样才能读取剪贴板,并且通过尝试在元素集中时直接执行 ctrl+v 来证明这是可行的。现在,如果安全问题甚至应该调用
execCommand("paste"),那么我认为使用这种方法没有意义,因为如果即使用户启动操作(通过单击按钮)也不能使用它,那么它就不能永远被使用。 -
我认为该事件仅由用户发起是不够的,您在哪里找到此声明?想一想:如果用户启动就足够了,那么任何网站都可以从您的剪贴板中读取数据,只要它们能让您点击鼠标。你能解释一下你想做什么吗?也许还有其他解决方案。
-
我认为使用这种方法没有意义,因为 (..) 它永远无法使用 -- 它的存在是因为在某些时候有人认为它是好主意,然后发现了一个漏洞并禁用了该功能。对我来说似乎并不奇怪。该函数可能仍然存在以避免破坏现有代码。
-
您可能是正确的,通过在开始时放置 return false 来禁用特定方法。但是“为了避免破坏现有代码”,任何依赖此功能的代码都将被破坏。哦,对于第一部分,MDN 站点 (developer.mozilla.org/en-US/docs/Web/API/Document/execCommand) 上的粘贴有注释 [1],它表示允许弹出新窗口(半可信)的事件处理程序执行命令( “粘贴”)自 Firefox 41 起。我相信单击按钮确实允许打开一个新窗口。
标签: javascript jquery html cross-browser paste