Signatur
Beschreibung
Range.toString() ist der Stringifier des Range-Interfaces. Die Methode gibt den Text zurück, der zwischen Start- und Endpunkt des Bereichs liegt. Dazu werden die Daten aller Text-Knoten im Bereich aneinandergehängt, bei Start- und Endknoten nur der Teil innerhalb der Offsets. Elemente, Attribute und Kommentare kommen im Ergebnis nicht vor.
Weil es ein Stringifier ist, wird die Methode auch implizit aufgerufen, etwa bei Template-Literalen (`${range}`), bei String(range) oder beim Verketten mit +.
Typische Einsatzfälle sind das Auslesen einer Textauswahl über selection.getRangeAt(0).toString(), Wortzählungen in markierten Bereichen oder das Ermitteln von Text zwischen zwei DOM-Positionen, zum Beispiel für Hervorhebungen und Anmerkungen.
Anders als innerText berücksichtigt toString() weder CSS noch Layout. Versteckter Text (display: none) ist also enthalten, und bei <br> oder Blockgrenzen werden keine Zeilenumbrüche eingefügt. Das Verhalten entspricht eher textContent, beschränkt auf den Bereich.
Rückgabewert
Text-Knoten im Bereich. Ist der Bereich zusammengefallen (collapsed), ist es ein leerer String.Beispiele
Text zwischen zwei Positionen auslesen
// HTML: <p id="p">Hallo <b>schöne</b> Welt</p>
const p = document.getElementById('p');
const range = document.createRange();
// Start: Offset 3 im ersten Textknoten ("Hallo ")
range.setStart(p.firstChild, 3);
// Ende: Offset 3 im letzten Textknoten (" Welt")
range.setEnd(p.lastChild, 3);
console.log(range.toString());
Markierten Text des Nutzers ermitteln
document.addEventListener('mouseup', () => {
const selection = window.getSelection();
if (!selection || selection.rangeCount === 0) return;
const range = selection.getRangeAt(0);
const text = range.toString().trim();
if (text) {
const words = text.split(/\s+/).length;
console.log(`Markiert: "${text}" (${words} Wörter)`);
}
});
Impliziter Aufruf und Unterschied zu innerText
// HTML: <div id="box">Zeile 1<br>Zeile 2<span style="display:none"> geheim</span></div>
const box = document.getElementById('box');
const range = document.createRange();
range.selectNodeContents(box);
console.log(`${range}`); // Stringifier, implizit
console.log(box.innerText); // layoutabhängig
// Wichtig · Fallstricke
- Kein Markup: Das Ergebnis ist reiner Text. Brauchst du das HTML, nimm
range.cloneContents()und serialisiere dasDocumentFragment, z. B. über einen temporären Container und desseninnerHTML. - Keine Zeilenumbrüche aus dem Layout:
<br>, Absätze und Blockelemente erzeugen kein\n. Unsichtbarer Text und Inhalte von<script>und<style>im Bereich sind enthalten.Selection.toString()kann sich dagegen je nach Browser näher aninnerTextverhalten. - Leerzeichen: Whitespace aus dem Quelltext (Einrückungen, Umbrüche) wird unverändert übernommen. Bei Bedarf mit
trim()oderreplace(/\s+/g, ' ')normalisieren. - Kompatibilität: Wird seit vielen Jahren von allen modernen Browsern unterstützt. Für
StaticRangegibt es keinetoString()-Methode. - Sicherheit: Der Text stammt oft aus Nutzereingaben. Füge ihn mit
textContentein, nicht mitinnerHTML, um XSS zu vermeiden.