如何从JavaScript获取复制的文本

时间:2018-11-03 16:40:57

标签: javascript copy clipboard

该问题与another question I asked有关,但我意识到该问题中的一个旁题值得它自己的问题。

使用JavaScript,我想查看用户正在从网页复制什么。当用户粘贴

时,读取剪贴板内容非常容易:
document.addEventListener("paste", e => {
  let text = e.clipboardData.getData("text");
  alert("pasting text: " + text);
});

这将正确创建一个警报,粘贴任何内容。但是,当用户复制

时,获取剪贴板数据更加​​困难。

方法1(无效)

document.addEventListener("copy", e => {
  let text = e.clipboardData.getData("text");
  alert("copying text: " + text);
});

这会提示“正在复制数据:”,但后面没有文字。这是因为getData方法返回""(空字符串)。我的理解是,在您执行粘贴操作以外的其他任何操作时,如果站点无法读取剪贴板,将被视为一个非常安全的问题。

方法2(可行,但带有弹出窗口)

document.addEventListener("copy", () => {
  navigator.clipboard.readText().then(text => alert("copied text: " + text));
});

这可行,但是在发出警报之前,它会创建一个弹出窗口,要求网站允许其读取剪贴板。我希望没有此弹出窗口。

方法3(似乎可行,但似乎不正确)

document.addEventListener("copy", () => {
  let text = window.getSelection().toString();
  alert("copying text: " + text);
});

这似乎可以满足我的要求。允许这样做似乎很奇怪,但是方法1却不允许。

我有几个问题:

  1. 如果方法3是不允许的,为什么不允许方法1?似乎方法1可以提供与方法3相同的信息,并且将更加方便且安全。
  2. 在任何情况下,方法3都会提供与方法2不同的结果(就text变量而言,不是弹出行为)?
  3. 我没有考虑使用方法3的其他缺点吗?

目前,我仅在Google Chrome或Chromium的环境中关心这些答案,而不是其他浏览器。对这些问题中的任何一个的回答将不胜感激。

1 个答案:

答案 0 :(得分:1)

tl; dr 如果确实认为对用户不诚实的做法是合理的,则使用方法3。这是一个很好的解决方法,尽管许多人可能认为这是一种利用。 / p>

看看W3规范(https://www.w3.org/TR/clipboard-apis/#Cases),我们可以了解到为什么这些事件(以及仍在开发中的API)首先存在的原因。具体来说,copy可以让您更改,以在目标paste不是目标用户实际想要放置到剪贴板的情况下复制的内容存在,可以让您处理将数据传输到应用程序中。

知道了这一点,我们可以得出一些结论:

  • 方法1 :该规范并未详细介绍剪贴板安全性,只是打算使实施方式能够保护用户。因此,对于您隐藏的复制数据,我并不感到惊讶。实施者似乎做出了明智的决定。不仅如此,查看规范中列出的算法,剪贴板中很有可能还没有数据,因为该事件的目的是允许您设置 >应该结束他们的生活。
  • 方法2 :这似乎更多是作者的意图。 如果一个应用程序要访问剪贴板,它实际上应该获得用户的许可。尤其是因为剪贴板可能包含来自页面外部的数据。
  • 方法3 :这是一种利用,但很难看到无法使用的情况。从实现者的角度来看,很难阻止-因为他们必须检查事件委托函数的调用;相比于“不让数据随时可用”。可以说,它也是足够安全的,因为您可以访问的唯一信息就是您自己文档中已经存在的信息。