ExecCommand insertHTML breaks хранит window.getSelection()

При использовании методов выбора текста и восстановления выделенного текста на странице, я обнаружил, что выполнение execCommand('insertHTML... inbetween заставляет сохраненный выбор прерываться.

Это пример выбора и восстановления текста.

// Get Selection
 var sel = window.getSelection().getRangeAt(0);
 // Clear Selections 
 window.getSelection().removeAllRanges();
 // Restore Selection 
 window.getSelection().addRange(sel)

Это отлично работает, однако после запуска execCommand('insertHTML.. выбор endOffset устанавливает то же значение, что и выбор startOffset

Есть ли причина для этого? Что еще более важно, есть ли способ обойти это?


Здесь можно увидеть полный пример ошибки, в том числе с базовым консольным протоколированием. http://jsfiddle.net/blowsie/Y8pJ7/

Цель этой скрипты - выбрать текст, преобразовать его в верхний регистр и затем повторно выбрать текст.

Ответ 1

Как лучше всего сохранить и восстановить выбор действительно зависит от того, что вы делаете. В вашем конкретном примере, когда существующий текст просто преобразует свой случай, я бы предложил подход с индексом на основе символов, например fooobar.com/info/21452/... (хотя для этого требуется Rangy, но может быть тривиально изменен, чтобы не требовать его: http://jsfiddle.net/Y8pJ7/8).

В некоторых других случаях лучшим подходом является использование невидимых элементов маркера в начале и в конце выбора, что является подходом, выбранным выбором сохранить/восстановить модуль Rangy (раскрытие: я автор Rangy).

ОБНОВЛЕНИЕ 18 июня 2012 г.

Rangy теперь имеет поддержку на основе смещения на основе символов и восстановление выбранных и диапазонов с помощью нового модуля TextRange (demo).