通知 API

现行标准 — 最后更新

参与:
GitHub whatwg/notifications (新问题, 未解决问题)
在 Matrix 上聊天
提交记录:
GitHub whatwg/notifications/commits
此提交的快照
@notifyapi
测试:
web-platform-tests notifications/ (正在进行的工作)
翻译 (非规范性):
日本語
简体中文

摘要

本标准定义了一个API,用于向最终用户显示通知,通常是在顶层浏览上下文的视口之外。它设计为兼容现有的通知系统,同时保持平台独立性。

1. 术语

本规范依赖于 Infra 标准。[INFRA]

本规范中使用的一些术语在 DOM、Fetch、高分辨率时间、HTML、IDL、服务工作者、URL 和振动 API 标准中定义。[DOM] [FETCH] [HR-TIME] [HTML] [WEBIDL] [SERVICE-WORKERS] [URL] [VIBRATION]

2. 通知

通知是某些事件发生的抽象表示,例如消息的传递。

一个通知有一个关联的服务工作者注册(为空或为服务工作者注册)。它最初为空。

一个通知有一个关联的标题(一个字符串)。

一个通知有一个关联的方向("auto"、"ltr"或"rtl")。

一个通知有一个关联的语言(一个字符串)。

一个通知有一个关联的内容(一个字符串)。

一个通知有一个关联的标签(一个字符串)。

一个通知有一个关联的数据记录)。

一个通知有一个关联的时间戳EpochTimeStamp)。

时间戳可用于指示通知的实际时间。例如,当设备离线时无法立即传递消息,或用于即将开始的会议。

一个通知有一个关联的来源来源)。

一个通知有一个关联的重新通知偏好(一个布尔值)。初始值为 false。当为 true 时,表示在运行通知显示步骤后,若有相同标签的现有通知,则应提醒用户。

一个通知有一个关联的静音偏好(为空或布尔值)。初始为 null。当为 true 时,表示不应发出声音或振动。当为 null 时,表示是否发出声音或振动应依赖平台惯例。

一个通知有一个关联的需要交互偏好(一个布尔值)。初始值为 false。当为 true 时,表示在具有足够大屏幕的设备上,通知应保持可用状态,直到用户激活或关闭该通知。

一个通知可以有以下相关图形:图片 URL图标 URL徽章 URL;以及相应的图片资源图标资源徽章资源

图片资源是显示在通知内容中的图片,应优先显示于图标资源徽章资源之上,尽管其显示情况可能更少。

图标资源是用于加强通知的图片(例如图标或发件人的照片)。

徽章资源是用于表示网络应用程序或通知类别的图标,如果网络应用程序发送多种通知。当没有足够空间显示通知时,可以使用它来表示通知。也可以通知内部显示,但应优先于图片资源图标资源

一个通知有一个关联的振动模式列表)。初始值为«»。

开发者被鼓励不要通过图片图标徽章振动模式传递无法被最终用户访问的信息,特别是因为不支持这些功能的通知平台可能会忽略它们。

一个通知有相关的操作列表,零个或多个操作)。操作代表用户的选择。每个操作有一个关联的:

名称
一个字符串。
标题
一个字符串。
图标 URL
为空或URL。初始为 null。
图标资源
为空或为资源。初始为 null。

用户可以激活操作,作为激活通知本身的替代方式。支持的最大操作数是一个实现定义的零或更多整数,具体取决于通知平台的限制。

由于操作的显示是平台依赖的,开发者被鼓励确保用户可以从通知中调用的任何操作在网络应用程序内也可以使用。

某些平台可能会修改图标资源以更好地匹配平台的视觉风格,例如通过圆角或将其绘制成特定颜色。开发者被鼓励使用能够优雅处理这些情况的图标,并确保不会因为颜色丢失或角落被剪切而丢失重要信息。

非持久性通知是一个通知,其服务工作者注册为 null。

(这是一个跟踪向量)持久性通知是一个通知,其服务工作者注册为非 null。


使用设置对象创建通知,给定字符串titleNotificationOptions 字典options,以及环境设置对象settings

  1. originsettings来源

  2. baseURLsettingsAPI基本URL

  3. fallbackTimestamp为从Unix纪元settings当前壁钟时间的毫秒数,四舍五入到最接近的整数。

  4. 返回创建通知的结果,给定titleoptionsoriginbaseURLfallbackTimestamp

创建通知,给定字符串titleNotificationOptions 字典optionsorigin originURL baseURL,以及EpochTimeStamp fallbackTimestamp

  1. notification成为新的通知

  2. 如果options["silent"]为true,且options["vibrate"]存在,则抛出一个TypeError

  3. 如果options["renotify"]为true,且options["tag"]为空字符串,则抛出一个TypeError

  4. notification数据设置为StructuredSerializeForStorage(options["data"])。

  5. notification标题设置为title

  6. notification方向设置为options["dir"]。

  7. notification语言设置为options["lang"]。

  8. notification来源设置为origin

  9. notification正文设置为options["body"]。

  10. notification标签设置为options["tag"]。

  11. 如果options["image"]存在,则使用baseURL解析它,若不返回失败,则将notification图片URL设置为返回值。(否则不设置notification图片URL。)

  12. 如果options["icon"]存在,则使用baseURL解析它,若不返回失败,则将notification图标URL设置为返回值。(否则不设置notification图标URL。)

  13. 如果options["badge"]存在,则使用baseURL解析它,若不返回失败,则将notification徽章URL设置为返回值。(否则不设置notification徽章URL。)

  14. 如果options["vibrate"]存在,则验证并规范化它,并将notification振动模式设置为返回值。

  15. 如果options["timestamp"]存在,则将notification时间戳设置为该值。否则,将notification时间戳设置为fallbackTimestamp

  16. notification重复通知偏好设置为options["renotify"]。

  17. notification静音偏好设置为options["silent"]。

  18. notification需要交互偏好设置为options["requireInteraction"]。

  19. notification动作设置为« »。

  20. 对于options["actions"]中的每个entry,最多支持最大动作数(跳过任何多余的条目):

    1. action成为新的动作

    2. action名称设置为entry["action"]。

    3. action标题设置为entry["title"]。

    4. 如果entry["icon"]存在,则使用baseURL解析它,若不返回失败,则将action图标URL设置为返回值。(否则action图标URL保持为null。)

    5. action附加到notification动作中。

  21. 返回notification

2.1. 生命周期和UI集成

用户代理必须保留一个通知列表,这是一个列表,包含零个或多个通知

用户代理应当在创建后几秒内为非持久性通知运行关闭步骤

用户代理不应当在平台的“通知中心”(如果有)中显示非持久性通知

用户代理应当保留持久性通知,直到它们从通知列表中移除。

一个持久性通知可以调用其close() 方法中的某个Notification 对象。

用户代理应当在平台的“通知中心”(如果有)中显示持久性通知

2.2. 权限集成

通知API是一个强大功能,其标识符为名称notifications”。[Permissions]

获取通知权限状态,请执行以下步骤:

  1. permissionState设为获取当前权限状态的结果,使用“notifications”。

  2. 如果permissionState是“prompt”,则返回“default”。

  3. 返回permissionState

2.3. 方向

本节内容的术语与HTML渲染部分中使用的术语等效。[HTML]

用户代理应遵守通知标题正文以及其每个动作标题的Unicode语义。每个在显示时都应作为一组独立的双向算法段落处理,遵循双向算法规则P1、P2和P3,包括例如支持U+000A换行符(LF字符)的段落断开行为。对于每个标题正文及其动作标题的段落,如果通知的方向值不是“auto”,则其提供了对规则P2和P3的高级覆盖。[BIDI]

通知的方向还决定了通知的动作应如何展示给终端用户的相对顺序,如果通知平台并排显示这些动作的话。

2.4. 语言

通知的notificationlanguage指定通知的主要语言,包括通知的标题正文和每个动作的标题。其值为字符串。空字符串表示主要语言未知,任何其他字符串必须解释为语言标签。有效性或格式的正确性不受强制。[BCP47]

建议开发者只使用有效的语言标签。

2.5. 资源

给定通知notificationfetch steps

  1. 如果通知平台支持图片,fetch notificationimage URL(如果已设置)。

    目的是类似于使用<img>来获取此资源,但需要抽象

    然后,并行

    1. 等待响应

    2. 如果响应内部响应类型为"default",则尝试将资源解码为图片。

    3. 如果支持该图像格式,则将notificationimage resource设置为解码后的资源。(否则notification没有image resource。)

  2. 如果通知平台支持图标,fetch notificationicon URL(如果已设置)。

    目的是类似于使用<img>来获取此资源,但需要抽象

    然后,并行

    1. 等待响应

    2. 如果响应内部响应类型为"default",则尝试将资源解码为图片。

    3. 如果支持该图像格式,则将notificationicon resource设置为解码后的资源。(否则notification没有icon resource。)

  3. 如果通知平台支持徽章,fetch notificationbadge URL(如果已设置)。

    目的是类似于使用<img>来获取此资源,但需要抽象

    然后,并行

    1. 等待响应

    2. 如果响应内部响应类型为"default",则尝试将资源解码为图片。

    3. 如果支持该图像格式,则将notificationbadge resource设置为解码后的资源。(否则notification没有badge resource。)

  4. 如果通知平台支持动作和动作图标,则对于每个action,在notificationactions中:如果icon URL非空,fetchactionicon URL

    目的是类似于使用<img>来获取此资源,但需要抽象

    然后,并行

    1. 等待响应

    2. 如果响应内部响应类型为"default",则尝试将资源解码为图片。

    3. 如果支持该图像格式,则将actionicon resource设置为解码后的资源。(否则actionicon resource保持为空。)

2.6. 显示通知

给定通知notificationnotification show steps如下:

  1. 运行notificationfetch steps

  2. 等待任何fetches完成,并设置notificationimage resourceicon resourcebadge resource(如果有),以及notification的动作的icon resources(如果有)。

  3. 设置shown为false。

  4. 设置oldNotification通知,从通知列表中找到tag不是空字符串且与notificationtag相同,且其originnotificationorigin相同的通知(如果有),否则为null。

  5. 如果oldNotification非空,则:

    1. 使用oldNotification处理关闭事件

    2. 如果通知平台支持替换,则:

      1. 替换oldNotificationnotification,在通知列表中。

      2. 设置shown为true。

      强烈建议通知平台支持原生替换,因为这可以提供更好的用户体验。

    3. 否则,移除oldNotification通知列表

  6. 如果shown为false,则:

    1. 附加notification通知列表

    2. 在设备上显示notification(例如,调用适当的通知平台API)。

  7. 如果shown为false或oldNotification非空,且notificationrenotify偏好为true,则为notification运行提醒步骤

  8. 如果notification非持久性通知,则排队一个任务触发一个事件,名为show,在表示notificationNotification对象上。

2.7. 激活通知

当用户激活通知 notification或其中的一个动作时,假设底层通知平台支持激活,用户代理必须(除非另有说明)执行以下步骤:

  1. 如果notification持久性通知,则:

    1. 设置action为空字符串。

    2. 如果用户激活了notification的某个动作,则将action设置为该动作名称

    3. 触发一个名为notificationclick的服务工作者通知事件,给定notificationaction
  2. 否则,排队一个任务以运行以下步骤:

    1. 设置intoFocus触发一个名为click的事件,在表示notificationNotification对象上,且其cancelable属性被初始化为true。

      鼓励用户代理使focus()在事件监听器中工作, 针对名为click的事件。

    2. 如果intoFocus为true,则用户代理应将notification的相关浏览上下文的视口聚焦。

在整个web平台上,“激活”被故意错误命名为“点击”。

2.8. 关闭通知

通知被底层通知平台或终端用户关闭时,必须运行其关闭步骤

给定通知notification关闭步骤如下:

  1. 如果通知列表包含notification,则中止这些步骤。

  2. 处理关闭事件,与notification

  3. 移除notification,从通知列表中。

给定通知notification处理关闭事件如下:

  1. 如果notification持久性通知,且notification被终端用户关闭,则触发一个服务工作者通知事件,名为"notificationclose",给定notification

  2. 如果notification非持久性通知,则排队一个任务触发一个事件名为close,在表示notificationNotification对象上。

2.9. 提醒终端用户

给定通知notification提醒步骤如下:

  1. 执行振动,使用notification振动模式,如果有。

3. API

[Exposed=(Window,Worker)]
interface Notification : EventTarget {
  constructor(DOMString title, optional NotificationOptions options = {});

  static readonly attribute NotificationPermission permission;
  [Exposed=Window] static Promise<NotificationPermission> requestPermission(optional NotificationPermissionCallback deprecatedCallback);

  static readonly attribute unsigned long maxActions;

  attribute EventHandler onclick;
  attribute EventHandler onshow;
  attribute EventHandler onerror;
  attribute EventHandler onclose;

  readonly attribute DOMString title;
  readonly attribute NotificationDirection dir;
  readonly attribute DOMString lang;
  readonly attribute DOMString body;
  readonly attribute DOMString tag;
  readonly attribute USVString image;
  readonly attribute USVString icon;
  readonly attribute USVString badge;
  [SameObject] readonly attribute FrozenArray<unsigned long> vibrate;
  readonly attribute EpochTimeStamp timestamp;
  readonly attribute boolean renotify;
  readonly attribute boolean? silent;
  readonly attribute boolean requireInteraction;
  [SameObject] readonly attribute any data;
  [SameObject] readonly attribute FrozenArray<NotificationAction> actions;

  undefined close();
};

dictionary NotificationOptions {
  NotificationDirection dir = "auto";
  DOMString lang = "";
  DOMString body = "";
  DOMString tag = "";
  USVString image;
  USVString icon;
  USVString badge;
  VibratePattern vibrate;
  EpochTimeStamp timestamp;
  boolean renotify = false;
  boolean? silent = null;
  boolean requireInteraction = false;
  any data = null;
  sequence<NotificationAction> actions = [];
};

enum NotificationPermission {
  "default",
  "denied",
  "granted"
};

enum NotificationDirection {
  "auto",
  "ltr",
  "rtl"
};

dictionary NotificationAction {
  required DOMString action;
  required DOMString title;
  USVString icon;
};

callback NotificationPermissionCallback = undefined (NotificationPermission permission);

A 非持久性通知由一个Notification 对象表示,并可以通过Notification构造函数创建。

A 持久性通知由零个或多个Notification 对象表示,并可以通过showNotification() 方法创建。

3.1. 垃圾回收

Notification 对象在通知列表包含其对应的通知并且它有一个类型clickshowcloseerror事件监听器时,不能被垃圾回收。

3.2. 构造函数

new Notification(title, options)构造函数的步骤如下:

  1. 如果this相关全局对象是一个ServiceWorkerGlobalScope 对象, 则抛出TypeError

  2. 如果options["actions"] 不是空的,则抛出TypeError

    动作仅支持持久性通知

  3. 通过给定titleoptionsthis相关设置对象,获取创建通知与设置对象的结果notification

  4. notificationthis关联。

  5. 这些步骤并行运行:

    1. 如果获取通知权限状态的结果不是"granted",则排队一个任务触发一个名为error的事件,在this上,并中止这些步骤。

    2. 运行notification通知显示步骤

3.3. 静态成员

静态permission获取器步骤是返回获取通知权限状态的结果。

如果你编辑标准,请避免复制上面的内容。同步权限就像同步IO,是一个糟糕的想法。

建议开发者使用权限query() 方法代替。[Permissions]

const permission = await navigator.permissions.query({name: "notifications"});
if (permission.state === "granted") {
// 我们有权限使用API…
}

静态requestPermission(deprecatedCallback) 方法步骤如下:

  1. global当前全局对象

  2. promise一个新的 promise,位于this相关领域中。

  3. 并行运行以下步骤:

    1. permissionState请求使用权限的结果,权限为"notifications"。

    2. global排队一个全局任务,任务源为DOM操作任务源,以运行以下步骤:

      1. 如果提供了deprecatedCallback,则调用deprecatedCallback,传入«permissionState»和"report"。

      2. 解析promise,使用permissionState

  4. 返回promise

通知是目前为止唯一一个在请求用户权限时有意义的实例。其他API的规范不应使用这种模式,而应采用更多合适的替代方案之一。

静态maxActions获取器步骤是返回支持的最大操作数

3.4. 对象成员

以下是 事件处理器(及其对应的 事件处理器事件类型),必须作为 Notification 对象的属性支持。

事件处理器 事件处理器事件类型
onclick click
onshow show
onerror error
onclose close

close() 方法的步骤是运行 关闭步骤,应用于 this通知

title 的 getter 步骤是返回 this通知标题

dir 的 getter 步骤是返回 this通知方向

lang 的 getter 步骤是返回 this通知语言

body 的 getter 步骤是返回 this通知正文

tag 的 getter 步骤是返回 this通知标签

image 的 getter 步骤是:

  1. 如果没有 this通知图片 URL,则返回空字符串。

  2. 返回 this通知图片 URL序列化后返回。

icon 的 getter 步骤是:

  1. 如果没有 this通知图标 URL,则返回空字符串。

  2. 返回 this通知图标 URL序列化后返回。

badge 的 getter 步骤是:

  1. 如果没有 this通知徽章 URL,则返回空字符串。

  2. 返回 this通知徽章 URL序列化后返回。

vibrate 的 getter 步骤是返回 this通知振动模式

timestamp 的 getter 步骤是返回 this通知时间戳

renotify 的 getter 步骤是返回 this通知重新通知偏好

silent 的 getter 步骤是返回 this通知静音偏好

requireInteraction 的 getter 步骤是 返回 this通知需要互动偏好

data 的 getter 步骤是返回 StructuredDeserialize(this通知数据this相关 Realm)。如果这会抛出异常,则返回 null。

actions 的 getter 步骤是:

  1. frozenActions 成为类型 NotificationAction 的空列表。

  2. 对每个 entry,在 this通知动作 中:

    1. action 成为一个新的 NotificationAction

    2. action["action"] 设置为 entry名称

    3. action["title"] 设置为 entry标题

    4. 如果 entry图标 URL 不为 null,则将 action["icon"] 设置为 entry图标 URL序列化后返回。

    5. 调用 Object.freezeaction 上, 防止脚本意外更改。

    6. action 添加到 frozenActions

  3. 返回 创建一个冻结数组 的结果,来源于 frozenActions

3.5. Examples

3.5.1. Using events from a page

非持久化 Notification 对象在其生命周期内调度事件,开发人员可以利用这些事件生成所需的行为。

当最终用户激活通知时,click 事件将被调度。

var not = new Notification("Gebrünn Gebrünn by Paul Kalkbrenner", { icon: "newsong.svg", tag: "song" });
not.onclick = function() { displaySong(this); };

3.5.2. Using actions from a service worker

持久化通知ServiceWorkerGlobalScope 上触发 notificationclick 事件。

在此,服务工作线程显示带有单个 "存档" 操作 的通知,允许最终用户在不打开网站的情况下执行此常见任务(例如,通知平台可能在通知上显示一个按钮)。最终用户还可以激活通知的主要部分以打开他们的收件箱。

self.registration.showNotification("New mail from Alice", {
  actions: [{action: 'archive', title: "Archive"}]
});

self.addEventListener('notificationclick', function(event) {
  event.notification.close();
  if (event.action === 'archive') {
    silentlyArchiveEmail();
  } else {
    clients.openWindow("/inbox");
  }
}, false);

3.5.3. 使用 tag 成员来处理多个实例

Web 应用程序通常在多个实例中并行运行,例如当最终用户在多个浏览器选项卡中打开邮件应用程序时。由于桌面是共享资源,通知 API 提供了一种方法,使这些实例可以轻松协调,通过使用 tag 成员。

代表同一概念事件的通知可以以相同的方式进行标记,当两者显示时,最终用户只会收到一个通知。

实例 1                                   | 实例 2
                                             |
// 实例注意到有新邮件。                        |
new Notification("New mail from John Doe",   |
                 { tag: 'message1' });       |
                                             |
                                             |  // 稍后,此实例注意到有新邮件。
                                             |  new Notification("New mail from John Doe",
                                             |                   { tag: 'message1' });

如果用户代理遵循此处的算法,这种情况下的结果是一个 单一 通知 "来自 John Doe 的新邮件"。

3.5.4. 使用 tag 成员来处理单个实例

tag 成员还可以由单个实例的应用程序使用,以便在状态更改时保持其通知尽可能最新。

例如,如果 Alice 正在使用聊天应用程序与 Bob 聊天,而 Bob 在 Alice 闲置时发送了多条消息,应用程序可能希望 Alice 不会看到每条消息的桌面通知。

// Bob 说 "Hi"
new Notification("Bob: Hi", { tag: 'chat_Bob' });

// Bob 说 "你今天下午有空吗?"
new Notification("Bob: Hi / 你今天下午有空吗?", { tag: 'chat_Bob' });

这种情况下的结果是一个 单一 通知;第二个通知替换了具有相同标签的第一个。在排队通知(先进先出)的平台中,使用标签还允许通知保持其在队列中的位置。在显示最新通知优先的平台上,类似的结果可以通过使用 close() 方法实现。

4. Service worker API

dictionary GetNotificationOptions {
  DOMString tag = "";
};

partial interface ServiceWorkerRegistration {
  Promise<undefined> showNotification(DOMString title, optional NotificationOptions options = {});
  Promise<sequence<Notification>> getNotifications(optional GetNotificationOptions filter = {});
};

[Exposed=ServiceWorker]
interface NotificationEvent : ExtendableEvent {
  constructor(DOMString type, NotificationEventInit eventInitDict);

  readonly attribute Notification notification;
  readonly attribute DOMString action;
};

dictionary NotificationEventInit : ExtendableEventInit {
  required Notification notification;
  DOMString action = "";
};

partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onnotificationclick;
  attribute EventHandler onnotificationclose;
};

showNotification(title, options) 方法的步骤为:

  1. global 设为 this相关全局对象

  2. promise 设为 一个新的 promise,位于 this相关领域中。

  3. 如果 this激活的 worker 为 null,则拒绝 promise 并抛出 TypeError,并返回 promise

  4. notification 设为 使用设置对象创建通知的结果,给定 titleoptions 以及 this相关设置对象。如果此操作抛出异常,则 拒绝 promise 并返回 promise

  5. notification服务工作者注册 设为 this

  6. 并行运行以下步骤:

    1. 如果获取通知权限状态的结果不是 "granted",则在全局任务队列中排入任务,拒绝 promise

    2. notification 执行通知显示步骤

    3. 在全局任务队列中排入任务以解析 promise

  7. 返回 promise

getNotifications(filter) 方法的步骤为:

  1. global 设为 this相关全局对象

  2. realm 设为 this相关领域

  3. origin 设为 this相关设置对象来源

  4. promise 设为 一个新的 promise,位于 realm

  5. 并行运行以下步骤:

    1. tag 设为 filter["tag"]。

    2. notifications 设为所有 列表中的 通知,这些通知的来源origin相同来源,且其 服务工作者注册this,如果 tag 不为空,则其 tagtag

    3. 在全局任务队列中排入任务,运行以下步骤:

      1. objects 设为一个 列表

      2. 对于 notifications 列表中的每个 新的 Notification 对象,附加objects

      3. 解析 promise,值为 objects

  6. 返回 promise

此方法返回 0 或更多新的 Notification 对象,这些对象可能代表已经存在的 相同底层通知


为了触发名为 nameservice worker 通知事件,给定 通知 notification,以及可选的字符串 action(默认为空字符串),运行 Fire Functional Event,给定 nameNotificationEventnotificationservice worker 注册,并初始化如下:

notification
一个新的 Notification 对象,代表 notification
action
action

notification getter 的步骤是返回它初始化的值。

action getter 的步骤是返回它初始化的值。

以下是 事件处理器(及其对应的 事件类型),必须作为属性被 ServiceWorkerGlobalScope 对象支持:

事件处理器 事件类型
onnotificationclick notificationclick
onnotificationclose notificationclose

致谢

感谢 Addison Phillips, Aharon (Vladimir) Lanin, Alex Russell, Anssi Kostiainen, Arkadiusz Michalski, Boris Zbarsky, David Håsäther, Doug Turner, Drew Wilson, Ehsan Akhgari, Frederick Hirsch, Ian Hickson, Jake Archibald, James Graham, John Mellor, Jon Lee, Jonas Sicking, Michael Cooper, Michael Henretty, Michael™ Smith, Michael van Ouwerkerk, Mike Taylor, Nicolás Satragno, Olli Pettay, Peter Beverloo, Philip Jägenstedt, Reuben Morais, Rich Tibbett, Robert Bindar, 박상현 (Sanghyun Park), Simon Pieters, Theresa O’Connor, timeless, and triple-underscore for being awesome.

本标准由 Anne van Kesteren (Apple, annevk@annevk.nl) 撰写。早期版本由 John Gregg (Google, johnnyg@google.com) 撰写。

知识产权

版权所有 © WHATWG (Apple, Google, Mozilla, Microsoft)。本作品采用 知识共享署名 4.0 国际许可协议 授权。若本作品的部分内容被纳入源代码中,则该部分内容在源代码中依据 BSD 3-Clause License 授权。

这是现行标准。对于专利审查版本感兴趣的人员,应查看 现行标准 审查草案

Index

Terms defined by this specification

Terms defined by reference

References

Normative References

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. Tags for Identifying Languages. September 2009. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5646
[BIDI]
Manish Goregaokar मनीष गोरेगांवकर; Robin Leroy. Unicode Bidirectional Algorithm. 15 August 2023. Unicode Standard Annex #9. URL: https://www.unicode.org/reports/tr9/tr9-48.html
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HR-TIME]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[Permissions]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[SERVICE-WORKERS]
Jake Archibald; Marijn Kruisselbrink. Service Workers. URL: https://w3c.github.io/ServiceWorker/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[VIBRATION]
Anssi Kostiainen. Vibration API (Second Edition). URL: https://w3c.github.io/vibration/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

IDL Index

[Exposed=(Window,Worker)]
interface Notification : EventTarget {
  constructor(DOMString title, optional NotificationOptions options = {});

  static readonly attribute NotificationPermission permission;
  [Exposed=Window] static Promise<NotificationPermission> requestPermission(optional NotificationPermissionCallback deprecatedCallback);

  static readonly attribute unsigned long maxActions;

  attribute EventHandler onclick;
  attribute EventHandler onshow;
  attribute EventHandler onerror;
  attribute EventHandler onclose;

  readonly attribute DOMString title;
  readonly attribute NotificationDirection dir;
  readonly attribute DOMString lang;
  readonly attribute DOMString body;
  readonly attribute DOMString tag;
  readonly attribute USVString image;
  readonly attribute USVString icon;
  readonly attribute USVString badge;
  [SameObject] readonly attribute FrozenArray<unsigned long> vibrate;
  readonly attribute EpochTimeStamp timestamp;
  readonly attribute boolean renotify;
  readonly attribute boolean? silent;
  readonly attribute boolean requireInteraction;
  [SameObject] readonly attribute any data;
  [SameObject] readonly attribute FrozenArray<NotificationAction> actions;

  undefined close();
};

dictionary NotificationOptions {
  NotificationDirection dir = "auto";
  DOMString lang = "";
  DOMString body = "";
  DOMString tag = "";
  USVString image;
  USVString icon;
  USVString badge;
  VibratePattern vibrate;
  EpochTimeStamp timestamp;
  boolean renotify = false;
  boolean? silent = null;
  boolean requireInteraction = false;
  any data = null;
  sequence<NotificationAction> actions = [];
};

enum NotificationPermission {
  "default",
  "denied",
  "granted"
};

enum NotificationDirection {
  "auto",
  "ltr",
  "rtl"
};

dictionary NotificationAction {
  required DOMString action;
  required DOMString title;
  USVString icon;
};

callback NotificationPermissionCallback = undefined (NotificationPermission permission);

dictionary GetNotificationOptions {
  DOMString tag = "";
};

partial interface ServiceWorkerRegistration {
  Promise<undefined> showNotification(DOMString title, optional NotificationOptions options = {});
  Promise<sequence<Notification>> getNotifications(optional GetNotificationOptions filter = {});
};

[Exposed=ServiceWorker]
interface NotificationEvent : ExtendableEvent {
  constructor(DOMString type, NotificationEventInit eventInitDict);

  readonly attribute Notification notification;
  readonly attribute DOMString action;
};

dictionary NotificationEventInit : ExtendableEventInit {
  required Notification notification;
  DOMString action = "";
};

partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onnotificationclick;
  attribute EventHandler onnotificationclose;
};

MDN

Notification/Notification

In all current engines.

Firefox22+Safari7+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari16.4+Chrome for AndroidNoneAndroid WebView?Samsung Internet?Opera Mobile?
MDN

Notification/actions

In only one current engine.

FirefoxNoneSafariNoneChrome53+
Opera39+Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?

NotificationEvent/action

Firefox44+SafariNoneChrome48+
OperaNoneEdge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera MobileNone
MDN

Notification/badge

In only one current engine.

FirefoxNoneSafariNoneChrome53+
Opera39+Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/body

In all current engines.

Firefox26+Safari11+Chrome33+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/click_event

In all current engines.

Firefox22+Safari7+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS SafariNoneChrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/close

In all current engines.

Firefox22+Safari7+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/close_event

In all current engines.

Firefox22+Safari7+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS SafariNoneChrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/data

In all current engines.

Firefox34+Safari16+Chrome44+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/dir

In all current engines.

Firefox26+Safari7+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/error_event

In all current engines.

Firefox22+Safari7+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS SafariNoneChrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/icon

In all current engines.

Firefox26+Safari11+Chrome33+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/image

In only one current engine.

FirefoxNoneSafariNoneChrome56+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/lang

In all current engines.

Firefox26+Safari11+Chrome33+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/maxActions_static

In only one current engine.

FirefoxNoneSafariNoneChrome48+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/permission_static

In all current engines.

Firefox22+Safari7+Chrome32+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/renotify

In only one current engine.

FirefoxNoneSafariNoneChrome50+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/requestPermission_static

In all current engines.

Firefox22+Safari15+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android22+iOS Safari16.4+Chrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/requireInteraction

In only one current engine.

FirefoxNoneSafariNoneChrome47+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/show_event

In all current engines.

Firefox22+Safari7+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS SafariNoneChrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/silent

FirefoxNoneSafari17+Chrome43+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/tag

In all current engines.

Firefox26+Safari7+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS SafariNoneChrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/timestamp

In only one current engine.

FirefoxNoneSafariNoneChrome50+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/title

In all current engines.

Firefox26+Safari11+Chrome33+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android42+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Notification/vibrate

In only one current engine.

FirefoxNoneSafariNoneChrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android53+Android WebViewNoneSamsung Internet6.0+Opera Mobile41+
MDN

Notification

In all current engines.

Firefox22+Safari7+Chrome20+
Opera23+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari16.4+Chrome for AndroidNoneAndroid WebViewNoneSamsung InternetNoneOpera MobileNone
MDN

NotificationEvent/NotificationEvent

In all current engines.

Firefox44+SafariNoneChrome42+
Opera37+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile37+
MDN

NotificationEvent/notification

Firefox44+SafariNoneChrome42+
Opera37+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile37+
MDN

NotificationEvent

In all current engines.

Firefox44+SafariNoneChrome42+
Opera37+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile37+
MDN

ServiceWorkerGlobalScope/notificationclick_event

Firefox44+SafariNoneChrome40+
Opera24+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ServiceWorkerGlobalScope/notificationclick_event

Firefox44+SafariNoneChrome40+
Opera24+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ServiceWorkerGlobalScope/notificationclose_event

Firefox44+SafariNoneChrome50+
Opera34+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile34+
MDN

ServiceWorkerRegistration/getNotifications

In all current engines.

Firefox44+SafariNoneChrome40+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

ServiceWorkerRegistration/showNotification

In all current engines.

Firefox44+SafariNoneChrome42+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari16.4+Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?