Laura: deep copy eines Range-Objektes

Beitrag lesen

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ß!