Start · Sprachen · JavaScript · Referenz · ShadowRoot.customElementRegistry

ShadowRoot.customElementRegistry

Eigenschaft

Gibt die <code>CustomElementRegistry</code> zurück, die diesem Shadow Root zugeordnet ist, oder <code>null</code>, wenn keine festgelegt wurde.

seit JavaScript Neu (Scoped Custom Element Registries): Safari 26, Kategorie: webapi

Signatur

get ShadowRoot.customElementRegistry

Beschreibung

Die schreibgeschützte Eigenschaft customElementRegistry eines ShadowRoot zeigt an, welche Registry für benutzerdefinierte Elemente innerhalb dieses Shadow-Baums gilt. Sie gehört zur Funktion Scoped Custom Element Registries. Damit können verschiedene Komponenten denselben Tag-Namen (z. B. <my-button>) mit unterschiedlichen Klassen verwenden, ohne sich in der globalen Registry window.customElements gegenseitig in die Quere zu kommen.

Eine eigene Registry legen Sie mit new CustomElementRegistry() an und übergeben sie beim Erzeugen des Shadow Root über element.attachShadow({ mode, customElementRegistry }). Elemente, die danach im Shadow-Baum geparst oder erzeugt werden (z. B. über innerHTML), werden mit dieser Registry aufgewertet (Upgrade). Ohne die Option erbt der Shadow Root die Registry des Dokuments, in der Regel also window.customElements.

Der Wert ist null, wenn für den Shadow Root noch keine Registry festgelegt wurde. Das passiert etwa bei deklarativem Shadow DOM mit dem Attribut shadowrootcustomelementregistry. Mit registry.initialize(shadowRoot) lässt sich eine Registry nachträglich zuweisen. Danach liefert die Eigenschaft dieses Objekt.

Die Eigenschaft hilft vor allem beim Debuggen, bei der Funktionserkennung und in Bibliotheken, die prüfen müssen, in welchem Bereich (Scope) ein Tag-Name aufgelöst wird.

Rückgabewert

Typ
CustomElementRegistry | null
Beschreibung
Die diesem Shadow Root zugeordnete CustomElementRegistry: entweder eine eigene, bereichsbezogene Registry, die globale window.customElements oder null, falls keine festgelegt ist.

Beispiele

Eigene Registry für einen Shadow Root verwenden

// Eigene Registry nur für diese Komponente
const registry = new CustomElementRegistry();

class FancyButton extends HTMLElement {
  connectedCallback() {
    this.textContent = 'Fancy!';
  }
}
registry.define('my-button', FancyButton);

const host = document.createElement('div');
document.body.append(host);

const shadow = host.attachShadow({ mode: 'open', customElementRegistry: registry });
shadow.innerHTML = '<my-button></my-button>';

console.log(shadow.customElementRegistry === registry);
console.log(shadow.querySelector('my-button') instanceof FancyButton);
// Global ist 'my-button' nicht definiert
console.log(customElements.get('my-button'));
true true undefined

Standardfall: globale Registry wird geerbt

const host = document.createElement('section');
const shadow = host.attachShadow({ mode: 'open' });

console.log(shadow.customElementRegistry === window.customElements);
true

Deklaratives Shadow DOM nachträglich initialisieren

// HTML:
// <div id="host">
//   <template shadowrootmode="open" shadowrootcustomelementregistry>
//     <x-card></x-card>
//   </template>
// </div>
const shadow = document.getElementById('host').shadowRoot;
console.log(shadow.customElementRegistry); // noch keine Registry

const registry = new CustomElementRegistry();
registry.define('x-card', class extends HTMLElement {});
registry.initialize(shadow);

console.log(shadow.customElementRegistry === registry);
null true

Funktionserkennung mit Rückfall

const supportsScoped =
  'customElementRegistry' in ShadowRoot.prototype &&
  typeof CustomElementRegistry === 'function' &&
  (() => { try { new CustomElementRegistry(); return true; } catch { return false; } })();

const createShadow = (host) => supportsScoped
  ? host.attachShadow({ mode: 'open', customElementRegistry: new CustomElementRegistry() })
  : host.attachShadow({ mode: 'open' }); // Rückfall: globale Registry

const shadow = createShadow(document.createElement('div'));
console.log(supportsScoped, shadow.customElementRegistry);
true CustomElementRegistry {} (in unterstützenden Browsern)

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie shadow.customElementRegistry = reg hat keine Wirkung und löst im Strict Mode einen TypeError aus. Legen Sie die Registry über attachShadow() fest oder bei null über CustomElementRegistry.prototype.initialize().
  • Browser-Unterstützung: Scoped Custom Element Registries sind neu und noch nicht Baseline. In älteren Browsern fehlt die Eigenschaft (undefined), und new CustomElementRegistry() wirft einen TypeError. Prüfen Sie die Unterstützung daher immer vorab oder verwenden Sie ein Polyfill (z. B. @webcomponents/scoped-custom-element-registry).
  • Prüfen Sie nicht nur auf undefined: Der Wert null ist in unterstützenden Browsern ein gültiger Zustand und bedeutet „noch keine Registry festgelegt“.
  • Elemente, die vor dem Festlegen der Registry im Shadow-Baum stehen, bleiben zunächst undefiniert (:not(:defined)). Sie werden erst aufgewertet, wenn eine passende Definition verfügbar ist.
  • document.createElement() verwendet ohne Option die Registry des Dokuments. Für bereichsbezogene Elemente gibt es die Option { customElementRegistry }, oder Sie erzeugen die Elemente per innerHTML direkt im Shadow Root.