【问题标题】:navigator.clipboard.writeText(...) fails, document.execCommand('copy') works inconsistentlynavigator.clipboard.writeText(...) 失败,document.execCommand(\'copy\') 工作不一致
【发布时间】:2022-09-30 23:47:14
【问题描述】:

我有一个带有 iframe 的网页,主页上有一个 Copy 按钮,该按钮向 iframe 内的一个函数发送消息,旨在生成一个链接并将其放入剪贴板,但它不能始终如一地工作。 我正在使用 Chrome。

我尝试使用navigator.clipboard API,它总是失败并且e 未定义 - 没有给出 writeText 失败的原因

function copyText(text){
  if (navigator && navigator.clipboard && navigator.clipboard.writeText) {
    navigator.clipboard.writeText(text).then(
      () => console.log("Copied text OK"),
      (e) => console.log("Failed to copy text",e)
    );
  }
}

然后我在这里尝试了其他帖子的代码

 if (window.clipboardData && window.clipboardData.setData) {
    return window.clipboardData.setData('Text', text);
 }

以上内容在 Chrome 中无法运行,if 的计算结果为 false

另一种尝试,也来自 SO 中的另一个答案,是创建一个文本元素并复制其内容:

var tel = document.createElement('textarea');
tel.textContent = text;
document.body.appendChild(tel);
tel.select();

try {
    var isok = document.execCommand('copy');
    console.log("exec(copy) returned:", isok);
} catch (err) {
    console.log("exec(copy) failed", err);
}
finally {
    document.body.removeChild(tel);
}

上面的代码没有在控制台中显示“失败”消息,但也没有在剪贴板中设置值。在这些情况下,isok 是错误的。但是,如果我与页面交互 - 先单击其他内容 - 它确实有效。

我正在用一个静态的text 值测试这个,一个不会改变的链接,所以传递给函数的文本没有什么不同。该函数确实被调用,并通过调试器确认。

我错过了什么?

【问题讨论】:

  • iframe 甚至有剪贴板权限吗?如果没有,您可以尝试将消息发送回主页,然后让主页进行复制。另外,您确定控制台中没有显示错误或警告并说明失败的原因吗?通常原因对调用者代码是隐藏的,但对开发人员来说是一个日志条目可见。另请注意,通常需要用户意图(例如单击)才能进行复制。
  • 一旦我与 iframe 交互,它就会复制它应该复制的文本,我开始认为它是有条件的。控制台中没有错误
  • 您确定 e 未定义并且控制台中没有显示任何内容吗?如果我测试它,我会得到一个名称为NotAllowedError 和消息Document is not focused.DOMException,正如我预期的那样。
  • 就我而言,它是未定义的,是的

标签: javascript google-chrome clipboard


【解决方案1】:

如果您的按钮位于 iframe 内,则除非已定义或加载到 iframe 文档中,否则它将无法访问复制功能的定义。

如果您在 main/top 文档中定义函数,您将能够在控制台中运行此函数,但您的按钮将无法从 iframe 内部访问该函数。

【讨论】:

  • 复制按钮位于 iframe 之外,它会向 iframe 内部发送一条消息,复制发生的地方
猜你喜欢
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多