Переместите курсор на элемент-заполнитель в contentEditable DIV

У меня есть contentEditable DIV, и когда пользователь нажимает клавишу, базовый код обрабатывается и заменяется обновленным кодом. Увы, это приводит к потере позиции курсора.

Однако, чтобы сохранить положение курсора, я успешно вставляю <span id="placeholder"></span> в DIV в правильном месте до начала обработки. Это сохраняет предполагаемую позицию курсора, но теперь я не могу установить диапазон для его выбора.

Вот что у меня есть на данный момент:

function focusOnPlaceholder() {

    var placeholder = document.getElementById('placeholder');

    if( !placeholder ) return;

    var sel, range;

    if (window.getSelection && document.createRange) {                    
        range = document.createRange();
        range.selectNodeContents(placeholder);
        range.collapse(true);
        sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else if (document.body.createTextRange) {
        range = document.body.createTextRange();
        range.moveToElementText(placeholder);
        range.select();
    }

}

Любая помощь будет оценена по достоинству, и кросс-браузерное решение будет невероятным :)


person claviska    schedule 15.02.2011    source источник


Ответы (1)


Кроссбраузерным решением будет использование моей библиотеки Rangy и, в частности, модуль сохранения/восстановления выбора, который использует аналогичный метод заполнителей и хорошо протестирован. Однако это, вероятно, можно исправить без использования библиотеки, поместив некоторый контент (например, неразрывный пробел (\u00A0 или &nbsp; в HTML) внутри элемента-заполнителя. Вы можете удалить заполнитель в focusOnPlaceholder() после выбора диапазона.

person Tim Down    schedule 16.02.2011
comment
Добавление неразрывного пробела сделало свое дело. Сейчас поищу Ранджи. Спасибо! - person claviska; 16.02.2011