recursal/MDN huggingface dataset:
Navigator.registerProtocolHandler()
===================================

**安全上下文:** 此项功能仅在一些支持的浏览器的安全上下文（HTTPS）中可用。

**`Navigator`** 的方法 **`registerProtocolHandler()`** 让 web 站点为自身注册用于打开或处理特定 URL 方案（又名协议）的能力。

举个例子，此 API 允许 Web 邮件站点打开 `mailto:` URL，或让 VoIP 站点打开 `tel:` URL。

语法
--
```

navigator.registerProtocolHandler(scheme, url, title);
```


**备注：** 最近更新为 `navigator.registerProtocolHandler(scheme, url)`, 但目前没有浏览器支持该版本。

### 参数

`scheme`

一个包含站点希望处理的协议的字符串。例如，你可以通过传入 `"sms"` 来注册处理 SMS 文本信息链接。

`url`

处理器的 URL，string 类型。这个字符串应该包含一个"%s"的占位符，其会被将要受理的文档的 escaped 链接所替换。这个链接（译者按：指将要受理的文档的 escaped 链接，也就是替换占位符的字符串）可能是一个真实的 URL，或者是一个电话号码，邮件地址之类的。

**备注：** 这个处理器的 URL 必须以 `http` 或者 `https` 协议标记作为开头，最好是 `https` ，以满足一些浏览器出于安全考虑的要求。

`title` 
已弃用

一个用户可理解的处理器标题。标题会展示给用户，例如弹出对话框“允许这个站点处理 [scheme] 链接吗？”或者在浏览器设置中列出注册的处理器时。

**备注：** 出于欺骗的考虑，标题已从规范中删除，但当前所有的浏览器仍要求使用该标题。建议始终设置标题，因为支持更新规范的浏览器很可能会向后兼容，并且仍接受标题（但不使用它）。

### 异常

* 指定了一个非法的协议标记，例如一个浏览器自身的标记（`https:`, `about:` 等）。
* 处理器 URL 的 origin 与调用这个 API 的页面的 origin 不匹配。
* 浏览器要求这个函数由安全的上下文调用。
* 浏览器要求处理器的 URL 使用 HTTPS 协议。
* `SecurityError`
    + : 用户代理阻止了处理器的注册。这可能是由于：
* `SyntaxError`
    + : 在指定的协议处理地址的字符串中缺失了 `%s` 占位符。
允许的协议标记
-------

出于安全考虑，`registerProtocolHandler()` 严格限制了允许注册的协议标记。以 `web+` 作为前缀的方式可以注册一个自定义的标记协议，至少要有 5 个字符的长度 (包括 `web+` 前缀)，而且只能使用小写的 ASCII 字母作为名称。例如 `web+burger` ，如下面的示例所示。

除此之外，还可以使用下文所列的白名单中的协议标记：

* `bitcoin`
* `geo`
* `im`
* `irc`
* `ircs`
* `magnet`
* `mailto`
* `mms`
* `news`
* `nntp`
* `openpgp4fpr`
* `sip`
* `sms`
* `smsto`
* `ssh`
* `tel`
* `urn`
* `webcal`
* `wtai`
* `xmpp`
示例
--

如果你的网站是 `https://www.google.com/`，则可以为其注册一个协议处理程序来处理 `web+burger:`链接，如下所示：


```js
navigator.registerProtocolHandler(
  "web+burger",
  "https://www.google.com/?uri=%s",
  "Burger handler",
);
```


这将创建一个处理程序，该处理程序允许使用 `web+burger:` 链接将用户发送到你的网站，并将访问的 Burger URL 插入`%s`占位符。

该脚本必须从与处理程序 URL 相同的源运行（因此， `https://www.google.com/`上的任何页面），并且处理程序 URL 必须为 `http`或 `https`。

将通知用户你的代码要求注册协议处理程序，以便他们可以决定是否允许它。有关 `https://www.google.com/`上的示例，请参见以下屏幕截图：

![](/zh-CN/docs/Web/API/Navigator/registerProtocolHandler/protocolregister.png)

**备注：** "Register a webmail service as mailto handler" 展示了如何从跨平台组件对象模块 (XPCOM) 中做到这一切。

规范
--

| Specification |
| --- |
| HTML Standard # custom-handlers |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* Web-based protocol handlers
* RegisterProtocolHandler Enhancing the Federated Web at Mozilla Webdev
* Web Application APIs - Custom scheme and content handlers - Whitelisted schemes
* Register a webmail service as mailto handler shows how to do `registerProtocolHandler` from XPCOM scope.
* XPCOM Interface Reference > nsIWebContentHandlerRegistrar > registerContentHandler - This shows how to use this function XPCOM scope
Navigator：permissions 属性
========================

**`Navigator.permissions`** 只读属性返回一个 `Permissions` 对象，可以用于查询或更新 Permissions API (en-US) 涵盖的 API 状态。

值
-

一个 `Permissions` 对象。

示例
--


```js
navigator.permissions.query({ name: "geolocation" }).then((result) => {
  if (result.state === "granted") {
    showMap();
  } else if (result.state === "prompt") {
    showButtonToEnableMap();
  }
  // 如果权限被拒绝，不要做任何操作。
});
```

规范
--

| Specification |
| --- |
| Permissions # dom-navigator-permissions |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* Permissions API (en-US)
* `Navigator`
Navigator.activeVRDisplays
==========================

**安全上下文:** 此项功能仅在一些支持的浏览器的安全上下文（HTTPS）中可用。

**已弃用:** 不再推荐使用该特性。虽然一些浏览器仍然支持它，但也许已从相关的 web 标准中移除，也许正准备移除或出于兼容性而保留。请尽量不要使用该特性，并更新现有的代码；参见本页面底部的兼容性表格以指导你作出决定。请注意，该特性随时可能无法正常工作。

**`activeVRDisplays`** 是 `Navigator` 接口返回的数组中每个 `VRDisplay` 对象的只读属性（`VRDisplay.ispresenting` (en-US) 为 `true`）。

**备注：** 这个属性是旧的 WebVR API 的一部分，已经被 WebXR Device API 取代。

返回值
---

`VRDisplay` 对象数组。

例子
--


```js
function showActive() {
  const displays = navigator.activeVRDisplays;
  for (const display of displays) {
    console.log(`Display ${display.displayId} is active.`);
  }
}
```

规范
--

此项属性是旧的 WebVR API 的一部分，已经被 WebXR Device API 取代。它不再有望成为标准。

在所有浏览器实现新的 WebXR API (en-US) 之前，推荐使用一些框架，如 A-Frame、Babylon.js、Three.js 或使用 polyfill，来开发可以在任何浏览器中运行的 WebXR 应用程序 [1]。

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

相关链接
----

* WebVR API
Navigator.keyboard
==================

**实验性:** **这是一项实验性技术**  
在将其用于生产之前，请仔细检查浏览器兼容性表格。

The **`keyboard`** read-only property of the `navigator` interface returns a `Keyboard` (en-US) object which provides access to functions that retrieve keyboard layout maps and toggle capturing of key presses from the physical keyboard.

语法
--
```

var keyboard = navigator.keyboard
```

### Value

一个 `Keyboard` (en-US) 对象。

规范
--

| Specification |
| --- |
| Keyboard Lock # h-navigator-keyboard |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
navigator.getUserMedia
======================

**备注：** 此 API 已更名为 `MediaDevices.getUserMedia()`。请使用那个版本进行替代！这个已废弃的 API 版本仅为了向后兼容而存在。

**已弃用:** 不再推荐使用该特性。虽然一些浏览器仍然支持它，但也许已从相关的 web 标准中移除，也许正准备移除或出于兼容性而保留。请尽量不要使用该特性，并更新现有的代码；参见本页面底部的兼容性表格以指导你作出决定。请注意，该特性随时可能无法正常工作。

**Navigator.getUserMedia()** 方法提醒用户需要使用音频（0 或者 1）和（0 或者 1）视频输入设备，比如相机，屏幕共享，或者麦克风。如果用户给予许可，**successCallback** 回调就会被调用，`MediaStream` 对象作为回调函数的参数。如果用户拒绝许可或者没有媒体可用，**errorCallback** 就会被调用，类似的，**`PermissionDeniedError`** 或者 **`NotFoundError`** 对象作为它的参数。注意，有可能以上两个回调函数都不被调用，因为不要求用户一定作出选择（允许或者拒绝）。

语法
--
```

navigator.getUserMedia ( constraints, successCallback, errorCallback );
```

### 参数

`constraints`

`MediaStreamConstaints` 对象指定了请求使用媒体的类型，还有每个类型的所需要的参数。具体细节请参见 `MediaDevices.getUserMedia()` 方法下面的 constraints 部分。

`successCallback`

当调用成功后，successCallback 中指定的函数就被调用，包含了媒体流的 `MediaStream` 对象作为它的参数，你可以把媒体流对象赋值给合适的元素，然后使用它，就像下面的例子一样：


```js
function(stream) {
   var video = document.querySelector('video');
   video.src = window.URL.createObjectURL(stream);
   video.onloadedmetadata = function(e) {
      // Do something with the video here.
   };
}
```


`errorCallback`

当调用失败，errorCallback 中指定的函数就会被调用，`MediaStreamError` 对象作为它唯一的参数；此对象基于 `DOMException` 对象构建。错误码描述见参见以下：

| 错误 | 描述 |
| --- | --- |
| `PermissionDeniedError` | 使用媒体设备请求被用户或者系统拒绝 |
| `NotFoundError` | 找不到 constraints 中指定媒体类型 |

示例
--

### 宽度和高度

使用 `getUserMedia()` 的示例，包括了可以适用于多种浏览器前缀的代码。注意这种使用方式已经被废除，现代的使用方法请参见 `MediaDevices.getUserMedia()` 下面的示例部分。


```js
navigator.getUserMedia =
  navigator.getUserMedia ||
  navigator.webkitGetUserMedia ||
  navigator.mozGetUserMedia;

if (navigator.getUserMedia) {
  navigator.getUserMedia(
    { audio: true, video: { width: 1280, height: 720 } },
    function (stream) {
      var video = document.querySelector("video");
      video.src = window.URL.createObjectURL(stream);
      video.onloadedmetadata = function (e) {
        video.play();
      };
    },
    function (err) {
      console.log("The following error occurred: " + err.name);
    },
  );
} else {
  console.log("getUserMedia not supported");
}
```

权限
--

在一个可以安装的 app（比如，Firefox OS app）中使用 getUserMedia()，你需要在你的 manifest 文件中指定一个或者多个以下条目：
```

"permissions": {
  "audio-capture": {
    "description": "Required to capture audio using getUserMedia()"
  },
  "video-capture": {
    "description": "Required to capture video using getUserMedia()"
  }
}
```


参见 permission: audio-capture 和 permission: video-capture 以查看更多信息。

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

**警告：** 新代码应当使用 `Navigator.mediaDevices.getUserMedia()` (en-US) 替代。

参见
--

* `MediaDevices.getUserMedia()` 代替了这个已弃用的方法。
* WebRTC——该 API 的介绍页面
* 媒体捕捉与媒体流 API——媒体流对象的 API
* 使用网络摄像头拍摄照片——使用 `getUserMedia()` 拍摄照片（而不是视频）的教程。
Navigator.buildID
=================

返回所使用浏览器的构建标识符。现代浏览器中，这个属性返回一个固定的时间戳作为私有的计量方法，比如 Firefox 64 及以后的版本返回 `20181001000000`。

语法
--


```js
buildID = navigator.buildID;
```

### 值

一个字符串，用来表示当前应用的构建标识。构建 ID 的格式为：`YYYYMMDDHHMMSS`。

示例
--


```js
console.log(window.navigator.buildID);
```

规范
--

未得到任何公共标准支持。

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Navigator.serviceWorker
=======================

**`Navigator.serviceWorker`** 只读属性，返回关联文档的 `ServiceWorkerContainer` 对象，它提供了对 `ServiceWorker` 的注册、删除、更新以及通信的访问。

该功能可能无法在无痕模式下使用。

值
-

`ServiceWorkerContainer`。

示例
--

此代码检查浏览器是否支持 service worker。


```js
if ("serviceWorker" in navigator) {
  // Supported!
}
```

规范
--

| Specification |
| --- |
| Service Workers # navigator-service-worker-attribute |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* Service Worker API
* 使用 Service Worker
Navigator.clipboard
===================

剪贴板 Clipboard API 为 **`Navigator`** 接口添加了只读属性 **`clipboard`**，该属性返回一个可以读写剪切板内容的 `Clipboard` 对象。在 Web 应用中，剪切板 API 可用于实现剪切、复制、粘贴的功能。

只有在用户事先授予网站或应用对剪切板的访问许可之后，才能使用异步剪切板读写方法。许可操作必须通过取得权限 Permissions API (en-US) 的 `"clipboard-read"` 和/或 `"clipboard-write"` 项获得。

语法
--


```js
theClipboard = navigator.clipboard;
```

### 值

用于访问系统剪切板的 `Clipboard` 对象。

示例
--

以下代码使用 `navigator.clipboard` 来访问系统剪切板，以读取系统剪切板的内容。


```js
navigator.clipboard
  .readText()
  .then(
    (clipText) => (document.querySelector(".cliptext").innerText = clipText),
  );
```


这个代码片段将 HTML 中拥有类名 `"cliptext"` 的第一个元素的内容替换为剪切板中的内容。这段代码可用于在浏览器拓展中定时自动更新或者由事件触发，实时显示当前剪切板上的内容。

如果剪切板为空，或者不包含文本，则 `"cliptext"` 元素的内容将被清空。这是因为在剪切板为空或者不包含文本时，`readText()` 会返回一个空字符串。

规范
--

| Specification |
| --- |
| Clipboard API and events # navigator-clipboard |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Navigator.cookieEnabled
=======================

`navigator.cookieEnabled` 返回一个布尔值，来表示当前页面是否启用了 cookie。本属性为只读属性。

语法
--


```js
let cookieEnabled = navigator.cookieEnabled;
```


* `cookieEnabled` 是个布尔值： `true` 或 `false`。
示例
--


```js
if (!navigator.cookieEnabled) {
  // 浏览器不支持 cookie，或者用户禁用了 cookie。
}
```

规范
--

| Specification |
| --- |
| HTML Standard # dom-navigator-cookieenabled-dev |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Navigator.gpu
=============

**实验性:** **这是一项实验性技术**  
在将其用于生产之前，请仔细检查浏览器兼容性表格。

**`Navigator.gpu`** 只读属性为当前浏览上下文返回 `GPU` 对象，该对象是 WebGPU API 的入口点。

值
-

一个 `GPU` 对象。

示例
--


```js
async function init() {
  if (!navigator.gpu) {
    throw Error("WebGPU not supported.");
  }

  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {
    throw Error("Couldn't request WebGPU adapter.");
  }

  const device = await adapter.requestDevice();

  //...
}
```

规范
--

| Specification |
| --- |
| WebGPU # navigator-gpu |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* WebGPU API
Navigator：getBattery() 方法
=========================

**`getBattery()`** 方法提供了系统的电量信息，它返回一个 battery 的 promise 对象，兑现后得到 `BatteryManager` 对象，它提供了一些新的事件和方法以方便你监控电池的状态。这个方法实现了电源状态 API，参见那篇文档，以获得更多细节、使用方法和实例代码。

**备注：** 对该特性的访问可能由 `Permissions-Policy` 标头的 `battery` (en-US) 指令控制。

语法
--


```js
getBattery()
```

### 参数

无。

### 返回值

一个 `Promise` 值，当兑现时会得到含有电源状态信息的 `BatteryManager` 对象。

### 异常

`NotAllowedError` `DOMException`

对该特性的使用被权限策略阻止。

`SecurityError`

用户代理不会向不安全上下文暴露电源信息，而此方法在不安全的上下文中被调用了。

示例
--

此示例获取了电源当前充电的状态，并建立了 `chargingchange` (en-US) 事件的处理器，当充电状态发生变化时，其状态会被记录下来。


```js
let batteryIsCharging = false;

navigator.getBattery().then((battery) => {
  batteryIsCharging = battery.charging;

  battery.addEventListener("chargingchange", () => {
    batteryIsCharging = battery.charging;
  });
});
```


对于更多示例与具体信息，参见电源状态 API。

规范
--

| Specification |
| --- |
| Battery Status API # dom-navigator-getbattery |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* 电源状态 API
* `Permissions-Policy` `battery` (en-US) 特性
Navigator.maxTouchPoints
========================

返回当前设备能够支持的最大同时触摸的点数。语法
--
```

touchPoints = navigator.maxTouchPoints;
```

样例
--


```js
if (navigator.maxTouchPoints > 1) {
  // 浏览器支持多点触控
}
```

规范
--

| Specification |
| --- |
| Pointer Events # dom-navigator-maxtouchpoints |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Navigator.oscpu
===============

### 概述

返回一个字符串，代表当前所使用的操作系统类型。

### 语法
```

oscpuInfo = window.navigator.oscpu
```


* `oscpuInfo` 会有下面几种类型。

| 操作系统 | `oscpuInfo` 字符串值 |
| --- | --- |
| OS/2 | OS/2 Warp x (3, 4 或 4.5) |
| Windows CE | WindowsCE x.y1 |
| Windows 64-bit (64-bit build) | Windows NT x.y; Win64; x64 |
| Windows 64-bit (32-bit build) | Windows NT x.y; WOW64 |
| Windows 32-bit | Windows NT x.y |
| Mac OS X (PPC build) | PPC Mac OS X x.y |
| Mac OS X (i386/x64 build) | Intel Mac OS X x.y |
| Linux 64-bit (32-bit build) | 命令 `uname -s` 的输出加上 "i686 on x86\_64" |
| Linux | 命令 `uname -sm` 的输出 |

1x.y 表示操作系统的版本号

### 例子


```js
function osInfo() {
  alert(window.navigator.oscpu);
}
// 可能返回:"Windows NT 6.1",表示 windows 7
```

### 备注

在普通网页中，如果 about:config 中存在`general.oscpu.override` 项，则该属性的值会返回 about:config 中 `general.oscpu.override` 项的值。在特权代码中 (Chrome 上下文或者拥有 "UniversalBrowserRead" 特权的网页中)，返回的还是真实的操作系统类型。(译者注：语句：netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead") 用来激活所在网页的 UniversalBrowserRead 特权。)

规范
--

| Specification |
| --- |
| HTML Standard # dom-navigator-oscpu |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Navigator：connection 属性
=======================

**实验性:** **这是一项实验性技术**  
在将其用于生产之前，请仔细检查浏览器兼容性表格。

**`Navigator.connection`** 只读属性返回一个包含有关系统网络连接信息的 `NetworkInformation` 对象，例如用户设备的当前带宽或连接是否按流量计费。

这可以用于基于用户的连接状态来选择高清晰度内容或低清晰度内容。

值
-

一个 `NetworkInformation` 对象。

规范
--

| Specification |
| --- |
| Network Information API # connection-attribute |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* online 和 offline 事件 (en-US)
Navigator.sendBeacon()
======================

**`navigator.sendBeacon()`** 方法可用于通过 HTTP POST 将少量数据 异步 传输到 Web 服务器。

它主要用于将统计数据发送到 Web 服务器，同时避免了用传统技术（如：`XMLHttpRequest`）发送分析数据的一些问题。

语法
--


```js
navigator.sendBeacon(url);
navigator.sendBeacon(url, data);
```

### 参数

`url`

`url` 参数表明 `data` 将要被发送到的网络地址。

`data` 可选

`data` 参数是将要发送的 `ArrayBuffer`、`ArrayBufferView`、`Blob`、`DOMString`、`FormData` 或 `URLSearchParams` 类型的数据。

### 返回值

当用户代理成功把数据加入传输队列时，**`sendBeacon()`** 方法将会返回 `true`，否则返回 `false`。

描述
--

这个方法主要用于满足统计和诊断代码的需要，这些代码通常尝试在卸载（unload）文档之前向 Web 服务器发送数据。过早的发送数据可能导致错过收集数据的机会。然而，对于开发者来说保证在文档卸载期间发送数据一直是一个困难。因为用户代理通常会忽略在 `unload` 事件处理器中产生的异步 `XMLHttpRequest`。

过去，为了解决这个问题，统计和诊断代码通常要在

* 发起一个同步 `XMLHttpRequest` 来发送数据。
* 创建一个 `<img>` 元素并设置 `src`，大部分用户代理会延迟卸载（unload）文档以加载图像。
* 创建一个几秒的 no-op 循环。

上述的所有方法都会迫使用户代理延迟卸载文档，并使得下一个导航出现的更晚。下一个页面对于这种较差的载入表现无能为力。

这就是 **`sendBeacon()`** 方法存在的意义。使用 **`sendBeacon()`** 方法会使用户代理在有机会时异步地向服务器发送数据，同时不会延迟页面的卸载或影响下一导航的载入性能，这意味着：

* 数据发送是可靠的。
* 数据异步传输。
* 不影响下一导航的载入。

数据是通过 HTTP POST 请求发送的。

### 在会话结束时发送统计数据

网站通常希望在用户完成页面浏览后向服务器发送分析或诊断数据，最可靠的方法是在 `visibilitychange` 事件发生时发送数据：


```js
document.addEventListener("visibilitychange", function logData() {
  if (document.visibilityState === "hidden") {
    navigator.sendBeacon("/log", analyticsData);
  }
});
```

### 避免使用 unload 和 beforeunload

过去，许多网站使用 `unload` 或 `beforeunload` 事件以在会话结束时发送统计数据。然而这是不可靠的，在许多情况下（尤其是移动设备）浏览器不会产生 `unload`、`beforeunload` 或 `pagehide` 事件。下面列出了一种不触发上述事件的情况：

1. 用户加载了网页并与其交互。
2. 完成浏览后，用户切换到了其他应用程序，而不是关闭选项卡。
3. 随后，用户通过手机的应用管理器关闭了浏览器应用。

此外，`unload` 事件与现代浏览器实现的往返缓存（bfcache）不兼容。在部分浏览器（如：Firefox）通过在 bfcache 中排除包含 `unload` 事件处理器的页面来解决不兼容问题，但这存在性能损失。其他浏览器，例如 Safari 和 Android 上的 Chrome 浏览器则采取用户在同一标签页下导航至其他页面时不触发 `unload` 事件的方法来解决不兼容问题。

Firefox 也会在 bfcache 中排除包含 `beforeunload` 事件处理器的页面。

#### 使用 pagehide 作为回退

可使用 `pagehide` 事件来代替部分浏览器未实现的 `visibilitychange` 事件。和 `beforeunload` 与 `unload` 事件类似，这一事件不会被可靠地触发（特别是在移动设备上），但它与 bfcache 兼容。

示例
--

示例代码使用 `visibilitychange` 事件来调用 `sendBeacon()` 以发送统计数据。


```js
document.addEventListener("visibilitychange", function logData() {
  if (document.visibilityState === "hidden") {
    navigator.sendBeacon("/log", analyticsData);
  }
});
```

规范
--

| Specification |
| --- |
| Beacon # sendbeacon-method |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `visibilitychange` 事件。
* Beacon API 概述。
* Don't
lose user and app state, use Page Visibility 解释了为什么你应该使用 `visibilitychange` 而不是 `beforeunload`/`unload`。
* 网页生命周期 API 提供了有关在 Web 应用程序中处理网页生命周期行为的最佳实践。
* PageLifecycle.js：处理跨浏览器网页生命周期行为不一致的 JavaScript 库。
* Back/forward cache 解释了什么是往返缓存，以及它对各种网页生命周期事件的影响。
Navigator.share
===============

**安全上下文:** 此项功能仅在一些支持的浏览器的安全上下文（HTTPS）中可用。

**`Navigator.share()`** 方法通过调用本机的共享机制作为 Web Share API 的一部分。如果不支持 Web Share API，则此方法为 `undefined`。

语法
--
```

const sharePromise = window.navigator.share(data);
```

### 参数

*data*

包含要共享的数据的对象。必须至少指定以下字段之一。可用选项包括：

* `url`: 要共享的 URL（ `USVString` ）
* `text`: 要共享的文本（ `USVString` ）
* `title`: 要共享的标题（ `USVString`）
* `files`: 要共享的文件（“FrozenArray”）

### 返回值

该方法将会返回一个`Promise`。一旦用户完成分享，这个 promise 将会接受。如果指定的共享数据格式不正确，promise 将会立即拒绝；如果用户取消了分享，promise 也会拒绝。

例如，在 Android 的 Chrome 上，将在用户选择要共享的应用程序后将会解析共享的内容。

示例
--


```js
navigator.share({
  title: document.title,
  text: "Hello World",
  url: "https://developer.mozilla.org",
}); // 分享 MDN 的 URL
```

### 分享文件

分享文件之前，先使用 `navigator.canShare()` 判断这个文件能否被分享，Then include an array of files in the call to `navigator.share()`:

Notice: That the sample handles feature detection by testing for `navigator.canShare()` rather than for `navigator.share()`. The data object passed to `canShare()` only supports the `files` property. Image, video, audio, and text files can be shared.


```js
if (navigator.canShare && navigator.canShare({ files: filesArray })) {
  navigator
    .share({
      files: filesArray,
      title: "Pictures",
      text: "Our Pictures.",
    })
    .then(() => console.log("Share was successful."))
    .catch((error) => console.log("Sharing failed", error));
} else {
  console.log(`Your system doesn't support sharing files.`);
}
```

规范
--

| Specification |
| --- |
| Web Share API # share-method |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `navigator.canShare()`
Navigator.vendor
================

**已弃用:** 不再推荐使用该特性。虽然一些浏览器仍然支持它，但也许已从相关的 web 标准中移除，也许正准备移除或出于兼容性而保留。请尽量不要使用该特性，并更新现有的代码；参见本页面底部的兼容性表格以指导你作出决定。请注意，该特性随时可能无法正常工作。

`Navigator` 的 **`vendor`** 属性值总是“`Google Inc.`”、“`Apple Computer, Inc.`”或（在 Firefox 中）空字符串。

值
-

* “`Google Inc.`”、“`Apple Computer, Inc.`”或（在 Firefox 中）空字符串。
规范
--

| Specification |
| --- |
| HTML Standard # dom-navigator-vendor-dev |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Navigator：mediaDevices 属性
=========================

**安全上下文:** 此项功能仅在一些支持的浏览器的安全上下文（HTTPS）中可用。

**`Navigator.mediaDevices`** 只读属性返回一个 `MediaDevices` 对象，该对象可提供对相机和麦克风等媒体输入设备以及屏幕共享的连接访问。

语法
--


```js
navigator.mediaDevices
```

### 返回值

`MediaDevices` 单例对象。通常，你只需直接使用此对象的成员，例如调用 `navigator.mediaDevices.getUserMedia()` (en-US)。

规范
--

| Specification |
| --- |
| Media Capture and Streams # mediadevices |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* 媒体捕捉与媒体流 API：有关整个媒体捕捉与媒体流 API 的文档的入口点。
* WebRTC API：与之密切相关的 WebRTC API 的相关文档。
Navigator.getGamepads()
=======================

**实验性:** **这是一项实验性技术**  
在将其用于生产之前，请仔细检查浏览器兼容性表格。

调用 **`Navigator.getGamepads()`** 方法会返回一个数组：第一个值为 `null` ，其他的值均为 `Gamepad` 对象，表示每一个与设备连接的游戏手柄。所以如果没有连接任何游戏手柄，这个方法将只会返回 `null`。

语法
--
```

 var arrayGP = navigator.getGamepads();
```

样例
--


```js
window.addEventListener("gamepadconnected", function (e) {
  var gp = navigator.getGamepads()[e.gamepad.index];
  console.log(
    "Gamepad connected at index %d: %s. %d buttons, %d axes.",
    gp.index,
    gp.id,
    gp.buttons.length,
    gp.axes.length,
  );
});
```

规范
--

| Specification |
| --- |
| Gamepad # dom-navigator-getgamepads |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* 使用 Gamepad API
* Gamepad API
Navigator.vendorSub
===================

**已弃用:** 不再推荐使用该特性。虽然一些浏览器仍然支持它，但也许已从相关的 web 标准中移除，也许正准备移除或出于兼容性而保留。请尽量不要使用该特性，并更新现有的代码；参见本页面底部的兼容性表格以指导你作出决定。请注意，该特性随时可能无法正常工作。

**`Navigator.vendorSub`** 属性的值在任何浏览器中始终为空字符串。

值
-

* 空字符串
规范
--

| Specification |
| --- |
| HTML Standard # dom-navigator-vendorsub-dev |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Navigator.doNotTrack
====================

**已弃用:** 不再推荐使用该特性。虽然一些浏览器仍然支持它，但也许已从相关的 web 标准中移除，也许正准备移除或出于兼容性而保留。请尽量不要使用该特性，并更新现有的代码；参见本页面底部的兼容性表格以指导你作出决定。请注意，该特性随时可能无法正常工作。

**`Navigator.doNotTrack`** 属性返回用户的不跟踪（Do Not Track）设置，表示用户是否请求网站和广告商不进行跟踪。

该属性的值反映了 `DNT` HTTP 标头的值，例如：`"1"`、`"0"` 或 `"unspecified"`。

值
-

一个数字。

示例
--


```js
console.log(navigator.doNotTrack);
// 若启用了 DNT，则为 "1"；若允许跟踪，则为 "0"；否则为 "unspecified"
```

规范
--

#### No specification found

No specification data found for `api.Navigator.doNotTrack`.  
Check for problems with this page or contribute a missing `spec_url` to mdn/browser-compat-data. Also make sure the specification is included in w3c/browser-specs.

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `DNT` HTTP 标头
credentials
===========

**实验性:** **这是一项实验性技术**  
在将其用于生产之前，请仔细检查浏览器兼容性表格。

`Navigator`接口的 **`credentials`** 属性返回`CredentialsContainer`接口，该接口暴露了请求凭证的方法。 `CredentialsContainer`接口还会在下相关事件发生时通知用户，例如登录或注销成功。该接口可用于特征检测。

语法
--
```

var credentialsContainer = navigator.credentials
```

### 返回值

`CredentialsContainer` 接口。

示例
--


```js
if ("credentials" in navigator) {
  navigator.credentials.get({ password: true }).then(function (creds) {
    //Do something with the credentials.
  });
} else {
  //Handle sign-in the way you did before.
}
```

Specifications
--------------

| Specification |
| --- |
| Credential Management Level 1 # framework-credential-management |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Navigator.language
==================

**`Navigator.language`** 为只读属性，返回一个表示用户偏好语言（通常是浏览器界面语言）的字符串。

语法
--


```js
const lang = navigator.language;
```

### 值

一个 `DOMString`。`lang`存储了一个在 BCP 47 中定义的语言版本。一些有效的语言版本代码示例包括： “en”、“en-US”、“fr”、“fr-FR”、“es-ES”等。

请注意，在 iOS 10.2 之前的 Safari 中，返回的语言版本代码是小写的： “en-us”、“fr-fr”等。

示例
--


```js
if (/^en\b/.test(navigator.language)) {
  doLangSelect(window.navigator.language);
}
```

规格
--

| Specification |
| --- |
| HTML Standard # dom-navigator-language-dev |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

更多参见
----

* `navigator.languages` (en-US)
* `navigator`
Navigator.canShare
==================

**实验性:** **这是一项实验性技术**  
在将其用于生产之前，请仔细检查浏览器兼容性表格。

**安全上下文:** 此项功能仅在一些支持的浏览器的安全上下文（HTTPS）中可用。

如果对 `Navigator.share()` 的调用成功，则 Web Share API 的 **`Navigator.canShare()`** 方法将返回 true。语法
--
```

var canShare = navigator.canShare(data);
```

### 参数

`data` 可选

包含要共享的数据的对象，该对象要与 `Navigator.share()` 方法传递的数据相匹配。

### 返回值

`Boolean`值。`Navigator.share()` 若返回 True 则表示内容可以被成功分享。

规范
--

| Specification |
| --- |
| Web Share API # canshare-data-method |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

相关连接
----

`navigator.share()`
Navigator.geolocation
=====================

**安全上下文:** 此项功能仅在一些支持的浏览器的安全上下文（HTTPS）中可用。

**`Navigator.geolocation`** 只读属性返回一个 `Geolocation` 对象，通过这个对象可以访问到设备的位置信息。使网站或应用可以根据用户的位置提供个性化结果。

**备注：** 出于安全考虑，当网页请求获取用户位置信息时，用户会被提示进行授权。注意不同浏览器在请求权限时有不同的策略和方式。Windows 10 在未开启定位的情况下无法获取位置

语法
--


```js
geo = navigator.geolocation;
```

规范
--

| Specification |
| --- |
| Geolocation API # dom-navigator-geolocation |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* 使用地理位置定位