Вы захотите посмотреть на Range Objects, здесь есть хорошее резюме:
http://www.quirksmode.org/dom/range_intro.html
Совместимость браузера будет проблемой, но в основном вы можете получить текущий выбор так, как вы предлагаете, затем преобразовать его в Range и использовать методы объекта Range, чтобы найти и разделить существующие узлы DOM, и вставьте свой собственный тег <span>
, содержащий выделенный текст.
Это не совсем тривиально, и включает в себя серьезные манипуляции с DOM, но это полезный предмет, чтобы разобраться. Наслаждайтесь!