--- 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")}}一个 {{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
在打包的应用中的值是null
。manifest 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) 中使用。