【问题标题】:document.execCommand("paste") doesn't executedocument.execCommand("paste") 不执行
【发布时间】: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


【解决方案1】:

这是一个特定的命令,仅当浏览器处于设计模式时才有效,即文档被转换为公开 RTE 功能的编辑器,确切的语法是

document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)

参考:https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand

【讨论】:

  • 这是无效的答案。当我毫无问题地聚焦可编辑元素(这意味着复制事件在聚焦元素上触发)并且不必让浏览器进入设计模式(无论这意味着什么)时,我可以调用 document.execCommand("copy")。
  • 提供您用于测试的整个代码,并且不需要使用 id $("#clipboard-input")[0] 传递索引值。我没有足够高的代表发表评论,所以必须回答。阅读:help.dottoro.com/ljcvtcaw.php
  • 我已经用示例更新了问题。最初用打字稿编写的事情变得更加复杂,因此需要 [0] 因为 $()​​ 返回 JQuery 对象,而 $()[0] 是此查询的第一个 HTML 元素 - 输入字段。
  • 我已经更新了编辑部分中的示例,以便启用 designMode。您可以通过单击段落文本并在那里写一些东西来测试它。该段落已更改,如果 designMode 未打开,则显然无法正常工作。但无论如何粘贴都不起作用,可以在 cosole 中验证(execCommand 的返回值为 false)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
相关资源
最近更新 更多