recursal/MDN huggingface dataset:
MessageChannel.port2
====================

`MessageChannel`接口的 **`port2`** 是一个只读属性，返回消息通道的第二个端口，该端口连接到通道另一端的上下文，也就是发送消息时的目的地。

**备注：** 此特性在 Web Worker 中可用

语法
--
```

channel.port2;
```

### 值

表示通道第二个端口的一个`MessagePort`对象，该端口附加到通道另一端的上下文。

示例
--

如下代码所示，通过`MessageChannel.MessageChannel`构造函数创建了一个新的通道。当 IFrame 加载完毕，我们使用`MessagePort.postMessage` (en-US)将一条消息以及 port2 传递给 IFrame。handleMessage 处理程序响应从 IFrame 发回的消息（使用 `MessagePort.onmessage`），将其放入段落中。`MessageChannel.port1`已经监听，以检测消息何时到达。


```js
var channel = new MessageChannel();
var para = document.querySelector("p");

var ifr = document.querySelector("iframe");
var otherWindow = ifr.contentWindow;

ifr.addEventListener("load", iframeLoaded, false);

function iframeLoaded() {
  otherWindow.postMessage("Hello from the main page!", "\*", [channel.port2]);
}

channel.port1.onmessage = handleMessage;
function handleMessage(e) {
  para.innerHTML = e.data;
}
```


有关完整的运行示例，请参阅我们在 GitHub 的 channel messaging basic demo (run it live too).

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

| Specification |
| --- |
| HTML Standard # dom-messagechannel-port2-dev |

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

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

See also
--------

* Using channel messaging
MessageChannel()
================

`MessageChannel` 接口的 `MessageChannel()` 构造函数返回一个新的 `MessageChannel` 对象，返回的对象中包含两个 `MessagePort` 对象。

**备注：** 此特性在 Web Worker 中可用

语法
--


```js
new MessageChannel();
```

### 返回值

一个新创建的 `MessageChannel` 对象。

例子
--

在下面的代码块中，你会看到一个由 `MessageChannel.MessageChannel` 构造函数创建的新 Channel. 当 IFrame 被加载后，我们使用 `MessagePort.postMessage` (en-US) 把 `port2` 和一条消息一起发送给 IFrame. 然后 `handleMessage` 回调响应 IFrame 发回的消息（使用 `MessagePort.onmessage`），并把它渲染到页面段落中。`MessageChannel.port1` 用来监听，当消息到达时，会进行处理。


```js
var channel = new MessageChannel();
var para = document.querySelector("p");

var ifr = document.querySelector("iframe");
var otherWindow = ifr.contentWindow;

ifr.addEventListener("load", iframeLoaded, false);

function iframeLoaded() {
  otherWindow.postMessage("Hello from the main page!", "\*", [channel.port2]);
}

channel.port1.onmessage = handleMessage;
function handleMessage(e) {
  para.innerHTML = e.data;
}
```


有关更完整的运行示例，可以在 GitHub 上查看 channel messaging 基本示例（也可以在线运行示例）。

规范
--

| Specification |
| --- |
| HTML Standard # dom-messagechannel-dev |

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

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

参见
--

* 使用 channel messaging
load()
======

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

该`MediaKeySession.load()`方法返回一个`Promise`，它在加载指定的会话对象的数据后解析为一个布尔值。

句法
--
```

mediaKeySession .load(sessionId).then(function(booleanValue){...});
```

### 参数

sessionId

由当前媒体对象及其相关键或许可证的内容解析模块生成的唯一字符串。

### 返回值

一个`Promise`解析为一个布尔值，指示加载是成功还是失败。

规范
--

| Specification |
| --- |
| Encrypted Media Extensions # dom-mediakeysession-load |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
AudioBufferSourceNode.start()
=============================

`AudioBufferSourceNode` 接口的`start()`方法用于计划对缓冲区中包含的音频数据的回放，或者立即开始回放。

语法
--
```

AudioBufferSourceNode.start([when][, offset][, duration]);
```

### 参数

`when` 可选

The time 声音开始播放的时间，单位是秒，与 `AudioContext`使用相同的时间坐标系统。如果 `when` 小于 (`AudioContext.currentTime`, 或者是 0，声音立即被播放。 **默认值是 0。**

`offset` 可选

An offset, specified as the number of seconds in the same time coordinate system as the `AudioContext`, to the time within the audio buffer that playback should begin. For example, to start playback halfway through a 10-second audio clip, `offset` should be 5. The default value, 0, will begin playback at the beginning of the audio buffer, and offsets past the end of the audio which will be played (based on the audio buffer's `duration` and/or the `loopEnd` (en-US) property) are silently clamped to the maximum value allowed. The computation of the offset into the sound is performed using the sound buffer's natural sample rate, rather than the current playback rate, so even if the sound is playing at twice its normal speed, the midway point through a 10-second audio buffer is still 5.

`duration` 可选

将要播放的声音的持续时间，指定单位为秒。如果这个参数没有被指定，声音播放到自然结束或者使用`stop()` 方法结束。使用这个参数的功能与调用 `start(when, offset)` 和调用 `stop(when+duration)`完全相同。

### 返回值

`undefined`.

### 异常

`TypeError`

A negative value was specified for one or more of the three time parameters. Please don't attempt to tamper with the laws of temporal physics.

`InvalidStateError`

`start()` 已经被调用。在一个`AudioBufferSourceNode`的生命周期内只能调用一次这个函数。

例子
--

The most simple example just starts the audio buffer playing from the beginning — you don't need to specify any parameters in this case:


```js
source.start();
```


The following more complex example will, 1 second from now, start playing 10 seconds worth of sound starting 3 seconds into the audio buffer.


```js
source.start(audioCtx.currentTime + 1, 3, 10);
```


**备注：** For a more complete example showing `start()` in use, check out our `AudioContext.decodeAudioData()` example, You can also run the code example live, or view the source.

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

| Specification |
| --- |
| Web Audio API # dom-audiobuffersourcenode-start |

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

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

See also
--------

* Using the Web Audio API
AudioBufferSourceNode.buffer
============================

`AudioBufferSourceNode` 接口的 **`buffer`** 属性提供了重复播放音频的能力，该音频使用 `AudioBuffer` 作为声音文件的来源。

如果 `buffer` 属性的值为 `null`，节点会自动生成一个单声道的无声文件（所有采样均为 0）。

值
-

一个 `AudioBuffer`，包含了节点将要播放的声音数据。

示例
--

**备注：** 完整的示例请查看演示示例，或查看源代码。


```js
const myArrayBuffer = audioCtx.createBuffer(2, frameCount, audioCtx.sampleRate);

button.onclick = function() {
  // Fill the buffer with white noise;
  //just random values between -1.0 and 1.0
  for (let channel = 0; channel < channels; channel++) {
   // This gives us the actual ArrayBuffer that contains the data
   const nowBuffering = myArrayBuffer.getChannelData(channel);
   for (let i = 0; i < frameCount; i++) {
     // Math.random() is in [0; 1.0]
     // audio needs to be in [-1.0; 1.0]
     nowBuffering[i] = Math.random() \* 2 - 1;
   }
  }

  // Get an AudioBufferSourceNode.
  // This is the AudioNode to use when we want to play an AudioBuffer
  const source = audioCtx.createBufferSource();
  // set the buffer in the AudioBufferSourceNode
  source.buffer = myArrayBuffer;
```

规范
--

| Specification |
| --- |
| Web Audio API # dom-audiobuffersourcenode-buffer |

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

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

参见
--

* 使用 Web Audio API
* Web Audio API
GainNode.gain
=============

`GainNode` 接口的 `gain` 属性是一个 a-rate `AudioParam`，表示要应用的增益量。

值
-

一个 `AudioParam`。

**备注：** 虽然 `AudioParam` 属性是只读的，但其返回的值不是。

示例
--

参见 `BaseAudioContext.createGain()` (en-US) 以获取示例代码，示例代码展示了如何使用 `AudioContext` 来创建 `GainNode`，并通过修改其 gain 属性值以静音或取消静音。

规范
--

| Specification |
| --- |
| Web Audio API # dom-gainnode-gain |

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

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

参见
--

* 使用 Web Audio API
FontData：style 属性
=================

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

`FontData` 接口的 **`style`** 只读属性返回字体的样式。

这是用于选择要使用的字体样式的值，例如在 `font-style` 属性内。

示例包括：

* UltraLight
* Regular
* Heavy
* Medium Italic
* Extrabold
值
-

一个字符串。

示例
--

以下代码片段将查询所有可用的字体并打印元数据。例如，这可以用于填充字体选择器控件。


```js
async function logFontData() {
  try {
    const availableFonts = await window.queryLocalFonts();
    for (const fontData of availableFonts) {
      console.log(fontData.postscriptName);
      console.log(fontData.fullName);
      console.log(fontData.family);
      console.log(fontData.style);
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
}
```

规范
--

| Specification |
| --- |
| Local Font Access # ref-for-dom-fontdata-style |

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

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

参见
--

* 使用带有本地字体的高级排版
* `@font-face`
FontData：family 属性
==================

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

`FontData` 接口的 **`family`** 只读属性返回字体的字体族。

这是在代码中引用字体族时使用的名称，例如在 `font-family` 属性中或在 `@font-face` at-规则中，如 `local()` 函数。

示例包括：

* Apple SD Gothic Neo
* Arial Black
* Avenir Next
* Katari
* YuMincho +36p Kana
值
-

一个字符串。

示例
--

以下代码片段将查询所有可用的字体并打印元数据。例如，这可以用于填充字体选择器控件。


```js
async function logFontData() {
  try {
    const availableFonts = await window.queryLocalFonts();
    for (const fontData of availableFonts) {
      console.log(fontData.postscriptName);
      console.log(fontData.fullName);
      console.log(fontData.family);
      console.log(fontData.style);
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
}
```

规范
--

| Specification |
| --- |
| Local Font Access # ref-for-dom-fontdata-family |

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

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

参见
--

* 使用带有本地字体的高级排版
* `@font-face`
FontData：fullName 属性
====================

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

`FontData` 接口的 **`fullName`** 只读属性返回字体的全名。这通常是一个用于识别字体的人类可读的名称，例如：“Optima Bold”。

示例包括：

* Apple SD Gothic Neo UltraLight
* Arial Black
* Avenir Next Heavy
* Katari Medium Italic
* YuMincho +36p Kana Extrabold
值
-

一个字符串。

示例
--

以下代码片段将查询所有可用的字体并打印元数据。例如，这可以用于填充字体选择器控件。


```js
async function logFontData() {
  try {
    const availableFonts = await window.queryLocalFonts();
    for (const fontData of availableFonts) {
      console.log(fontData.postscriptName);
      console.log(fontData.fullName);
      console.log(fontData.family);
      console.log(fontData.style);
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
}
```

规范
--

| Specification |
| --- |
| Local Font Access # ref-for-dom-fontdata-fullname |

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

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

参见
--

* 使用带有本地字体的高级排版
* `@font-face`
FontData：blob() 方法
==================

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

`FontData` 接口的 **`blob()`** 方法返回一个会兑现包含底层字体文件的原始字节的 `Blob` 的 `Promise`。

语法
--


```js
blob()
```

### 参数

无。

### 返回值

一个会兑现包含底层字体文件的原始字节的 `Blob` 的 `Promise`。

示例
--

`blob()` 方法提供对底层 SFNT 数据的访问——这是一种可以包含其他字体格式的字体文件格式，例如 PostScript、TrueType、OpenType 或 Web 开放字体格式（WOFF）。


```js
async function computeOutlineFormat() {
  try {
    const availableFonts = await window.queryLocalFonts({
      postscriptNames: ["ComicSansMS"],
    });
    for (const fontData of availableFonts) {
      // `blob()` 方法返回一个包含有效且完整的 SFNT 包装字体数据的 Blob。
      const sfnt = await fontData.blob();
      // 仅裁剪出我们需要的字节部分：前 4 个字节是 SFNT 版本信息。
      // 规范：https://learn.microsoft.com/zh-cn/typography/opentype/spec/otff#organization-of-an-opentype-font
      const sfntVersion = await sfnt.slice(0, 4).text();

      let outlineFormat = "UNKNOWN";
      switch (sfntVersion) {
        case "\x00\x01\x00\x00":
        case "true":
        case "typ1":
          outlineFormat = "truetype";
          break;
        case "OTTO":
          outlineFormat = "cff";
          break;
      }
      console.log("矢量字体格式：", outlineFormat);
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
}
```

规范
--

| Specification |
| --- |
| Local Font Access # ref-for-dom-fontdata-blob① |

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

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

参见
--

* 使用带有本地字体的高级排版
* `@font-face`
FontData：postscriptName 属性
==========================

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

`FontData` 接口的 **`postscriptName`** 只读属性返回字体的 PostScript 名称。

这是用于唯一标识字体的 PostScript 名称，通常是包含字体名称和样式的完整字符序列。

示例包括：

* AppleSDGothicNeo-UltraLight
* Arial-Black
* AvenirNext-Heavy
* Katari-MediumItalic
* YuMin\_36pKn-Extrabold
值
-

一个字符串。

示例
--

以下代码片段将查询所有可用的字体并打印元数据。例如，这可以用于填充字体选择器控件。


```js
async function logFontData() {
  try {
    const availableFonts = await window.queryLocalFonts();
    for (const fontData of availableFonts) {
      console.log(fontData.postscriptName);
      console.log(fontData.fullName);
      console.log(fontData.family);
      console.log(fontData.style);
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
}
```

规范
--

| Specification |
| --- |
| Local Font Access # ref-for-dom-fontdata-postscriptname |

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

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

参见
--

* 使用带有本地字体的高级排版
* `@font-face`
HTMLHtmlElement.version
=======================

概述
--

它返回有关文档的\*\*文档类型定义（DTD）\*\*的版本信息。尽管此属性能够被*Mozilla*识别，但此属性的返回值始终是空字符串。

**备注：** 此属性已被 W3C 的**HTML 4.01 技术建议**声明弃用，赞成使用 DTD 来获取文档的版本信息。
IntersectionObserver.unobserve()
================================

`IntersectionObserver`的`unobserve()`
 方法命令`IntersectionObserver`停止对一个元素的观察。

语法
--


```js
IntersectionObserver.unobserve(target);
```

### 参数

`target`

要取消观察的目标，如果没有提供，方法不做任何事情，也不会抛出异常。

### 返回值

`undefined`.

例子
--

下面代码段展示了一个观察器被创建，一个元素被观察，以及取消观察的过程。


```js
var observer = new IntersectionObserver(callback);
observer.observe(document.getElementById("elementToObserve"));

/\* ... \*/

observer.unobserve(document.getElementById("elementToObserve"));
```

说明
--

| Specification |
| --- |
| Intersection Observer # dom-intersectionobserver-unobserve |

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

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

参见
--

* Intersection Observer API
* `IntersectionObserver.observe()`
IntersectionObserver.rootMargin
===============================

`IntersectionObserver` 接口的只读属性 **`rootMargin`** 是与 CSS 属性`margin`语法相似的字符串 (string) 对象。在交叉检测开始之前，由`rootMargin 规定的矩形的每一边都会被添加至``root`元素的边框盒 (bounding box (en-US)) 的相应边。例如，这可以让你向外调整边界，使得目标元素被认为是 100% 可见的，即使此元素得一部分长或宽被裁剪，或者在边缘过于靠近根边框盒边界的情况下，将目标视为部分隐藏。

可参考交集的计算来深入了解 root margin 的工作原理或如何使其与根的边框盒进行协同工作。

语法
--
```

var marginString = IntersectionObserver.rootMargin;
```

### 值

一个字符串，形式与 CSS `margin`属性相似，包含了一条或一组根边框盒边的偏移量。这些偏移量会被添加至根边界盒与目标元素边界的交叉区域之前。

这个属性返回的字符串也许会与`IntersectionObserver`被配置时所指定的值有所差别。浏览器可以改变这些值。

如果 rootMargin 在对象初始化的时候未被指定，它将被设置成默认值 `"0px 0px 0px 0px"`，这将意味着在原根节点边界框与目标边界之间计算交叉值。交集的计算描述了 rootMargin 的更加深入的使用方法。

规范
--

| Specification |
| --- |
| Intersection Observer # dom-intersectionobserver-rootmargin |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
IntersectionObserver.disconnect()
=================================

`IntersectionObserver` 的`disconnect()`方法终止对所有目标元素可见性变化的观察。语法
--


```js
intersectionObserver.disconnect();
```

### 参数

None.

### 返回值

`undefined`.

说明
--

| Specification |
| --- |
| Intersection Observer # dom-intersectionobserver-disconnect |

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

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

参考
--

* `observe()`
* `unobserve()`
IntersectionObserver.takeRecords()
==================================

`IntersectionObserver` 的方法\*\*`takeRecords()`\*\* 返回一个 `IntersectionObserverEntry` 对象数组，每个对象的目标元素都包含每次相交的信息，可以显式通过调用此方法或隐式地通过观察者的回调自动调用。

**备注：** 如果使用回调来监视这些更改，则无需调用此方法。调用此方法会清除挂起的相交状态列表，因此不会运行回调。

语法
--
```

intersectionObserverEntries = intersectionObserver.takeRecords();
```

### 参数

None.

### 返回值

`IntersectionObserverEntry` 对象数组，每个对象包含目标元素与根每次的相交信息。

Examples
--------

<<<...>>>

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

| Specification |
| --- |
| Intersection Observer # dom-intersectionobserver-takerecords |

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

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

See also
--------

* Intersection Observer API
IntersectionObserver.root
=========================

`root` 属性用来获取当前 `intersectionObserver` 实例的根元素。

语法
--
```

intersectionObserver.root;
```

规范
--

| Specification |
| --- |
| Intersection Observer # dom-intersectionobserver-root |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
IntersectionObserver.IntersectionObserver()
===========================================

\*\*`IntersectionObserver()`\*\*构造器创建并返回一个`IntersectionObserver`对象。如果指定`rootMargin`则会检查其是否符合语法规定，检查阈值以确保全部在 0.0 到 1.0 之间，并且阈值列表会按升序排列。如果阈值列表为空，则默认为一个 [0.0] 的数组。

语法
--
```

var observer = new IntersectionObserver(callback[, options]);
```

### 参数

`callback`

当元素可见比例超过指定阈值后，会调用一个回调函数，此回调函数接受两个参数：

`entries`

一个`IntersectionObserverEntry`对象的数组，每个被触发的阈值，都或多或少与指定阈值有偏差。

`observer`

被调用的`IntersectionObserver`实例。


`options` 可选

一个可以用来配置 observer 实例的对象。如果`options`未指定，observer 实例默认使用文档视口作为 root，并且没有 margin，阈值为 0%（意味着即使一像素的改变都会触发回调函数）。你可以指定以下配置：

`root`

监听元素的祖先元素`Element`对象，其边界盒将被视作视口。目标在根的可见区域的的任何不可见部分都会被视为不可见。

`rootMargin`

一个在计算交叉值时添加至根的边界盒 (bounding\_box (en-US)) 中的一组偏移量，类型为字符串 (string) ，可以有效的缩小或扩大根的判定范围从而满足计算需要。语法大致和 CSS 中的`margin` 属性等同; 可以参考 intersection root 和 root margin 来深入了解 margin 的工作原理及其语法。默认值是"0px 0px 0px 0px"。

`threshold`

规定了一个监听目标与边界盒交叉区域的比例值，可以是一个具体的数值或是一组 0.0 到 1.0 之间的数组。若指定值为 0.0，则意味着监听元素即使与根有 1 像素交叉，此元素也会被视为可见。若指定值为 1.0，则意味着整个元素都在可见范围内时才算可见。可以参考阈值来深入了解阈值是如何使用的。阈值的默认值为 0.0。


### 返回值

一个可以使用规定阈值监听目标元素可见部分与`root`交叉状况的新的`IntersectionObserver` 实例。调用自身的`observe()` 方法开始使用规定的阈值监听指定目标。

### 异常

`SyntaxError`

指定的`rootMargin`不存在。

RangeError

一个或多个阈值超出了 0.0 到 1.0 的范围。

规范
--

| Specification |
| --- |
| Intersection Observer # dom-intersectionobserver-intersectionobserver |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
IntersectionObserver.observe()
==============================

`IntersectionObserver` 对象的\*\*`observe()`\*\* 方法向 IntersectionObserver 对象监听的目标集合添加一个元素。一个监听者有一组阈值和一个根，但是可以监视多个目标元素，以查看这些目标元素可见区域的变化。调用`IntersectionObserver.unobserve()`方法可以停止观察元素。

当指定元素的可见区域超过监听者的可见区域阈值之一时（阈值列表`IntersectionObserver.thresholds` (en-US)），监听者的回调会被传入代表当前发生的交叉变化`IntersectionObserverEntry`并执行。请注意，这种设计允许通过调用一次回调，给回调传入 IntersectionObserverEntry 对象数组，来实现同时处理多个被监听元素的交叉变化。

语法
--


```js
IntersectionObserver.observe(targetElement);
```

### 参数

`targetElement`

 可见性区域被监控的元素`element`。
 此元素必须是根元素的后代 (如果根元素为视窗，则该元素必须被当前文档包含)。


### 返回值

`undefined`.

示例
--


```js
// Register IntersectionObserver
const io = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    // Add 'active' class if observation target is inside viewport
    if (entry.intersectionRatio > 0) {
      entry.target.classList.add("active");
    }
    // Remove 'active' class otherwise
    else {
      entry.target.classList.remove("active");
    }
  });
});

// Declares what to observe, and observes its properties.
const boxElList = document.querySelectorAll(".box");
boxElList.forEach((el) => {
  io.observe(el);
});
```

规范
--

| Specification |
| --- |
| Intersection Observer # dom-intersectionobserver-observe |

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

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

参考
--

* `IntersectionObserver.unobserve()`
PushManager.supportedContentEncodings
=====================================

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

`PushManager` 的只读静态方法 **`supportedContentEncodings`** 返回一组支持内容编码，可以用在加密信息中发送的消息。

值
-

一个字符串数组。

规范
--

| Specification |
| --- |
| Push API # dom-pushmanager-supportedcontentencodings |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
PushManager.subscribe()
=======================

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

`PushManager` 的 **`subscribe()`** 接口订阅了一个推送服务。

返回一个 `Promise` 形式的 `PushSubscription` (en-US) 对象，该对象包含了推送订阅详情。如果当前 service worker 没有已存在的订阅，则会创建一个新的推送订阅。

语法
--
```

PushManager.subscribe(options).then(function(pushSubscription) { ... } );
```

### 参数

`options 可选`

`一个包含可选配置参数的对象。包含以下属性：`

* `userVisibleOnly`: 布尔值，表示返回的推送订阅将只能被用于对用户可见的消息。
* applicationServerKey：推送服务器用来向客户端应用发送消息的公钥。该值是应用程序服务器生成的签名密钥对的一部分，可使用在 P-256 曲线上实现的椭圆曲线数字签名（ECDSA）。可以是`DOMString` 或 `ArrayBuffer`。

### 返回值

返回 `PushSubscription` (en-US) 对象的 `Promise`。

示例
--
```

this.onpush = function(event) {
  console.log(event.data);
  // 这里可以向 IndexDB 写入数据，向任何打开的窗口发送数据以及显示通知等
}

navigator.serviceWorker.register('serviceworker.js').then(
  function(serviceWorkerRegistration) {
    var options = {
      userVisibleOnly: true,
      applicationServerKey: applicationServerKey
    };
    serviceWorkerRegistration.pushManager.subscribe(options).then(
      function(pushSubscription) {
        console.log(pushSubscription.endpoint);
        // 应用服务器所需的推送订阅详情现在可用，并且可以通过如 XMLHttpRequest 的方式发送
      }, function(error) {
        // 开发过程中将错误打印到控制台通常很有帮助。同样，生产环境下将错误信息发送至应用服务器后台也一样。
        console.log(error);
      }
    );
  });
```

规范
--

| Specification |
| --- |
| Push API # dom-pushmanager-subscribe |

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

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

另见
--

* 使用 Push API (en-US)
PushManager.getSubscription()
=============================

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

`PushManager` 接口的方法\*\*`PushManager.getSubscription()`\*\* 尝试获取已有的推送订阅。

它返回一个 `Promise` 用来 resolve 出一个包含现有订阅的详细信息的`PushSubscription` (en-US) 对象。如果不存在已有的推送订阅，返回 null。

语法
--


```js
PushManager.getSubscription().then(function(pushSubscription) { ... } );
```

### 参数

无。

### 返回值

A `Promise` that resolves to a `PushSubscription` (en-US) object or `null`.

例子
--

这个代码片段来自 push messaging and notification sample. (没有能直接运行的例子.)


```js
// We need the service worker registration to check for a subscription
navigator.serviceWorker.ready.then(function (serviceWorkerRegistration) {
  // Do we already have a push message subscription?
  serviceWorkerRegistration.pushManager
    .getSubscription()
    .then(function (subscription) {
      // Enable any UI which subscribes / unsubscribes from
      // push messages.
      var pushButton = document.querySelector(".js-push-button");
      pushButton.disabled = false;

      if (!subscription) {
        // We aren’t subscribed to push, so set UI
        // to allow the user to enable push
        return;
      }

      // Keep your server in sync with the latest subscriptionId
      sendSubscriptionToServer(subscription);

      showCurlCommand(subscription);

      // Set your UI to show they have subscribed for
      // push messages
      pushButton.textContent = "Disable Push Messages";
      isPushEnabled = true;
    })
    .catch(function (err) {
      window.Demo.debug.log("Error during getSubscription()", err);
    });
});
```

规范
--

| Specification |
| --- |
| Push API # dom-pushmanager-getsubscription |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
Range.deleteContents()
======================

**`Range.deleteContents()`** 移除来自 `Document`的`Range` 内容。

不像`Range.extractContents`一样，本方法不会返回一个包含删除内容的文本片段`DocumentFragment` 。

语法
--
```

range.deleteContents()
```

例子
--


```js
range = document.createRange();
range.selectNode(document.getElementsByTagName("div").item(0));
range.deleteContents();
```

规范
--

| Specification |
| --- |
| DOM Standard # dom-range-deletecontents |

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

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

参考
--

* The DOM interfaces index (en-US)
Range.startContainer
====================

Range.startContainer 是只读属性，返回 Range 开始的节点。要更改节点的起始位置，请使用 Range.setStart() 方法。

Syntax
------
```

startRangeNode = range.startContainer;
```

Example
-------


```js
range = document.createRange();
range.setStart(startNode, startOffset);
range.setEnd(endNode, endOffset);
startRangeNode = range.startContainer;
```

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

| Specification |
| --- |
| DOM Standard # ref-for-dom-range-startcontainer① |

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

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

See also
--------

* The DOM interfaces index (en-US)