CustomElementRegistry:whenDefined() 方法

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.

CustomElementRegistry 接口的 whenDefined() 方法返回一个在具名元素被定义时兑现的 Promise

语法

js
whenDefined(name)

参数

name

自定义元素的名称。

返回值

一个 Promise,会在使用给定名称定义自定义元素时兑现该自定义元素的构造函数。如果已经定义了给定名称的自定义元素,则 promise 立刻兑现。

如果名称不是有效的自定义元素名,则 promise 会以 SyntaxError DOMException 被拒绝。

示例

此示例使用 whenDefined() 来检测生成菜单的自定义元素何时被定义。这个菜单显示占位符内容一直到菜单内容已经准备好显示。

html
<nav id="menu-container">
  <div class="menu-placeholder">加载中……</div>
  <nav-menu>
    <menu-item>项目 1</menu-item>
    <menu-item>项目 2</menu-item>
    ……
    <menu-item>项目 N</menu-item>
  </nav-menu>
</nav>
js
const container = document.getElementById("menu-container");
const placeholder = container.querySelector(".menu-placeholder");
// 获取菜单中尚未被定义的所有子元素。
const undefinedElements = container.querySelectorAll(":not(:defined)");

async function removePlaceholder() {
  // 过滤出元素的唯一 localName
  const tags = new Set(
    [...undefinedElements].map((button) => button.localName),
  );
  const promises = [...tags].map((tag) => customElements.whenDefined(tag));

  // 等待所有的子元素升级
  await Promise.all(promises);
  // 然后移除占位符
  container.removeChild(placeholder);
}

removePlaceholder();

规范

Specification
HTML Standard
# dom-customelementregistry-whendefined-dev

浏览器兼容性

BCD tables only load in the browser