Hab's jetzt so gemacht:
function wrap(range, wrapper) {
range.surroundContents(wrapper);
var clone = document.createRange();
clone.selectNode(wrapper);
ranges.push(clone);
range.collapse(false);
}
Vermutlich die einfachste und eleganteste Lösung für diesen Fall, aber doch
unbefriedigend, dass ich keine simple Methode sehe, einen "Zustand" des
Range-Objektes "einzufrieren".
`console.log(Lib.copy(true, range))`{:.language-javascript} ergibt:
"[unsupported: no toString() function in type object]"
~~~javascript
// copy ist hier eine Methode eines Objekt-Literals, ebenso wie
// isBoolean, isArray und isLiteral
var Lib = {
copy: function(deep, obj, copy) {
copy || (copy = {});
var isBoolean = this.isBoolean(deep)
, isArray = false;
obj = (isBoolean) ? obj : deep;
deep = (isBoolean) ? deep : false;
for (var m in obj) {
if (deep && obj[m] && (this.isLiteral(obj[m]) || (isArray = this.isArray(obj[m])))) {
if (isArray) { copy[m] = obj[m].slice(0);
} else { copy[m] = this.copy(deep, obj[m]); }
} else { copy[m] = obj[m]; }
}
return copy;
}
//,...
}