Start · Sprachen · JavaScript · Referenz · ElementInternals.ariaMultiLine

ElementInternals.ariaMultiLine

Eigenschaft

Legt fest oder liest aus, ob ein benutzerdefiniertes Textfeld mehrzeilige (<code>"true"</code>) oder nur einzeilige (<code>"false"</code>) Eingaben annimmt. Entspricht <code>aria-multiline</code>.

seit JavaScript Baseline 2023: Chrome/Edge 81+, Safari 16.4+, Fire Kategorie: webapi

Signatur

ElementInternals.ariaMultiLine

Beschreibung

Die Eigenschaft ariaMultiLine der Schnittstelle ElementInternals entspricht dem ARIA-Attribut aria-multiline. Damit kann ein Custom Element Hilfstechnologien wie Screenreadern mitteilen, ob es sich um ein einzeiliges oder ein mehrzeiliges Textfeld handelt. Sinnvoll ist das vor allem bei Elementen mit der Rolle textbox (oder searchbox), z. B. bei eigenen Editoren auf Basis von contenteditable.

Anders als Element.ariaMultiLine schreibt die Eigenschaft auf ElementInternals kein sichtbares Attribut in das DOM. Sie legt stattdessen die Standardsemantik des Elements fest. Setzt eine Seitenautorin am Host-Element selbst aria-multiline, hat dieser Wert Vorrang. So kann eine Komponente sinnvolle Vorgaben liefern, die sich trotzdem von außen überschreiben lassen.

Der Wert ist ein String: "true" bedeutet mehrzeilige Eingabe (Enter fügt einen Zeilenumbruch ein), "false" bedeutet einzeilige Eingabe (Enter sendet z. B. ein Formular ab). Mit null wird die Vorgabe entfernt. Das Objekt ElementInternals bekommt man in der Klasse des Custom Elements über this.attachInternals().

Parameter

Name Typ Default Beschreibung
$value string | null null Wert beim Setzen: "true" (mehrzeilig), "false" (einzeilig) oder null, um die Vorgabe zu entfernen.

Rückgabewert

Typ
string | null
Beschreibung
Der aktuell gesetzte Wert ("true" oder "false") oder null, wenn nichts gesetzt ist. Ein aria-multiline-Attribut am Host-Element fließt nicht in diesen Wert ein.

Beispiele

Mehrzeiliges Custom-Textfeld mit Standardsemantik

class RichEditor extends HTMLElement {
  #internals;
  constructor() {
    super();
    this.#internals = this.attachInternals();
    this.#internals.role = 'textbox';
    this.#internals.ariaMultiLine = 'true';
    this.contentEditable = 'true';
  }
  get multiLine() {
    return this.#internals.ariaMultiLine;
  }
}
customElements.define('rich-editor', RichEditor);

const editor = document.createElement('rich-editor');
document.body.append(editor);
console.log(editor.multiLine);
console.log(editor.hasAttribute('aria-multiline'));
true false

Zwischen einzeilig und mehrzeilig über ein Attribut umschalten

class SmartInput extends HTMLElement {
  static observedAttributes = ['multiline'];
  #internals = this.attachInternals();

  connectedCallback() {
    this.#internals.role = 'textbox';
    this.contentEditable = 'true';
    this.#update();
    this.addEventListener('keydown', (e) => {
      // Einzeilig: Enter verhindern und stattdessen ein Ereignis auslösen
      if (e.key === 'Enter' && this.#internals.ariaMultiLine === 'false') {
        e.preventDefault();
        this.dispatchEvent(new CustomEvent('submit-line', { bubbles: true }));
      }
    });
  }
  attributeChangedCallback() {
    this.#update();
  }
  #update() {
    this.#internals.ariaMultiLine = this.hasAttribute('multiline') ? 'true' : 'false';
  }
}
customElements.define('smart-input', SmartInput);

const field = document.createElement('smart-input');
document.body.append(field);
field.setAttribute('multiline', '');
field.removeAttribute('multiline');

Vorgabe entfernen und Unterstützung prüfen

class PlainBox extends HTMLElement {
  internals = this.attachInternals();
}
customElements.define('plain-box', PlainBox);

const box = new PlainBox();
if ('ariaMultiLine' in ElementInternals.prototype) {
  box.internals.ariaMultiLine = 'false';
  console.log(box.internals.ariaMultiLine);
  box.internals.ariaMultiLine = null;
  console.log(box.internals.ariaMultiLine);
} else {
  console.log('ARIA-Spiegelung auf ElementInternals wird nicht unterstützt');
}
false null

// Wichtig · Fallstricke

  • Kein DOM-Attribut: Das Setzen erzeugt kein aria-multiline-Attribut am Host. getAttribute('aria-multiline') liefert also weiterhin null. Ein Attribut, das von außen gesetzt wird, überschreibt die Vorgabe aus ElementInternals.
  • Nur semantisch: ariaMultiLine verändert kein Verhalten. Dass Enter einen Zeilenumbruch einfügt oder eben nicht, muss die Komponente selbst umsetzen. Sonst hören Screenreader-Nutzer etwas anderes, als tatsächlich passiert.
  • Passende Rolle nötig: Der Wert ist nur bei einer passenden Rolle wie textbox sinnvoll. Die Rolle setzt man z. B. über internals.role.
  • Werte sind Strings: Übergib \"true\" oder \"false\", keine booleschen Werte. true wird zwar in \"true\" umgewandelt, sollte aber aus Gründen der Lesbarkeit vermieden werden.
  • Kompatibilität: attachInternals() funktioniert nur bei autonomen Custom Elements. Die Spiegelung der ARIA-Attribute auf ElementInternals gibt es erst in neueren Browsern (Firefox ab Version 119, Safari ab 16.4). Für ältere Browser prüfst du die Unterstützung mit 'ariaMultiLine' in ElementInternals.prototype und setzt ersatzweise das Attribut.