The whenDefined()
method of the CustomElementRegistry
interface returns a Promise
that resolves when the named element is defined.
Syntax
customElements.whenDefined(name): Promise<CustomElementConstructor>;
Parameters
- name
- Custom element name.
Return value
A Promise
that will be fulfilled with the custom element's constructor when a custom element becomes defined with the given name. (If such a custom element is already defined, the returned promise will be immediately fulfilled.)
Exceptions
Exception | Description |
---|---|
SyntaxError
|
If the provided name is not a valid custom element name, the promise rejects with a SyntaxError .
|
Examples
This example uses whenDefined()
to detect when the custom elements that make up a menu are defined. The menu displays placeholder content until the actual menu content is ready to display.
<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>
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)');
const promises = [...undefinedElements].map(
button => customElements.whenDefined(button.localName)
);
// Wait for all the children to be upgraded,
// then remove the placeholder.
await Promise.all(promises);
container.removeChild(placeholder);
Specifications
Specification | Status | Comment |
HTML Living StandardThe definition of 'customElements.whenDefined()' in that specification. | Living Standard | Initial definition. |
Browser compatibility
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
Desktop | Mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Chrome Full support 66 Full support 66 Notes' Support for 'Customized built-in elements' as well. Full support 54 Notes' Support for 'Autonomous custom elements' only. |
Edge Full support 79 Full support 79 Notes' Support for 'Customized built-in elements' as well. Full support 79 Notes' Support for 'Autonomous custom elements' only. |
Firefox Full support 63 Full support 63 No support 59 — 63 Disabled' From version 59 until version 63 (exclusive): this feature is behind the Disabled' Until version 59 (exclusive): this feature is behind the |
IE
No support No |
Opera Full support 53 Full support 53 Notes' Support for 'Customized built-in elements' as well. Full support 41 Notes' Support for 'Autonomous custom elements' only. |
Safari Full support 10.1 Full support 10.1 Notes' Supports 'Autonomous custom elements' but not 'Customized built-in elements' |
WebView Android Full support 66 Full support 66 Notes' Support for 'Customized built-in elements' as well. Full support 54 Notes' Support for 'Autonomous custom elements' only. |
Chrome Android Full support 66 Full support 66 Notes' Support for 'Customized built-in elements' as well. Full support 54 Notes' Support for 'Autonomous custom elements' only. |
Firefox Android Full support 63 Full support 63 No support 59 — 63 Disabled' From version 59 until version 63 (exclusive): this feature is behind the Disabled' Until version 59 (exclusive): this feature is behind the |
Opera Android Full support 47 Full support 47 Notes' Support for 'Customized built-in elements' as well. Full support 41 Notes' Support for 'Autonomous custom elements' only. |
Safari iOS Full support 10.3 Full support 10.3 Notes' Supports 'Autonomous custom elements' but not 'Customized built-in elements' |
Samsung Internet Android Full support 9.0 Full support 9.0 Notes' Support for 'Customized built-in elements' as well. Full support 6.0 Notes' Support for 'Autonomous custom elements' only. |
Legend
- Full support
- Full support
- No support
- No support
- Experimental. Expect behavior to change in the future.'
- Experimental. Expect behavior to change in the future.
- See implementation notes.'
- See implementation notes.
- User must explicitly enable this feature.'
- User must explicitly enable this feature.
CustomElementRegistry.whenDefined() by Mozilla Contributors is licensed under CC-BY-SA 2.5.