navigator.clipboard是undefined
为什么在下面的片段中,navigator.clipboard
总是undefined
?
var clipboard = navigator.clipboard;
if (clipboard == undefined) {
console.log('clipboard is undefined');
} else {
clipboard.writeText('stuff to write').then(function() {
console.log('Copied to clipboard successfully!');
}, function() {
console.error('Unable to write to clipboard. :-(');
});
}
关于剪贴板API的更多信息,可以在这里找到。
浏览器版本:68.0.3440.106。
我确信这在某些时候是可行的,但现在已经不行了。这很令人困惑,因为此表表明Chrome中实现了剪贴板API(已经有一段时间了),但此表的具体API方法表明,该API的所有方法都不被支持?
clipboard
对象是可用的!这解释了为什么我确信它曾之前一直在工作。也许我应该把所有的http转为https。谢谢......如果你提交一个答案,我将把它标记为正确。
- drmrbrewer 2018-08-13
这需要一个安全的起源--HTTPS或localhost(或者通过运行Chrome浏览器的标志来禁用)。就像ServiceWorker一样,这种状态通过导航器对象上的属性的存在或不存在来表示。
https://developers.google.com/web/updates/2018/03/clipboardapi
这在规范中以[SecureContext]对接口进行了说明:https://w3c.github.io/clipboard-apis/#dom-navigator-clipboard
你可以检查window.isSecureContext
的状态,了解这是否是某个功能不可用的原因。安全上下文 | MDN
是的,你应该设置HSTS,以确保HTTP重定向到HTTPS。
chrome://flags
中,启用Insecure origins treated as secure
,并给它一个你想要的原点。
- Rokit 2020-12-07
你可以写一个全能型的包装函数。
- 如果在安全环境下(https):使用导航仪剪贴板api
- 如果没有:使用 "视口外隐藏文本区 "的技巧。
async function copyToClipboard(textToCopy) {
// Navigator clipboard api needs a secure context (https)
if (navigator.clipboard && window.isSecureContext) {
await navigator.clipboard.writeText(textToCopy);
} else {
// Use the 'out of viewport hidden text area' trick
const textArea = document.createElement("textarea");
textArea.value = textToCopy;
// Move textarea out of the viewport so it's not visible
textArea.style.position = "absolute";
textArea.style.left = "-999999px";
document.body.prepend(textArea);
textArea.select();
try {
document.execCommand('copy');
} catch (error) {
console.error(error);
} finally {
textArea.remove();
}
});
}
使用 ..:
try {
await copyToClipboard("I'm going to the clipboard !");
console.log('Text copied to the clipboard!');
} catch(error) {
console.error(error);
}
ps:不要在像jsfiddle/copeden/这样的复制中尝试。
textArea.style.position = "absolute"; textArea.style.opacity = 0;
,我认为焦点调用是不必要的
- NanoNova 2021-03-13
DOMException: Document is not focused.
:( 从chrome的代码片段中调用它。
- Kamajabu 2022-03-12
试试这个吧:
if (typeof (navigator.clipboard) == 'undefined') {
console.log('navigator.clipboard');
var textArea = document.createElement("textarea");
textArea.value = linkToGo;
textArea.style.position = "fixed"; //avoid scrolling to bottom
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
var successful = document.execCommand('copy');
var msg = successful ? 'successful' : 'unsuccessful';
toastr.info(msg);
} catch (err) {
toastr.warning('Was not possible to copy te text: ', err);
}
document.body.removeChild(textArea)
return;
}
navigator.clipboard.writeText(linkToGo).then(function () {
toastr.info(`successful!`);
}, function (err) {
toastr.warning('unsuccessful!', err);
});
在localhost,剪贴板被chrome浏览器屏蔽了。你可以通过以下路径来检查
Chrome > settings > privacy and Security > site settings > View permissions and data stored across sites 然后点击你的本地主机 URL,它会在页面上显示并检查剪贴板的权限
当HTTPS还不能使用时,用document.execCommand('copy')的解决方案不能工作,这是一个复制工具提示的最小解决方案。 但它需要用户用手选择并复制显示在提示中的内容。
function copyToClipboard(text) {
if(navigator.clipboard) {
navigator.clipboard.writeText(text);
}
else{
alert(text);
}
}
这个解决方案目前是可行的(它包括跨浏览器支持、错误处理+清理)。
你可以使用:
改为:
navigator.clipboard.writeText("内容")
改为:navigator['clipboard'].writeText("Content")代替。