440

How does one use Chrome desktop notifications? I'd like that use that in my own code.

Update: Here's a blog post explaining webkit notifications with an example.

7

8 Answers 8

760

In modern browsers, there are two types of notifications:

  • Desktop notifications - simple to trigger, work as long as the page is open, and may disappear automatically after a few seconds
  • Service Worker notifications - a bit more complicated, but they can work in the background (even after the page is closed), are persistent, and support action buttons

The API call takes the same parameters (except for actions - not available on desktop notifications), which are well-documented on MDN and for service workers, on Google's Web Fundamentals site.


Below is a working example of desktop notifications for Chrome, Firefox, Opera and Safari. Note that for security reasons, starting with Chrome 62, permission for the Notification API may no longer be requested from a cross-origin iframe, so we can't demo this using StackOverflow's code snippets. You'll need to save this example in an HTML file on your site/application, and make sure to use localhost:// or HTTPS.

// request permission on page load
document.addEventListener('DOMContentLoaded', function() {
 if (!Notification) {
  alert('Desktop notifications not available in your browser. Try Chromium.');
  return;
 }

 if (Notification.permission !== 'granted')
  Notification.requestPermission();
});


function notifyMe() {
 if (Notification.permission !== 'granted')
  Notification.requestPermission();
 else {
  var notification = new Notification('Notification title', {
   icon: 'http://cdn.sstatic.net/stackexchange/img/logos/so/so-icon.png',
   body: 'Hey there! You\'ve been notified!',
  });
  notification.onclick = function() {
   window.open('http://stackoverflow.com/a/13328397/1269037');
  };
 }
}
 <button onclick="notifyMe()">Notify me!</button>

We're using the W3C Notifications API. Do not confuse this with the Chrome extensions notifications API, which is different. Chrome extension notifications obviously only work in Chrome extensions, and don't require any special permission from the user.

W3C notifications work in many browsers (see support on caniuse), and require user permission. As a best practice, don't ask for this permission right off the bat. Explain to the user first why they would want notifications and see other push notifications patterns.

Note that Chrome doesn't honor the notification icon on Linux, due to this bug.

Final words

Notification support has been in continuous flux, with various APIs being deprecated over the last years. If you're curious, check the previous edits of this answer to see what used to work in Chrome, and to learn the story of rich HTML notifications.

Now the latest standard is at https://notifications.spec.whatwg.org/.

As to why there are two different calls to the same effect, depending on whether you're in a service worker or not - see this ticket I filed while I worked at Google.

See also notify.js for a helper library.

20
  • 4
    @mghaoui - popular != true (necessarily). i've marked this one as the correct answer. Commented Feb 17, 2013 at 21:07
  • 2
    window.webkitNotifications.checkPermission() will throw an exception in non-Chrome browsers Commented Jul 11, 2013 at 23:24
  • 2
    Close is not a method. I think you want notification.cancel() > decadecity.net/blog/2012/10/12/webkit-notification-api >> Also it appears to close on its own. Commented May 9, 2014 at 17:46
  • 3
    Thank you for the support, using this with Pusher has helped me building notification system.
    – Awijeet
    Commented Jun 20, 2015 at 18:05
  • 4
    not working in Chrome Version 47.0.2526.80 dev-m while worked on Mozilla Fire fox on Windows 8
    – Sarz
    Commented Dec 13, 2015 at 20:13
94
+150

Check the design and API specification (it's still a draft) or check the source from (page no longer available) for a simple example: It's mainly a call to window.webkitNotifications.createNotification.

If you want a more robust example (you're trying to create your own Google Chrome's extension, and would like to know how to deal with permissions, local storage and such), check out Gmail Notifier Extension: download the crx file instead of installing it, unzip it and read its source code.

4
35

See also ServiceWorkerRegistration.showNotification

It appears that window.webkitNotifications has already been deprecated and removed. However, there's a new API, and it appears to work in the latest version of Firefox as well.

function notifyMe() {
  // Let's check if the browser supports notifications
  if (!("Notification" in window)) {
    alert("This browser does not support desktop notification");
  }

  // Let's check if the user is okay to get some notification
  else if (Notification.permission === "granted") {
    // If it's okay let's create a notification
    var notification = new Notification("Hi there!");
  }

  // Otherwise, we need to ask the user for permission
  // Note, Chrome does not implement the permission static property
  // So we have to check for NOT 'denied' instead of 'default'
  else if (Notification.permission !== 'denied') {
    Notification.requestPermission(function (permission) {

      // Whatever the user answers, we make sure we store the information
      if(!('permission' in Notification)) {
        Notification.permission = permission;
      }

      // If the user is okay, let's create a notification
      if (permission === "granted") {
        var notification = new Notification("Hi there!");
      }
    });
  } else {
    alert(`Permission is ${Notification.permission}`);
  }
}

codepen

7
  • @Miron Please take a look at the hyperlink in the first paragraph. I linked the source, and then copied the code into my answer as per SO etiquette. If MDN wasn't a wiki I might have been more explicit about who the author was, but I'm not pretending anything.
    – mpen
    Commented Nov 17, 2017 at 18:40
  • I don't see where he said he wrote it?
    – brandito
    Commented Nov 21, 2017 at 3:02
  • codepen doesn't work Commented Mar 19, 2019 at 23:13
  • 1
    @StepanYakovenko Try the codepen link again. I added an extra else at the end to tell you what the problem is. You probably globally disabled notifications like me :\
    – mpen
    Commented Mar 20, 2019 at 0:45
  • This doesn't work on Android Chrome any more: VM121:10 Uncaught TypeError: Failed to construct 'Notification': Illegal constructor. Use ServiceWorkerRegistration.showNotification() instead. Commented Jun 29, 2020 at 11:17
14

I like: http://www.html5rocks.com/en/tutorials/notifications/quick/#toc-examples but it uses old variables, so the demo doesn't work anymore. webkitNotifications is now Notification.

3
5

I made this simple Notification wrapper. It works on Chrome, Safari and Firefox.

Probably on Opera, IE and Edge as well but I haven't tested it yet.

Just get the notify.js file from here https://github.com/gravmatt/js-notify and put it into your page.

Get it on Bower

$ bower install js-notify

This is how it works:

notify('title', {
    body: 'Notification Text',
    icon: 'path/to/image.png',
    onclick: function(e) {}, // e -> Notification object
    onclose: function(e) {},
    ondenied: function(e) {}
  });

You have to set the title but the json object as the second argument is optional.

6
  • @gravmatt have you encountered an issue with Firefox where if there is more then one browser window open, the notification does not appear ?
    – eran otzap
    Commented Feb 21, 2017 at 11:57
  • @eranotzap it should work with multiple tabs. I run a project where this is no problem. but I'm not sure with multiple windows.
    – gravmatt
    Commented Feb 21, 2017 at 15:58
  • I have the same problem with multiple tabs
    – eran otzap
    Commented Feb 21, 2017 at 16:36
  • Does it work from multiple tabs in Firefox ?
    – eran otzap
    Commented Feb 21, 2017 at 16:38
  • 1
    @eranotzap I tested it now on windows and mac. I can't see the notification in any corner of the screen but I hear the sound of the notifications and on mac I get the notification in the sidebar (with multiple tabs open). Firefox is the new internet explorer.
    – gravmatt
    Commented Feb 22, 2017 at 16:27
5
<!DOCTYPE html>

<html>

<head>
<title>Hello!</title>
<script>
function notify(){

if (Notification.permission !== "granted") {
Notification.requestPermission();
}
 else{
var notification = new Notification('hello', {
  body: "Hey there!",
});
notification.onclick = function () {
  window.open("http://google.com");
};
}
}
</script>
</head>

<body>
<button onclick="notify()">Notify</button>
</body>

4
  • 2
    Please refrain from posting code-only answers. Add a bit of comments and/or explanation, so that when people read this post in the future they will understand it.
    – Adriaan
    Commented Oct 8, 2016 at 21:04
  • For this particular code snippet, it seems pretty straightforward, though. Other users could also post a follow up question on the comment, right?
    – frostshoxx
    Commented Nov 16, 2017 at 15:54
  • 1
    JSfiddle with the code above does not work, "Permission for the Notification API may no longer be requested from a cross-origin iframe.". However, when you open the Developer console, and enter Notification.requestPermission();, then var notification = new Notification('hello', { body: "Hey there!", }); the notification shows up.
    – Avatar
    Commented Dec 22, 2017 at 11:07
  • 1
    I'm sorry, but what exactly does this answer add to mine? Commented May 12, 2019 at 17:07
3

Here is nice documentation on APIs,

https://developer.chrome.com/apps/notifications

And, official video explanation by Google,

https://developers.google.com/live/shows/83992232-1001

1
3

Notify.js is a wrapper around the new webkit notifications. It works pretty well.

http://alxgbsn.co.uk/2013/02/20/notify-js-a-handy-wrapper-for-the-web-notifications-api/

Not the answer you're looking for? Browse other questions tagged or ask your own question.