权限:query() 方法

基线 2022

新可用

2022 年 9 月起,此功能在最新的设备和浏览器版本中有效。此功能可能在较旧的设备或浏览器中无法正常工作。

注意:此功能在 Web Workers 中可用。

query() 方法是 Permissions 接口的方法,用于返回全局作用域中用户权限的状态。

语法

js
query(permissionDescriptor)

参数

permissionDescriptor

一个对象,用于设置 query 操作的选项,包含一个由逗号分隔的名称-值对列表。可用的选项是

name

要查询其权限的 API 的名称。每个浏览器都支持不同的值集。您可以在 这里 找到 Firefox 的值,在 这里 找到 Chromium 的值,在 这里 找到 WebKit 的值。

userVisibleOnly

(仅限推送,Firefox 不支持 - 请参阅下面的浏览器支持部分)指示您是否要为每条消息显示通知或能够发送静默推送通知。默认值为 false

sysex(仅限 MIDI)

指示您是否需要和/或接收系统专用消息。默认值为 false

注意:从 Firefox 44 开始,通知推送 的权限已合并。如果授予了权限(例如,由用户在相关的权限对话框中授予),navigator.permissions.query() 将为 notificationspush 返回 true

注意:persistent-storage 权限允许来源使用持久性框(即,持久性存储)作为其存储,如 存储 API 所述。

返回值

一个 Promise,它解析为一个 PermissionStatus 对象。

异常

InvalidStateError DOMException

如果在浏览上下文中调用 query() 方法,并且其关联的文档未完全激活,则抛出此异常。

TypeError

如果以某种方式检索 PermissionDescriptor 信息失败,或者权限不存在或不受用户代理支持,则抛出此异常。

示例

根据地理位置权限显示新闻

此示例演示了如果授予了 geolocation 权限,如何显示与当前位置相关的新闻,否则提示用户启用位置访问权限。

js
navigator.permissions.query({ name: "geolocation" }).then((result) => {
  if (result.state === "granted") {
    showLocalNewsWithGeolocation();
  } else if (result.state === "prompt") {
    showButtonToEnableLocalNews();
  }
  // Don't do anything if the permission was denied.
});

测试对各种权限的支持

此示例显示了查询每个权限的结果。

代码使用 navigator.permissions.query() 查询每个权限,记录权限状态或权限在浏览器中不受支持的事实。请注意,query()try...catch 块内调用,因为如果权限不受支持,关联的 Promise 将被拒绝。

js
// Array of permissions
const permissions = [
  "accelerometer",
  "accessibility-events",
  "ambient-light-sensor",
  "background-sync",
  "camera",
  "clipboard-read",
  "clipboard-write",
  "geolocation",
  "gyroscope",
  "local-fonts",
  "magnetometer",
  "microphone",
  "midi",
  "notifications",
  "payment-handler",
  "persistent-storage",
  "push",
  "screen-wake-lock",
  "storage-access",
  "top-level-storage-access",
  "window-management",
];

processPermissions();

// Iterate through the permissions and log the result
async function processPermissions() {
  for (const permission of permissions) {
    const result = await getPermission(permission);
    log(result);
  }
}

// Query a single permission in a try...catch block and return result
async function getPermission(permission) {
  try {
    const result = await navigator.permissions.query({ name: permission });
    return `${permission}: ${result.state}`;
  } catch (error) {
    return `${permission} (not supported)`;
  }
}

运行代码的日志显示在下面

规范

规范
权限
# dom-permissions-query

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。