Вот что я пытаюсь сделать: когда пользователь использует мышь, клавиатуру или сенсорный экран для выделения текста внутри «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 становится довольно бесполезным.
Так что мой (несовершенный) план - сохранить выделение как [offset, length, html_snippet]. Это «позиция». Я также сохраню фрагменты html, которые пришли непосредственно до и после выделенного текста. Это и есть «контекст».
Используя комбинацию этих данных, я смогу перемещать первоначально выбранный текст большую часть времени, даже если он был перемещен или частично изменен. Когда это не удается, пользовательский интерфейс найдет способ решить эту проблему, но я бы хотел, чтобы это происходило как можно реже.
Superthanks!