--- title: Notification.requestPermission() slug: Web/API/notification/requestPermission tags: - 通知 translation_of: Web/API/Notification/requestPermission ---

{{APIRef("Web Notifications")}}

{{domxref("Notification")}} 接口的 requestPermission() 方法请求用户当前来源的权限以显示通知。

语法

最新的规范已将此方法更新为基于promise的语法,工作原理如下:

Notification.requestPermission().then(function(permission) { ... });

以前,语法是基于一个简单的回调;此版本现已弃用

Notification.requestPermission(callback);

参数

callback {{optional_inline}} {{deprecated_inline("gecko46")}}
一个可选的参数为权限请求的结果的回调函数。此参数已废弃,请使用Promise的语法。

返回值

一个 {{jsxref("Promise")}} ,将解析为一个 {{domxref("DOMString")}} ,它是用户对权限请求的选择。这个字符串可以是 granted(被授予), denied(被拒绝) 或者 default(默认)。

实例

下面这个代码片段将向用户请求权限,然后根据用户的不同选择,输出不同的日志。

Notification.requestPermission().then(function(result) {
  if (result === 'denied') {
    console.log('Permission wasn\'t granted. Allow a retry.');
    return;
  }
  if (result === 'default') {
    console.log('The permission request was dismissed.');
    return;
  }
  // Do something with the granted permission.
});

标准

Specification Status Comment
{{SpecName('Web Notifications')}} {{Spec2('Web Notifications')}} Living standard

浏览器兼容性

{{CompatibilityTable}}

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support 5{{property_prefix("webkit")}}[1]
22
{{CompatVersionUnknown}} {{CompatGeckoDesktop("2.0")}}{{property_prefix("moz")}}[2]
{{CompatGeckoDesktop("22.0")}}
{{CompatNo}} 25 6[3]
promise-based version {{CompatChrome(46.0)}} {{CompatUnknown}} {{CompatGeckoDesktop("47.0")}} {{CompatUnknown}} {{CompatOpera(40)}} {{CompatNo}}
Feature Android Android Webview Edge Firefox Mobile (Gecko) Firefox OS IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support {{CompatUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatGeckoMobile("2.0")}}{{property_prefix("moz")}}[2]
{{CompatGeckoMobile("22.0")}}
1.0.1{{property_prefix("moz")}}[2]
1.2
{{CompatNo}} {{CompatUnknown}} {{CompatNo}} {{CompatVersionUnknown}}
promise-based version {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile("47.0")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}

[1] 在 Chrome 22 之前,对于通知的支持请参考 old prefixed version of the specification 它使用 {{domxref("window.navigator.webkitNotifications","navigator.webkitNotifications")}} 对象去实例化一个新的通知。

在 Chrome 32 之前,不支持 {{domxref("Notification.permission")}} 。

在 Chrome 42 之前,不支持在 service worker 中使用这个API。

[2] 对于 Firefox 22 之前的版本 (Firefox OS <1.2),实例化一个新的通知必须使用 {{domxref("window.navigator.mozNotification", "navigator.mozNotification")}} 对象中的 createNotification 方法.

对于 Firefox 22 之前的版本 (Firefox OS <1.2),通知只会在 show 方法被调用后显示,而且只支持 click 和 close 事件。

Nick Desaulniers 写了一个 Notification shim 来同时兼容新旧两种写法。

在 Firefox OS 上有一个特殊的问题是:虽然你可以在通知中使用 包含路径的图标 ,但是如果应用被打包了,你就不能使用形如 /my_icon.png 这样的相对路径。当然你也不能使用window.location.origin + "/my_icon.png" ,因为 window.location.origin 在打包的应用中的值是nullmanifest origin field 修复了这个问题,但是它只能在 Firefox OS 1.1+ 中使用。一个潜在的支持 Firefox OS <1.1 的解决方案是 传递一个指向外部部署的图标的绝对路径的URL。这并不是一个理想的解决方案,因为这将导致通知以无图标的形式出现,然后图标才会被获取,但是这个方法适用于所有版本的 Firefox OS.

在 Firefox OS app 中使用通知的时候,确保添加 desktop-notification 权限到你的 manifest 文件中。通知即可在任何权限等级,外部部署或者像下面这样 "permissions": { "desktop-notification": {} } 的情况下使用。

[3] Safari 在 Safari 6 之后支持通知,但是只能在 Mac OSX 10.8+ (Mountain Lion) 中使用。

参见