Javascript 如何将web通知内容复制到剪贴板
我正在使用Firebase云消息(FCM)发送数据消息,以便我可以使用服务工作者处理通知。现在,我使用Service Worker显示通知,当我单击通知时,我希望将通知的内容复制到剪贴板中Javascript 如何将web通知内容复制到剪贴板,javascript,service-worker,web-notifications,Javascript,Service Worker,Web Notifications,我正在使用Firebase云消息(FCM)发送数据消息,以便我可以使用服务工作者处理通知。现在,我使用Service Worker显示通知,当我单击通知时,我希望将通知的内容复制到剪贴板中 const messaging = firebase.messaging(); messaging.setBackgroundMessageHandler((payload)=> { const title = payload.data.title; const options = {
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler((payload)=> {
const title = payload.data.title;
const options = {
body: payload.data.body
};
return self.registration.showNotification(title,
options);
});
self.addEventListener('notificationclick', (event)=>{
console.log(event);
navigator.clipboard.writeText(event).then(function() {
console.log('Async: Copying to clipboard was successful!');
}, function(err) {
console.error('Async: Could not copy text: ', err);
});
});
单击通知时,notificationclick
事件被触发。但我发现navigator.clipboard
未定义。我也使用我的网站的安全域。我也无法使用document.execcommand('copy')
,因为无法使用Service Worker访问DOM。您能建议一种不打开任何url复制通知内容的方法吗?您可以使用客户端API:
服务人员:
self.addEventListener('notificationclick', (event)=>{
console.log(event);
if (!event.clientId) return;
const client = await clients.get(event.clientId);
if (!client) return;
client.postMessage({
type: 'clipboard',
msg: event
});
});
简单脚本:
navigator.serviceWorker.addEventListener('message', event => {
if(event.data.type === 'clipboard') {
navigator.clipboard.writeText(event.data.msg).then(function() {
console.log('Async: Copying to clipboard was successful!');
}, function(err) {
console.error('Async: Could not copy text: ', err);
});
}
});
请记住,Safari不支持此功能。您无法从ServiceWorker复制到剪贴板。您需要一个活动的前台浏览器选项卡/窗口才能复制到剪贴板
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler((payload)=> {
const title = payload.data.title;
const options = {
body: payload.data.body
};
return self.registration.showNotification(title,
options);
});
self.addEventListener('notificationclick', (event)=>{
console.log(event);
navigator.clipboard.writeText(event).then(function() {
console.log('Async: Copying to clipboard was successful!');
}, function(err) {
console.error('Async: Could not copy text: ', err);
});
});
从chrome web更新存档
与许多新API一样,navigator.clipboard仅支持通过HTTPS提供的页面为帮助防止滥用,仅当页面是活动选项卡时才允许访问剪贴板。活动选项卡中的页面可以在不请求权限的情况下写入剪贴板,但从剪贴板读取总是需要权限。
我还检查了ServiceWorkers和Clipboard API的浏览器规范,没有定义任何关于ServiceWorkers上下文的特定内容
编辑:关于这个具体问题,我已经向那篇文章的作者发了ping
我不相信它在服务人员中可用。我的建议是让通知单击处理程序打开一个尚未打开的页面,并在收到事件时在该页面内同步调用writeText()
我认为你们需要这样:你们将能够在客户端做你们想做的事情。如果对您有帮助,请告诉我,我会让您感觉必须打开实际的浏览器窗口才能运行copy命令,否则您将无法访问该API。也许打开它,复制和关闭可以像从未发生过的那样发生?即使知道它不理想,我也会尝试了解它是如何运行的。@Gilsdav as postMessage仅适用于DOM,但我不想打开任何窗口。@enapupe是的,navigator.cilpborad将不起作用。但我正在寻找其他方法来实现同样的目标。正如我提到的,我不想打开一页。那么我们将如何执行简单的脚本呢?我认为您可以打开一个只复制到clipbloard
clients.openWindow
的窗口,然后直接关闭它自己。