CustomElementRegistry: whenDefined() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

CustomElementRegistry 接口的 whenDefined() 方法返回一个 Promise,该 Promise 在指定的元素被定义时解析。

语法

js
whenDefined(name)

参数

name

自定义元素的名称。

返回值

当具有给定名称的自定义元素被定义时,返回一个 Promise,该 Promise 以自定义元素的构造函数作为值履行。如果具有该名称的自定义元素已经被定义,则该 Promise 将立即履行。

如果该名称不是有效的自定义元素名称,则 Promise 将以 SyntaxError DOMException 拒绝。

示例

此示例使用 whenDefined() 来检测构成菜单的自定义元素何时被定义。菜单在实际菜单内容准备好显示之前会显示占位符内容。

html
<nav id="menu-container">
  <div class="menu-placeholder">Loading…</div>
  <nav-menu>
    <menu-item>Item 1</menu-item>
    <menu-item>Item 2</menu-item>
    …
    <menu-item>Item N</menu-item>
  </nav-menu>
</nav>
js
const container = document.getElementById("menu-container");
const placeholder = container.querySelector(".menu-placeholder");
// Fetch all the children of menu that are not yet defined.
const undefinedElements = container.querySelectorAll(":not(:defined)");

async function removePlaceholder() {
  // Filter the elements down to unique localNames
  const tags = new Set(
    [...undefinedElements].map((button) => button.localName),
  );
  const promises = [...tags].map((tag) => customElements.whenDefined(tag));

  // Wait for all the children to be upgraded
  await Promise.all(promises);
  // then remove the placeholder
  container.removeChild(placeholder);
}

removePlaceholder();

规范

规范
HTML
# dom-customelementregistry-whendefined-dev

浏览器兼容性