Сам факт вставки тега <span>
изменит DOM. Это, по определению, то, что вы делаете, когда звоните surroundContents()
. Вы не можете добавить тег span без изменения DOM, которое включает в себя разбиение текстовых узлов и добавление новых элементов для span.
Кроме того, если выделенный текст не содержит только целые текстовые узлы и выделение никогда не начинается / не останавливается в середине текстового узла, вам придется разделить текстовые узлы, чтобы поместить интервал в нужном месте. Когда вы позже удалите теги span, у вас будут дополнительные текстовые узлы. Это не должно иметь никакого значения, но если вы действительно думаете, что вам нужно вернуть разделенные текстовые узлы обратно в прежнее состояние, я могу подумать о нескольких вариантах:
1) Сохраните исходный parentNode до того, как в него будет вставлен диапазон. Клонируйте его, добавьте свой промежуток к клону, замените исходный узел клоном и сохраните исходный. Если вы хотите восстановить, поставьте оригинал обратно и удалите клонированный.
2) Когда вы удаляете span, запускайте функцию, которая ищет соседние текстовые узлы и объединяет их.
3) Выясните, почему так важно, чтобы после этого было больше текстовых узлов, чем было раньше, потому что это не должно иметь значения для любого кода или отображения.