Как получить HTML до, внутри и после выделения (не в текстовой области)?

Вот что я пытаюсь выполнить: когда пользователь использует мышь , клавиатуру или касание, чтобы выделить текст внутри myDiv. Я хочу получить три незаметных фрагмента HTML: HTML перед выделением (слева от него), HTML внутри выделения и HTML после выделения ( "справа" от него). HTML должен быть таким, каким он будет выглядеть с myDiv.innerHTML.

Выбор может начинаться или заканчиваться внутри пары тегов (т. е. выделенный фрагмент не обязательно является допустимым HTML).Мне не нужно иметь дело со специальными сценариями, такими как элементы с абсолютным позиционированием в выделении; все выборки, которые меня интересуют, будут ограничены одним блоком div, который будет содержать базовые теги, такие как strong, em, ul, ol, h1, image и table.

Самое близкое, что я подошел, - это использование rangy для перехвата выделения и вызов selection.getRangeAt (0) .cloneContents () для получения HTML-кода выбора. Это работает достаточно хорошо, пока я не сделаю выбор, который недействителен по отдельности, и браузер не изменит HTML фрагмента документа, чтобы сделать его допустимой разметкой.

Дополнительная информация: Вот почему мне это нужно:

Я создаю систему обратной связи с документами, поэтому мне нужно сохранить информацию о выборе в базе данных для последующего поиска и восстановления. Обычно я сохраняю выделение, используя путь DOM и выделенный текст, но текст может меняться между сохранением и восстановлением. Например, автор может перемещать целые абзацы, удалять разделы и т. Д. Тогда путь DOM становится довольно бесполезным.

Итак, мой (несовершенный) план - сохранить выделение как [смещение, длина, html_snippet]. Это «позиция». Я также сохраню фрагменты html, которые были непосредственно перед и после выделенного текста. Это «контекст».

Используя комбинацию этих данных, я должен иметь возможность перемещать первоначально выбранный текст большую часть времени, даже если он был перемещен или частично изменен. Когда это не удается, у пользовательского интерфейса будет способ решить эту проблему, но я бы хотел, чтобы это происходило как можно реже.

Суперспасибо!

9
задан Alan Bellows 3 March 2012 в 18:09
поделиться