Utrzymuj pozycję kursora w contenteditable div [duplikat]

To pytanie ma już tutaj odpowiedź:

Utrzymywanie zmian obiektów zakresu po zaznaczeniu w HTML 3 odpowiedzi

Przede wszystkim jest to podobne do tych:

Edycja treści iframe w IE - problem z utrzymaniem zaznaczenia tekstu

Jak uzyskać pozycję daszka w contenteditable div z elementami potomnymi html?

Zasadniczo piszę coś podobnego do nowego edytora tweet w twitter. Wewnątrzdiv zcontentEditable ustawiam, parsuję tekst. Kiedy wykryję, co uważam za adres URL, usuwam ten tekst i wpisuję go<a> tag wewnątrz div (np. wpisany komunikat zgo to www.google.com staje sięGo to <a href='..'>www.google.com</a>. ALE, gdy to zrobię, pozycja opiekuna jest stracona.

Używanie sugestii @ Tim-Down w tych innych postach SO będzie działać tak długo, jak długo nie będziesz edytować DOM (jak mówi). Ja edytuję DOM, więc pozycja karetki zostaje utracona.

Czy jest to możliwe (najlepiej bez użycia biblioteki Rangy) do osiągnięcia tego, pracując nad bieżącym kodem.

Kod, który mam w tej chwili (z innych postów SO):

var saveSelection, restoreSelection;
if (window.getSelection) {
    // IE 9 and non-IE
    saveSelection = function(win) {
        var sel = win.getSelection(), ranges = [];
        if (sel.rangeCount) {
            for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                ranges.push(sel.getRangeAt(i));
            }
        }
        return ranges;
    };

    restoreSelection = function(win, savedSelection) {
        var sel = win.getSelection();
        sel.removeAllRanges();
        for (var i = 0, len = savedSelection.length; i < len; ++i) {
            sel.addRange(savedSelection[i]);
        }
    };
} else if (document.selection && document.selection.createRange) {
    // IE <= 8
    saveSelection = function(win) {
        var sel = win.document.selection;
        return (sel.type != "None") ? sel.createRange() : null;
    };

    restoreSelection = function(win, savedSelection) {
        if (savedSelection) {
            savedSelection.select();
        }
    };
}

Używam tego w ten sposób:

$('div').on('keyup paste', function(e) {
    var ranges = saveSelection(window);
    var newContent = /* Get the new HTML content */;
    $('div').html(newContent);
    restoreSelection(window, ranges);
});

questionAnswers(1)

yourAnswerToTheQuestion