Signatur
Beschreibung
HTMLElement ist die gemeinsame Basis-Schnittstelle aller HTML-Elemente im DOM. Die Vererbungskette lautet EventTarget → Node → Element → HTMLElement. Spezialisierte Schnittstellen wie HTMLInputElement, HTMLDivElement oder HTMLAnchorElement erweitern sie. Elemente ohne eigenes Interface (z. B. <section>, <nav>, <b>) sind direkte Instanzen von HTMLElement.
Wichtige Eigenschaften und Methoden, die hier definiert sind:
- Inhalt & Darstellung:
innerText,outerText,hidden,style,title,lang,dir,translate - Daten:
dataset(Zugriff aufdata-*-Attribute alsDOMStringMap) - Interaktion:
click(),focus(),blur(),tabIndex,accessKey,contentEditable,isContentEditable,draggable,inert - Layout:
offsetWidth,offsetHeight,offsetTop,offsetLeft,offsetParent - Popover-API:
popover,showPopover(),hidePopover(),togglePopover() - Custom Elements:
attachInternals()
Zusätzlich implementiert HTMLElement die Event-Handler-Eigenschaften (onclick, oninput usw.) über GlobalEventHandlers. Die Schnittstelle besitzt keinen direkt aufrufbaren Konstruktor – Instanzen entstehen über document.createElement(), per HTML-Parser oder als Basisklasse für eigene Custom Elements via class X extends HTMLElement.
Rückgabewert
document.createElement(), document.querySelector() oder document.body.Beispiele
Element erzeugen und HTMLElement-Eigenschaften nutzen
const box = document.createElement('section');
box.title = 'Hinweis';
box.lang = 'de';
box.dataset.userId = '42'; // wird zu data-user-id="42"
box.style.padding = '1rem';
box.innerText = 'Willkommen zurück!';
document.body.append(box);
console.log(box instanceof HTMLElement);
console.log(box.outerHTML);
Sichtbarkeit, Fokus und Klick steuern
const dialog = document.querySelector('#hilfe');
const button = document.querySelector('#hilfe-button');
button.addEventListener('click', () => {
dialog.hidden = !dialog.hidden;
if (!dialog.hidden) {
dialog.tabIndex = -1; // programmatisch fokussierbar machen
dialog.focus();
}
});
// Klick programmatisch auslösen
button.click();
console.log(dialog.hidden, document.activeElement === dialog);
Eigenes Custom Element von HTMLElement ableiten
class UserBadge extends HTMLElement {
static observedAttributes = ['name'];
connectedCallback() {
this.render();
}
attributeChangedCallback() {
this.render();
}
render() {
this.textContent = `👤 ${this.getAttribute('name') ?? 'Gast'}`;
}
}
customElements.define('user-badge', UserBadge);
const badge = document.createElement('user-badge');
badge.setAttribute('name', 'Anna');
document.body.append(badge);
console.log(badge.textContent);
Layout-Maße auslesen
const header = document.querySelector('header');
const { offsetWidth, offsetHeight, offsetTop } = header;
console.log(`Header: ${offsetWidth}×${offsetHeight}px, Abstand oben: ${offsetTop}px`);
// Wichtig · Fallstricke
- Kein Konstruktor:
new HTMLElement()wirft einenTypeError(„Illegal constructor“). Nur in Unterklassen, die percustomElements.define()registriert wurden, istsuper()erlaubt. innerTextvs.textContent:innerTextberücksichtigt CSS (versteckter Text fehlt) und löst dadurch ein Reflow aus – bei vielen Zugriffen langsam. Für reinen Text isttextContent(ausNode) schneller.- Layout-Thrashing:
offsetWidth/offsetHeighterzwingen eine synchrone Layout-Berechnung. Lese- und Schreibzugriffe in Schleifen nicht abwechseln. hiddenund CSS: Eine CSS-Regel wiedisplay: flexüberschreibt dashidden-Attribut. Ggf.[hidden] { display: none !important; }ergänzen. Der Werthidden="until-found"wird noch nicht von allen Browsern unterstützt.dataset-Namen:data-user-idwird zudataset.userId(camelCase); Werte sind immer Strings.- SVG/MathML: SVG-Elemente sind
SVGElement, keineHTMLElement-Instanzen –instanceof HTMLElementist dortfalse. Gemeinsame Eigenschaften wiedataset,style,focus()stammen aus Mixins und sind trotzdem vorhanden. - Kompatibilität: Kern-Eigenschaften funktionieren in allen Browsern. Neuere Teile wie
popover/showPopover()(Baseline 2024),inert(Baseline 2023) undattachInternals()vor der Nutzung prüfen. - Sicherheit: Für Benutzereingaben
innerText/textContentstattinnerHTMLverwenden, um XSS zu vermeiden.