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...:
function wrap() {
var selection = window.getSelection(),
range = selection.getRangeAt(0),
clone = range.cloneRange(),
wrapper = document.createElement('span');
console.log(clone.toString());
wrapper.style.background = "yellow";
range.surroundContents(wrapper);
console.log(clone.toString());
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());
console.log(clone.toString());
range.collapse(true);
console.log(range.toString());
console.log(clone.toString());
MDN:
"clone is copied by value, not reference, so a change in either Range does not effect the other."
Lieben Gruß!