javascript - Javascript 剪贴板 API write() 在 Safari 中不起作用
问题描述
我正在使用 javascript Clipboard API 将图像复制到剪贴板。尽管 Safari 的官方文档说它受支持,但它在 Chrome 和 Edge 中有效,但在 Safari 中无效。
检查文档:https ://webkit.org/blog/10855/
在这个例子中(不是我的真实代码), write() 抛出一个错误:
document.getElementById("copy").addEventListener("click", async function() {
const response = await fetch('https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png');
const blob = await response.blob();
navigator.clipboard.write([new ClipboardItem({ "image/png": blob })])
.then(function () { console.log('copied'); })
.catch(function (error) { console.log(error); });
});
给定的错误是:
NotAllowedError:当前上下文中用户代理或平台不允许该请求,可能是因为用户拒绝了权限。
解决方案
这是因为您在调用之前调用了 await clipboard.write
。苹果不允许这样做。你必须像这样直接传递你的承诺ClipboardItem
:
document.getElementById("copy").addEventListener("click", async function() {
const makeImagePromise = async () => {
const response = await fetch('https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png');
return await response.blob();
}
navigator.clipboard.write([new ClipboardItem({ "image/png": makeImagePromise() })])
.then(function () { console.log('copied'); })
.catch(function (error) { console.log(error); });
});
推荐阅读
- javascript - 如何在 JavaScript 中获取 MySQL 查询的第一行?
- java - 尝试在 TableView 上单击人员列表并更新一个组合框
- html - 如何通过标签的一部分显示字段集边框?
- angular - 将请求包装在数组中
- javascript - 我在哪里调用 websocket 插件以使其始终处于打开状态?
- android - 我们可以将标签分配给
陈述 - reactjs - 如何正确触发 redux thunk
- excel - VBA - UDF 结果显示不正确
- django - 无法在同一行中获取下拉菜单,并且仅在提交表单时写入一次
- c# - 如何创建支持外部扩展的 EFCore Sqlite 上下文