CustomElementRegistry: define() 方法

基线 广泛可用

此功能已得到完善,可在许多设备和浏览器版本上运行。自以下日期起,它已在各浏览器中可用 2020年1月.

define() 方法是 CustomElementRegistry 接口的方法,它将自定义元素的定义添加到自定义元素注册表中,将其名称映射到用于创建它的构造函数。

语法

js
define(name, constructor)
define(name, constructor, options)

参数

name

新自定义元素的名称。必须是 有效的自定义元素名称

constructor

新自定义元素的构造函数。

options 可选

控制元素定义方式的对象。当前支持一个选项

extends

指定要扩展的内置元素名称的字符串。用于创建自定义的内置元素。

返回值

无 (undefined).

异常

NotSupportedError DOMException

如果抛出

  • CustomElementRegistry 中已存在具有相同名称或相同构造函数的条目(或以其他方式已定义)。
  • 指定了 extends 选项,并且它是 有效的自定义元素名称
  • 指定了 extends 选项,但它试图扩展的元素是未知元素。
SyntaxError DOMException

如果提供的名称不是 有效的自定义元素名称,则抛出。

TypeError

如果引用的构造函数不是构造函数,则抛出。

描述

define() 方法将自定义元素的定义添加到自定义元素注册表中,将其名称映射到用于创建它的构造函数。

您可以创建两种类型的自定义元素

  • 自主自定义元素是独立的元素,不继承自内置 HTML 元素。
  • 自定义内置元素是继承自内置 HTML 元素并扩展其功能的元素。

要定义自主自定义元素,您应该省略 options 参数。

要定义自定义内置元素,您必须传递 options 参数,并将其 extends 属性设置为要扩展的内置元素的名称,并且这必须对应于您的自定义元素类定义继承的接口。例如,要自定义 <p> 元素,您必须将 {extends: "p"} 传递给 define(),并且您的元素的类定义必须继承自 HTMLParagraphElement

有效的自定义元素名称

自定义元素名称必须

  • 以 ASCII 小写字母 (a-z) 开头
  • 包含连字符
  • 不包含任何 ASCII 大写字母
  • 不包含某些其他字符,如 Web Components 规范的 有效自定义元素名称 部分中所述
  • 不能是以下任何一项
    • "annotation-xml"
    • "color-profile"
    • "font-face"
    • "font-face-src"
    • "font-face-uri"
    • "font-face-format"
    • "font-face-name"
    • "missing-glyph"

示例

定义自主自定义元素

以下类实现了一个最小的自主自定义元素

js
class MyAutonomousElement extends HTMLElement {
  constructor() {
    super();
  }
}

此元素不执行任何操作:真实的自主元素将在其构造函数和标准提供的生命周期回调中实现其功能。请参阅我们关于使用自定义元素的指南中的 实现自定义元素

但是,以上类定义满足了 define() 方法的要求,因此我们可以使用以下代码对其进行定义

js
customElements.define("my-autonomous-element", MyAutonomousElement);

然后,我们可以在 HTML 页面中像这样使用它

html
<my-autonomous-element>Element contents</my-autonomous-element>

定义自定义内置元素

以下类实现了一个自定义内置元素

js
class MyCustomizedBuiltInElement extends HTMLParagraphElement {
  constructor() {
    super();
  }
}

此元素扩展了内置的 <p> 元素。

在此最小示例中,该元素没有实现任何自定义,因此它的行为就像普通的 <p> 元素一样。但是,它确实满足了 define() 的要求,因此我们可以像这样对其进行定义

js
customElements.define(
  "my-customized-built-in-element",
  MyCustomizedBuiltInElement,
  {
    extends: "p",
  },
);

然后,我们可以在 HTML 页面中像这样使用它

html
<p is="my-customized-built-in-element"></p>

规范

规范
HTML 标准
# dom-customelementregistry-define-dev

浏览器兼容性

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

另请参阅