So, hier mein letzter (und diesmal funktionierender) Ansatz - für den Fall,
dass jemand ein ähnliches Problem hat:
Stark vereinfachtes Bsp.:
var copies = [],
parents = [];
function wrap(range, wrapper) {
// kann man noch optimieren; worauf es ankommt, ist, die properties
// startOffset, endOffset (und ggf. commonAncestorContainer etc.) zu
// sichern, weil diese in range selbst sich ändern durch bspl.
// surroundContents oder collapse
copies.push(eineDeepCopyFunction(range));
range.surroundContents(wrapper);
// dass ich hier in globale Arrays pushe, um die nötigen Infos zu retten,
// liegt am vereinfachten Bsp. - ist natürlich unschön
parents.push(wrapper.parentNode);
range.collapse(false);
}
function unwrap(wrapper) {
var parent = wrapper.parentNode;
parent.replaceChild(wrapper.fistChild, wrapper);
parent.normalize();
}
function rewrap(wrapper) {
// die copy ist kein Ränge-Objekt, mit dem man einfach so weiterarbeiten
// könnte; benötige ein paar properties, um damit neue range zu generieren
var range = document.createRange(),
parent = parents.pop(),
copy = copies.pop();
range.setStart(parent, copy.startOffset);
range.setEnd(parent, copy.endOffset);
wrap(range, wrapper);
}