Signatur
Beschreibung
Die Eigenschaft ariaReadOnly des Element-Interfaces spiegelt das ARIA-Attribut aria-readonly wider. Damit teilen Sie Hilfstechnologien wie Screenreadern mit, dass der Wert eines Elements nicht geändert werden kann. Das Element bleibt aber fokussierbar, sein Inhalt lässt sich lesen und markieren, und es kann weiter bedient werden, etwa durch Navigieren in einem Grid.
Das Attribut ist vor allem für eigene Widgets gedacht, die nicht auf nativen Formularelementen beruhen. Beispiele sind role="textbox", role="checkbox", role="combobox", role="grid", role="gridcell", role="slider" oder role="spinbutton". Bei nativen Elementen wie <input> und <textarea> verwenden Sie stattdessen das HTML-Attribut readonly. Der Browser gibt es automatisch an den Accessibility-Tree weiter.
Die Eigenschaft ist ein String und kein Boolean. Gültige Werte sind "true" und "false". Fehlt das Attribut, liefert der Getter null. Wenn Sie einen Wert zuweisen, wird das Attribut im DOM gesetzt. Wenn Sie null zuweisen, wird es entfernt.
Wichtig: aria-readonly ändert nur die Semantik des Elements. Das Verhalten bleibt gleich. Ihr Skript muss Eingaben selbst verhindern, zum Beispiel indem Tastatur-Handler nicht reagieren oder contenteditable entfernt wird.
Rückgabewert
"true", wenn das Element schreibgeschützt ist, und "false", wenn es bearbeitbar ist (Standard). null bedeutet, dass das Attribut nicht gesetzt ist.Beispiele
Wert lesen und setzen
// <div id="datum" role="textbox" aria-readonly="true">01.01.2024</div>
const feld = document.getElementById('datum');
console.log(feld.ariaReadOnly);
feld.ariaReadOnly = 'false';
console.log(feld.getAttribute('aria-readonly'));
Schreibschutz für eigenes Textfeld umschalten
// <div id="notiz" role="textbox" contenteditable="true" tabindex="0">Text</div>
// <button id="sperren">Sperren</button>
const notiz = document.getElementById('notiz');
const button = document.getElementById('sperren');
const setReadOnly = (el, readOnly) => {
el.ariaReadOnly = String(readOnly); // Semantik für Screenreader
el.contentEditable = String(!readOnly); // tatsächliches Verhalten
};
button.addEventListener('click', () => {
const gesperrt = notiz.ariaReadOnly === 'true';
setReadOnly(notiz, !gesperrt);
button.textContent = gesperrt ? 'Sperren' : 'Entsperren';
console.log('readonly:', notiz.ariaReadOnly);
});
Grid-Zellen schreibgeschützt markieren und Attribut entfernen
// <div role="grid"> ... <div role="gridcell" data-col="id">42</div> ... </div>
const zellen = document.querySelectorAll('[role="gridcell"][data-col="id"]');
zellen.forEach((zelle) => {
zelle.ariaReadOnly = 'true'; // ID-Spalte ist nicht editierbar
});
// Attribut vollständig entfernen
const erste = zellen[0];
erste.ariaReadOnly = null;
console.log(erste.hasAttribute('aria-readonly'), erste.ariaReadOnly);
// Wichtig · Fallstricke
- String statt Boolean:
el.ariaReadOnly = falsewird zum String"false"umgewandelt. Prüfen Sie immer mit=== 'true', dennif (el.ariaReadOnly)ist auch bei"false"wahr. - Nur Semantik: Das Attribut verhindert keine Eingaben. Ihr Skript muss Bearbeitung selbst unterbinden.
- Nicht mit
aria-disabledverwechseln: Ein schreibgeschütztes Element bleibt fokussierbar und lesbar. Ein deaktiviertes Element gilt dagegen als nicht bedienbar. - Native Elemente: Bei
<input>und<textarea>setzen Sie besserreadonly(el.readOnly = true). Widersprüchliche Angaben verwirren Hilfstechnologien. - Kompatibilität: Firefox unterstützt die ARIA-Reflexion erst ab Version 119. Wenn Sie ältere Browser unterstützen müssen, verwenden Sie
setAttribute('aria-readonly', 'true'). Das funktioniert überall.