The notificationclick
event of the ServiceWorkerGlobalScope
interface is fired to indicate that a system notification spawned by ServiceWorkerRegistration.showNotification()
has been clicked.
Notifications created on the main thread or in workers which aren't service workers using the Notification()
constructor will instead receive a click
event on the Notification
object itself.
This event is not cancelable and does not bubble.
Use the event name in methods like addEventListener()
, or set an event handler property.
addEventListener("notificationclick", (event) => {});
onnotificationclick = (event) => {};
Inherits properties from its ancestors, ExtendableEvent
and Event
.
-
NotificationEvent.notification
Read only
-
Returns a Notification
object representing the notification that was clicked to fire the event.
-
NotificationEvent.action
Read only
-
Returns the string ID of the notification button the user clicked. This value returns an empty string if the user clicked the notification somewhere other than an action button, or the notification does not have a button.
You can use the notificationclick
event in an addEventListener
method:
self.addEventListener("notificationclick", (event) => {
console.log("On notification click: ", event.notification.tag);
event.notification.close();
event.waitUntil(
clients
.matchAll({
type: "window",
})
.then((clientList) => {
for (const client of clientList) {
if (client.url === "/" && "focus" in client) return client.focus();
}
if (clients.openWindow) return clients.openWindow("/");
}),
);
});
Or use the onnotificationclick
event handler property:
self.onnotificationclick = (event) => {
console.log("On notification click: ", event.notification.tag);
event.notification.close();
event.waitUntil(
clients
.matchAll({
type: "window",
})
.then((clientList) => {
for (const client of clientList) {
if (client.url === "/" && "focus" in client) return client.focus();
}
if (clients.openWindow) return clients.openWindow("/");
}),
);
};
You can handle event actions using event.action
within a notificationclick
event handler:
navigator.serviceWorker.register("sw.js");
Notification.requestPermission().then((result) => {
if (result === "granted") {
navigator.serviceWorker.ready.then((registration) => {
registration.showNotification("New mail from Alice", {
actions: [
{
action: "archive",
title: "Archive",
},
],
});
});
}
});
self.addEventListener(
"notificationclick",
(event) => {
event.notification.close();
if (event.action === "archive") {
archiveEmail();
} else {
clients.openWindow("/inbox");
}
},
false,
);