Signatur
Beschreibung
Die Eigenschaft ariaRowSpan der Schnittstelle ElementInternals legt fest, wie viele Zeilen eine Zelle (role="cell", gridcell, rowheader oder columnheader) in einer Tabelle, einem Grid oder einem Treegrid überspannt. Sie gehört zur ARIA-Reflexion und entspricht inhaltlich dem Attribut aria-rowspan.
Der wichtige Unterschied zu Element.ariaRowSpan: Über ElementInternals setzt ein autonomes Custom Element seine Standard-Semantik, ohne ein sichtbares Attribut in das DOM zu schreiben. Das Host-Element bleibt „sauber“, und Nutzer der Komponente können den Wert jederzeit mit einem eigenen aria-rowspan-Attribut überschreiben. Das Attribut auf dem Element hat immer Vorrang.
Man braucht die Eigenschaft vor allem bei eigenen Tabellen- oder Grid-Komponenten, deren Zellen aus Custom Elements bestehen, etwa <data-cell> innerhalb von <data-grid>. Da solche Elemente keine native <td rowspan>-Semantik haben, müssen Hilfstechnologien wie Screenreader über ARIA erfahren, dass eine Zelle mehrere Zeilen belegt.
Der Wert ist ein String mit einer ganzen Zahl ≥ 0 oder null, wenn kein Wert gesetzt ist. Laut ARIA-Spezifikation bedeutet 0, dass die Zelle alle übrigen Zeilen des aktuellen Abschnitts überspannt. Diese Bedeutung wird aber nicht überall zuverlässig unterstützt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value | string | null | null | Beim Setzen: String mit einer ganzen Zahl ≥ 0 (z. B. "2"). Mit null wird der Standardwert entfernt. |
Rückgabewert
ElementInternals gesetzte Standardwert für aria-rowspan oder null, falls keiner gesetzt ist. Ein aria-rowspan-Attribut auf dem Host-Element wird hier nicht wiedergegeben.Beispiele
Custom-Grid-Zelle mit Standard-Rowspan
class GridCell extends HTMLElement {
#internals;
constructor() {
super();
this.#internals = this.attachInternals();
this.#internals.role = 'gridcell';
this.#internals.ariaRowSpan = '1';
}
get internals() {
return this.#internals;
}
}
customElements.define('grid-cell', GridCell);
const cell = document.createElement('grid-cell');
console.log(cell.internals.ariaRowSpan);
console.log(cell.hasAttribute('aria-rowspan'));
Rowspan dynamisch aus einer Eigenschaft ableiten
class DataCell extends HTMLElement {
static observedAttributes = ['span-rows'];
#internals = this.attachInternals();
connectedCallback() {
this.#internals.role = 'cell';
}
attributeChangedCallback(name, _old, value) {
if (name === 'span-rows') {
const n = Number.parseInt(value, 10);
// Nur gültige Werte übernehmen, sonst Standard entfernen
this.#internals.ariaRowSpan = Number.isInteger(n) && n >= 0 ? String(n) : null;
console.log('ariaRowSpan =', this.#internals.ariaRowSpan);
}
}
}
customElements.define('data-cell', DataCell);
const td = document.createElement('data-cell');
td.setAttribute('span-rows', '3');
td.setAttribute('span-rows', 'abc');
Attribut überschreibt den Internals-Standardwert
class HeaderCell extends HTMLElement {
constructor() {
super();
const internals = this.attachInternals();
internals.role = 'rowheader';
internals.ariaRowSpan = '2';
}
}
customElements.define('header-cell', HeaderCell);
const el = document.createElement('header-cell');
// Der Nutzer der Komponente überschreibt den Standardwert
el.setAttribute('aria-rowspan', '4');
console.log(el.ariaRowSpan); // Element-Reflexion zeigt das Attribut
// Wichtig · Fallstricke
- Nur für autonome Custom Elements:
attachInternals()wirft bei eingebauten Elementen und erweiterten Built-ins (is="…") einenNotSupportedError. Pro Element darfattachInternals()außerdem nur einmal aufgerufen werden. - Vorrang: Ein
aria-rowspan-Attribut auf dem Host-Element überschreibt den Wert ausElementInternals.internals.ariaRowSpangibt das Attribut nicht wieder. - Typ ist String: Zahlen werden beim Setzen in Strings umgewandelt. Die Gültigkeit prüft der Browser nicht, ungültige Werte wie
"-1"werden einfach gespeichert und von Hilfstechnologien ignoriert. Deshalb sollte man die Werte selbst prüfen. - Nur mit passender Rolle sinnvoll:
aria-rowspanwirkt nur beicell,gridcell,rowheaderundcolumnheaderinnerhalb vontable,gridodertreegrid. Sobald die Tabelle virtualisiert ist, sollte sie aucharia-rowcountundaria-rowindexkonsistent angeben. - Kompatibilität: Die ARIA-Reflexion auf
ElementInternalsgibt es in Chromium seit Version 81 und in Safari seit 16.4. Firefox unterstützt sie erst ab Version 119. Für ältere Browser mit Feature-Erkennung prüfen ('ariaRowSpan' in ElementInternals.prototype) und bei Bedarf aufsetAttribute('aria-rowspan', …)ausweichen.