# How to Display Desktop Notifications using JavaScript

By Atta Ur Rehman Shah (https://attacomsian.com/about). Published May 3, 2019, updated Oct 4, 2022. Topics: JavaScript.
Canonical URL: https://attacomsian.com/blog/desktop-notifications-javascript

> An introductory guide to learning how to use the JavaScript Notifications API to show desktop notifications.

JavaScript Notifications API enables web pages to display messages to users on their devices across different platforms. These notifications appear regardless the user has switched between tabs or moved to another application.

These messages (also called **system** or **desktop** notifications) can be used to notify the user about important events such as an email, new social media message, live chat notification, calendar reminders, etc. You can even use system notifications to send marketing campaigns.

In this tutorial, I'll explain a simple usage of Notifications API to display messages to the user while the site is opened in a browser tab.

## Browser Support

The Notifications API is fairly new and may not work in older browsers. Therefore, you should explicitly verify if the API is supported by the browser before showing a message. You can do this by checking if the `window` object has a property called `Notification`:

```javascript
if (!window.Notification) {
  console.log('Browser does not support notifications.')
} else {
  // display message here
}
```

On supported platforms, displaying a desktop notification involves two things: requesting permission and creating a new notification object.

> **Note:** The Notification API requires your website to use an SSL certificate. It does not work on insecure origins (HTTP).

## Requesting Permission

The user must grant the current origin permission to show a desktop notification. You can always check if the user has already granted permission to display system notifications using the `Notification.permission` property. 

This property has the following possible values:

* `default` - The user has not yet decided to accept notifications from your site
* `granted` - The user has allowed your site to display notifications
* `denied` - The user has chosen to block notifications from your site

If it is the first case, you can request permission from the user using the `requestPermission()` method of the Notifications API. It will open a dialog to ask the user to allow or block notifications from this site. Once the user has made a choice, the setting will be saved for the current session.

If the user has already denied the request for showing notifications, we can not do anything. The browser will ignore any request to display a notification or request permission again.

```javascript
if (!window.Notification) {
  console.log('Browser does not support notifications.')
} else {
  // check if permission is already granted
  if (Notification.permission === 'granted') {
    // show notification here
  } else {
    // request permission from the user
    Notification.requestPermission()
      .then(function (p) {
        if (p === 'granted') {
          // show notification here
        } else {
          console.log('User blocked notifications.')
        }
      })
      .catch(function (err) {
        console.error(err)
      })
  }
}
```

The `requestPermission()` method returns a [promise](https://attacomsian.com/blog/promises-javascript). The callback function will be called once the promise is resolved or rejected (upon user choice of notifications).

## Showing Notification

If the user has chosen to accept notifications from our site, you can create a new desktop notification using the `Notification()` constructor to display to the user. Just pass a title to the constructor to create a new notification. 

```javascript
const notify = new Notification('Hi there!')
```

Optionally, you can also pass an options object to specify text direction, body text, an icon to display, notification sound to play, and more.

```javascript
const notify = new Notification('Hi there!', {
  body: 'How are you doing?',
  icon: 'https://bit.ly/2DYqRrh'
})
```

Putting everything all together, we can create a function that will show a desktop notification once called, requesting permission if not already granted:

```javascript
const notifyMe = () => {
  if (!window.Notification) {
    console.log('Browser does not support notifications.')
  } else {
    // check if permission is already granted
    if (Notification.permission === 'granted') {
      // show notification here
      const notify = new Notification('Hi there!', {
        body: 'How are you doing?',
        icon: 'https://bit.ly/2DYqRrh'
      })
    } else {
      // request permission from the user
      Notification.requestPermission()
        .then(function (p) {
          if (p === 'granted') {
            // show notification here
            const notify = new Notification('Hi there!', {
              body: 'How are you doing?',
              icon: 'https://bit.ly/2DYqRrh'
            })
          } else {
            console.log('User has blocked notifications.')
          }
        })
        .catch(function (err) {
          console.error(err)
        })
    }
  }
}
```

Now we can call the above function when the user clicks a button:

```markup
<button onclick="notifyMe()">Notify Me</button>
```

Alternatively, you can [attach](https://attacomsian.com/blog/javascript-dom-add-an-event-handler) the above function to the body's `onload` event, which will be called once the web page is completely loaded:

```markup
<!DOCTYPE html>
<html>
<body onload="notifyMe()">
<!-- body content-->
</body>
</html>
```
