Zum Inhalt springen

Benutzerdefinierte Elemente

Benutzerdefinierte Elemente stellen eine der fundamentalen Säulen von Web Components dar und ermöglichen es Entwicklern, eigene HTML-Tags und Komponenten zu definieren. Diese Fähigkeit erweitert den Standard-HTML-Wortschatz und erlaubt die Erstellung wiederverwendbarer und gekapselter Elemente mit individuellem Verhalten. Tauchen wir tiefer in die Welt der Benutzerdefinierten Elemente ein und entdecken Sie, wie Sie deren Potenzial nutzen können.

Definieren eines benutzerdefinierten Elements

Um ein benutzerdefiniertes Element zu erstellen, verwenden wir die class-Syntax in JavaScript, um eine neue Klasse zu definieren, die die eingebaute HTMLElement-Klasse erweitert. Diese Klasse kapselt das Verhalten und die Eigenschaften des Elements. Sobald definiert, registrieren wir es im Browser mit customElements.define().

Beispiel: Erstellen eines einfachen benutzerdefinierten Elements


html
<my-custom-element></my-custom-element>
<script>
  class MyCustomElement extends HTMLElement {
    constructor() {
      super();
      this.attachShadow({ mode: 'open' });
      this.shadowRoot.innerHTML = `<p>Hello, World!</p>`;
    }
  }
  
  customElements.define('my-custom-element', MyCustomElement);
</script>

Dieses Beispiel definiert ein einfaches benutzerdefiniertes Element namens my-custom-element, das „Hello, World!" innerhalb eines Shadow DOM anzeigt. Um dieses Element zu verwenden, fügen Sie einfach <code><my-custom-element></code> zu Ihrem HTML hinzu.

note

Custom Elements v1 wird in allen modernen Browsern unterstützt (Chrome 54+, Firefox 52+, Safari 10.1+, Edge 79+). Überprüfen Sie stets die Browserkompatibilität, wenn Sie ältere Umgebungen unterstützen möchten.

Lebenszyklus-Callbacks

Benutzerdefinierte Elemente verfügen über eine Reihe von Lebenszyklus-Callbacks, die es Entwicklern ermöglichen, Code zu bestimmten Zeitpunkten im Lebenszyklus des Elements auszuführen:

  • connectedCallback(): Wird jedes Mal aufgerufen, wenn das benutzerdefinierte Element an ein dokumentverbundenes Element angehängt wird.
  • disconnectedCallback(): Wird jedes Mal aufgerufen, wenn das benutzerdefinierte Element vom DOM des Dokuments getrennt wird.
  • attributeChangedCallback(name, oldValue, newValue): Wird jedes Mal aufgerufen, wenn eines der Attribute des benutzerdefinierten Elements hinzugefügt, entfernt oder geändert wird.
  • adoptedCallback(): Wird jedes Mal aufgerufen, wenn das benutzerdefinierte Element in ein neues Dokument verschoben wird.
CallbackWann er ausgelöst wird
connectedCallback()Element wird zum DOM hinzugefügt
disconnectedCallback()Element wird aus dem DOM entfernt
attributeChangedCallback(name, oldValue, newValue)Ein beobachtetes Attribut ändert sich
adoptedCallback()Element wird in ein neues Dokument verschoben

Beispiel: Verwenden von Lebenszyklus-Callbacks


javascript
<lifecycle-element></lifecycle-element>
<script>
class LifecycleElement extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
    this.shadowRoot.innerHTML = `
      <style>
        #status {
          color: blue;
          font-weight: bold;
        }
      </style>
      <p>Lifecycle Element</p>
      <p id="status">Element not connected</p>
    `;
  }

  connectedCallback() {
    this.shadowRoot.getElementById('status').textContent = 'Element connected to the page.';
  }

  disconnectedCallback() {
    this.shadowRoot.getElementById('status').textContent = 'Element disconnected from the page.';
  }
}

customElements.define('lifecycle-element', LifecycleElement);
</script>

Attribute und Eigenschaften

Benutzerdefinierte Elemente können Attribute und Eigenschaften haben, um ihren Zustand und ihr Verhalten zu verwalten. Attribute werden direkt im HTML festgelegt und sind immer Strings, während Eigenschaften auf dem DOM-Objekt des Elements festgelegt werden und jeden Datentyp haben können. Beachten Sie, dass attributeChangedCallback nur für Attribute ausgelöst wird, die explizit in der Methode static get observedAttributes() des Elements aufgelistet sind.

Beispiel: Verwalten von Attributen und Eigenschaften


javascript
<attribute-element id="element" data-content="Initial content"></attribute-element>
<button onclick="buttonClicked()">Click to change attribute</button>
<script>
  class AttributeElement extends HTMLElement {
    constructor() {
      super();
      this.attachShadow({ mode: 'open' });
      this.shadowRoot.innerHTML = `<p>Attribute Example: <span id="content"></span></p>`;
    }
  
    static get observedAttributes() {
      return ['data-content'];
    }
  
    attributeChangedCallback(name, oldValue, newValue) {
      if (name === 'data-content') {
        this.shadowRoot.getElementById('content').textContent = newValue;
      }
    }
  
    set content(value) {
      this.setAttribute('data-content', value);
    }
  
    get content() {
      return this.getAttribute('data-content');
    }
  }
  
  customElements.define('attribute-element', AttributeElement);

  function buttonClicked() {
    alert('button clicked!');
    const ourCustomElement = document.getElementById('element');
    ourCustomElement.content = 'New content';
  }
</script>

Hier aktualisiert das attribute-element seinen Inhalt basierend auf dem data-content-Attribut. Die Eigenschaft content bietet eine bequeme Möglichkeit, dieses Attribut programmatisch zu lesen und zu setzen.

Erweitern eingebauter Elemente

Benutzerdefinierte Elemente können eingebaute HTML-Elemente erweitern, um neue Funktionalität hinzuzufügen, während das ursprüngliche Verhalten beibehalten wird.

Beispiel: Erweitern eines eingebauten Elements


javascript
<button is="fancy-button">Click me!</button>
<script>
  class FancyButton extends HTMLButtonElement {
    constructor() {
      super();
      this.addEventListener('click', () => {
        alert('Fancy button clicked!');
      });
    }
  }
  
  customElements.define('fancy-button', FancyButton, { extends: 'button' });
</script>

Hier erweitert fancy-button das Standard-<button>-Element und fügt eine Alert-Nachricht hinzu, wenn die Schaltfläche geklickt wird.

Best Practices für benutzerdefinierte Elemente

  1. Shadow DOM verwenden: Kapseln Sie immer die interne Struktur und die Styles Ihres benutzerdefinierten Elements mit dem Shadow DOM.
  2. Klare APIs definieren: Bieten Sie klare und intuitive APIs für Ihre benutzerdefinierten Elemente durch gut dokumentierte Attribute und Eigenschaften.
  3. Lebenszyklus-Management: Verwalten Sie die Lebenszyklus-Callbacks des Elements ordnungsgemäß, um ein robustes Verhalten zu gewährleisten und Speicherlecks zu vermeiden.
  4. Barrierefreiheit: Stellen Sie sicher, dass Ihre benutzerdefinierten Elemente barrierefrei sind, indem Sie entsprechende ARIA-Rollen und -Eigenschaften einfügen.
  5. Testing: Testen Sie Ihre benutzerdefinierten Elemente gründlich in verschiedenen Browsern und Umgebungen, um Kompatibilität und Stabilität zu gewährleisten.

Fazit

Benutzerdefinierte Elemente bieten eine leistungsstarke Möglichkeit, HTML zu erweitern und ermöglichen die Erstellung wiederverwendbarer, gekapselter Komponenten mit individuellem Verhalten. Durch die Nutzung der Funktionen benutzerdefinierter Elemente, einschließlich Lebenszyklus-Callbacks, Attributen, Eigenschaften und des Shadow DOM, können Entwickler anspruchsvolle und wartbare Webanwendungen erstellen.

Beginnen Sie noch heute damit, benutzerdefinierte Elemente in Ihren Projekten zu experimentieren, und erschließen Sie sich neue Möglichkeiten für die Webentwicklung. Die hier bereitgestellten Beispiele sind nur der Anfang – nutzen Sie sie als Grundlage, um Ihre eigenen innovativen benutzerdefinierten Elemente zu erstellen.

Praxis

Welche der folgenden Aussagen über benutzerdefinierte Elemente in JavaScript sind wahr?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.