Habe schon lange nicht mehr mit Ranges gearbeitet, daher eine dumme Frage: Was ist der Sinn von
cloneRange
, wenn sich der Klon verändert, wenn sich das Original ändert? Müsste cloneRange nicht eigentlich das Mittel der Wahl sein?
Ohje...
habe einen ziemlich dämlichen Denkfehler begangen:
In folgendem Code wird mithilfe der range das HTML-Element manipuliert, auf das sich ja auch der clone bezieht. Ändere ich also mithilfe von range die HTML, so ändert sich range selbst und somit NATÜRLICH auch der clone...:
// selektiere Wort "Grünkohl":
function wrap() {
var selection = window.getSelection(),
range = selection.getRangeAt(0),
clone = range.cloneRange(),
wrapper = document.createElement('span');
console.log(clone.toString()); // Grünkohl
wrapper.style.background = "yellow";
range.surroundContents(wrapper);
console.log(clone.toString()); // (Leerstring)
range.collapse(true);
}
document.addEventListener("mouseup", wrap, false);
Lässt man range.surroundContents(wrapper)
weg und prüft mit console.log nach collapse, dann sieht man auch, dass es sich
tatsächlich um einen clone handelt:
console.log(range.toString()); // Grünkohl
console.log(clone.toString()); // Grünkohl
range.collapse(true);
console.log(range.toString()); // (Leerstring)
console.log(clone.toString()); // Grünkohl
MDN:
"clone is copied by value, not reference, so a change in either Range does not effect the other."
Lieben Gruß!