【发布时间】: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