我试图通过在聚焦的 DOM 元素上执行“复制”命令来修改剪贴板的内容。但是,新内容来自服务器,并从 Websocket 到达,然后在并非来自直接用户交互的回调中进行处理。
因为它不是由用户触发的,所以不允许执行诸如修改剪贴板内容之类的操作,如 Firefox 的 MDM 网站 中所规定的。错误信息是:
document.execCommand(‘cut’/‘copy’) 被拒绝,因为它不是 从短暂运行的用户生成的事件处理程序内部调用。
为了解决这个问题,同一页面建议通过
navigator.permissions.query()
: 向浏览器请求权限
navigator.permissions.query({name: "clipboard-write"}).then(result => {
if (result.state == "granted" || result.state == "prompt") {
/* write to the clipboard now */
}
});
但是,认为文章中他们使用不同的名称来表示权限:
clipboard-write
clipboard-read
clipboardWrite
clipboardRead
在同一站点中,权限文章显示了 浏览器兼容性表,其中表示 Firefox 支持版本 51 的
clipboardWrite
和版本 54 的 clipboardRead
。
问题是这些权限在 Firefox 上都不起作用(我使用的是 Firefox 63)。查询回调永远不会被调用。我已经尝试了四个权限名称,但没有任何运气。
为了确保该机制正常工作,我测试了其他权限,例如
notifications
,它运行完美(它显示“提示”)
navigator.permissions.query({name: "notifications"}).then(result => {
alert(result.state)
});
所以我的问题是:我在请求权限时是否做错了什么,或者此权限是否已更改?
在 Firefox 124.0.1(可能更高)中,在 about:config 中将 dom.events.asyncClipboard.clipboardItem 设置为 true 来启用它。
背景: 我不明白围绕此的权限策略讨论(这似乎阻止了该功能在 Firefox 中发布)。访问剪贴板是有风险的,所以只需询问客户端的用户“站点喜欢访问剪贴板 - 可以吗”,就像 Edge 那样。