Skip to content

Commit

Permalink
[zh-cn]: sync translation for "Using the Permissions API" (mdn#19838)
Browse files Browse the repository at this point in the history
Co-authored-by: skyclouds2001 <[email protected]>
Co-authored-by: A1lo <[email protected]>
  • Loading branch information
3 people authored Apr 30, 2024
1 parent 8b66c6c commit a641dfb
Showing 1 changed file with 28 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
---
title: Using the Permissions API
title: 使用 Permissions API
slug: Web/API/Permissions_API/Using_the_Permissions_API
l10n:
sourceCommit: 3dbfd299e6f34873d6355bae4b12b5c1c69242f1
---

{{DefaultAPISidebar("Permissions API")}}{{SeeCompatTable}}
{{DefaultAPISidebar("Permissions API")}}

本文提供了使用 W3C Permission API 的基本说明,它提供了一种程序上的方式来查询当前上下文的 API 权限授权状态
本文提供了使用 W3C [Permissions API](/zh-CN/docs/Web/API/Permissions_API)——它提供了一种用于查询当前上下文的 API 权限授权状态的编程方式——的基本指南

## 申请权限面临的困境

惨淡的事实是,权限在 Web 开发中是令人厌恶却不得不面对的问题,对于开发者而言,处理它毫无乐趣。

由于历史原因,不同的 API 使用各自不同的方式来处理自己的权限 ── 例如,Notification API 允许显式地检查权限状态和申请权限,然而,Geolocation API 却不能(如果用户拒绝了首次权限请求,就会造成我们下面将要看到的问题)
由于历史原因,不同的 API 使用各自不同的方式来处理自己的权限──例如,[Notification API](/zh-CN/docs/Web/API/Notifications_API) 允许显式地检查权限状态和申请权限,然而,[Geolocation API](/zh-CN/docs/Web/API/Geolocation_API) 却不能。

[Permissions API](/zh-CN/docs/Web/API/Permissions_API) 提供了一系列工具来让开发者在权限方面实现更好的用户体验。例如,它提供了特定的 API 来查询某个权限被授予了还是被拒绝了,以及可以使用 API 来申请特定的权限
[Permissions API](/zh-CN/docs/Web/API/Permissions_API) 提供了一系列工具来让开发者在权限方面实现更好的用户体验。具体来说,开发人员可以使用 {{domxref("Permissions.query()")}} 来检查在当前上下文中使用特定 API 的权限是已授予、已拒绝还是需要通过提示获得特定用户权限。在主线程中查询权限是被[广泛支持](/zh-CN/docs/Web/API/Permissions_API#api.navigator.permissions)的,在 [Worker](/zh-CN/docs/Web/API/Permissions_API#api.workernavigator.permissions) 中也是如此(但有一个明显的例外)

目前来说,该 API 的实现还在早期阶段,所以浏览器支持也是参差不齐:
许多 API 现在都能进行权限查询,例如 [Clipboard API](/zh-CN/docs/Web/API/Clipboard_API)[Notifications API](/zh-CN/docs/Web/API/Notifications_API)

- 只在 Chrome 44 以上版本及 Firefox 43 以上版本实现了。
- 当下仅支持 {{domxref("Permissions.query()")}} 方法,它用来查询权限。
- Chrome 中目前可以被 Permission API 识别的权限仅有 [Geolocation](/zh-CN/docs/Web/API/Geolocation) 和 Notification,对于 Firefox 来说,还支持 [Push](/zh-CN/docs/Web/API/Push_API) and WebMIDI.
- [Push API](/zh-CN/docs/Web/API/Push_API)[Web MIDI API](/zh-CN/docs/Web/API/Web_MIDI_API)[API 概览](/zh-CN/docs/Web/API/Permissions_API#permission-aware_apis)中提供了许多启用权限的 API 的列表,你可以在[此处的兼容性表](/zh-CN/docs/Web/API/Permissions_API#api.permissions)中了解浏览器的支持情况。

更多特性将逐步实现
{{domxref("Permissions")}} 还有其他方法可用于专门请求使用 API 的权限和撤销权限,但这些方法已被弃用(非标准及不被广泛支持)

## 一个简单的例子

在本文中,我们有一个简单的 demo 叫作 Location Finder. 它使用 Geolocation 获取用户的当前位置,并标注在 Google 地图上:

![Screenshot showing a map of Greenfield, UK.](location-finder-with-permissions-api.png)
![英国格林菲尔德地图的截图](location-finder-with-permissions-api.png)

You can [在线运行](https://chrisdavidmills.github.io/location-finder-permissions-api/),或 [在 Github 查看源码](https://github.com/chrisdavidmills/location-finder-permissions-api/tree/gh-pages)。大部分代码都很简单且常见 ── 所以接下来我们会重点关注和 Permission API 有关的代码,如果你想学习其他部分,请自行阅读。
你可以[在线运行示例](https://chrisdavidmills.github.io/location-finder-permissions-api/),或[在 Github 查看源代码](https://github.com/chrisdavidmills/location-finder-permissions-api/tree/gh-pages)。大部分代码都很简单且常见──所以接下来我们会重点关注和 Permissions API 有关的代码,如果你想学习其他部分,请自行阅读。

### 访问 Permissions API

Expand All @@ -48,30 +48,30 @@ You can [在线运行](https://chrisdavidmills.github.io/location-finder-permiss

```js
function handlePermission() {
navigator.permissions.query({ name: "geolocation" }).then(function (result) {
if (result.state == "granted") {
navigator.permissions.query({ name: "geolocation" }).then((result) => {
if (result.state === "granted") {
report(result.state);
geoBtn.style.display = "none";
} else if (result.state == "prompt") {
} else if (result.state === "prompt") {
report(result.state);
geoBtn.style.display = "none";
navigator.geolocation.getCurrentPosition(
revealPosition,
positionDenied,
geoSettings,
);
} else if (result.state == "denied") {
} else if (result.state === "denied") {
report(result.state);
geoBtn.style.display = "inline";
}
result.onchange = function () {
result.addEventListener("change", () => {
report(result.state);
};
});
});
}

function report(state) {
console.log("Permission " + state);
console.log(`Permission ${state}`);
}

handlePermission();
Expand All @@ -86,18 +86,18 @@ handlePermission();
从 Firefox 47 开始,你可以使用 {{domxref("Permissions.revoke()")}} 方法重置现有权限。它的调用方式和 {{domxref("Permissions.query()")}} 方法几乎一模一样,区别是,当 promise 成功 resolve 时,它会让一个现有的权限恢复默认状态(通常是 `prompt`)。让我们看看 demo 中的代码:

```js
var revokeBtn = document.querySelector('.revoke');
const revokeBtn = document.querySelector(".revoke");

...
// ...

revokeBtn.onclick = function() {
revokeBtn.onclick = () => {
revokePermission();
}
};

...
// ...

function revokePermission() {
navigator.permissions.revoke({name:'geolocation'}).then(function(result) {
navigator.permissions.revoke({ name: "geolocation" }).then((result) => {
report(result.state);
});
}
Expand All @@ -107,13 +107,13 @@ function revokePermission() {
### 响应权限状态变化

你会注意到,在上面的代码中,在 {{domxref("PermissionStatus")}} 对象上有一个 `onchange` 事件回调这让我们可以对感兴趣的 API 的状态变化做出响应。目前,我们只是上报了状态的变化。
你会注意到,在上面的代码中,在 {{domxref("PermissionStatus")}} 对象上有一个 `onchange` 事件回调——这让我们可以对感兴趣的 API 的状态变化做出响应。目前,我们只是上报了状态的变化。

## 总结和展望未来

目前,较之我们已有的,这个 API 并没有提供太多额外内容。如果在浏览器询问时,我们选择了从不分享我们的位置,那么不使用浏览器菜单选项的话,我们将无法返回权限的初始状态(询问):

- **Firefox**: _工具 > 页面信息 > 权限 > 访问你的位置_。选择“总是询问”。
- **Chrome**: _汉堡菜单 > 设置 > 显示高级设置。在隐私部分,点击“内容设置”。在出现的对话框中,找到“位置”部分,选择“当网站试图访问时询问”...最后,点击“管理特例”_,移除你对特定网站的授权。
- **Firefox**_工具 > 页面信息 > 权限 > 访问你的位置_。选择“总是询问”。
- **Chrome**_汉堡菜单 > 设置 > 显示高级设置。在隐私部分,点击“内容设置”。在出现的对话框中,找到“位置”部分,选择“当网站试图访问时询问”...最后,点击“管理特例”_,移除你对特定网站的授权。

但是,未来浏览器会提供 `request()` 方法,他让我们可以在任何时候以编程的方式来请求权限。这非常值得期待尽快被实现。

0 comments on commit a641dfb

Please sign in to comment.