Rangy - Range.setStartAfter в IE - PullRequest
       8

Rangy - Range.setStartAfter в IE

0 голосов
/ 26 августа 2011

Я в курсе этого вопроса в IE. У меня есть элемент с атрибутом contenteditable, установленным на "true". Внутри есть различные элементы, некоторые из которых не могут быть изменены, текст обернут в промежутки, используя имя класса CSS «uneditable».

Используя обработчик для события «keydown», проверяется узел привязки выбора. Если anchorNode является текстовым узлом недоступного для редактирования элемента, диапазон изменяется и устанавливается на начало после узла недоступного для редактирования элемента. Это прекрасно работает во всех браузерах, кроме за мерзость называется IE.

Возьмите следующий пример:

Lorem ipsum dolor sit <span class="uneditable">amet</span>, 
consectetur adipisicing elit

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

Вот обработчик:

$("#myeditor").keydown(function(ev) 
{ 
    var sel = rangy.getSelection(); 
    var range = sel.getRangeAt(0); 
    if (sel.anchorNode.nodeType == 3) 
    { 
            if ($(sel.anchorNode.parentNode).is(".uneditable")) 
            { 
                    range.setStartAfter(sel.anchorNode.parentNode); 
                    rangy.getSelection().setSingleRange(range); 
            } 
    } 
});

Даже если я выберу следующий брат и использую range.setStart (nextSibling, 0), IE все равно добавит новый текст в не редактируемый элемент. Как мне помешать IE редактировать мои не редактируемые элементы?

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 31 августа 2011

Проблема в том, что IE просто не позволяет вам поместить каретку в эту позицию и вместо этого «исправляет» ее, чтобы она была в конце предыдущего символа. WebKit фактически делает то же самое. См. http://jsfiddle.net/MZuFb/1/ для примера.

Единственный обходной путь, о котором я могу подумать, - это вставить временный символ и выбрать его так, чтобы он был перезаписан: http://jsfiddle.net/timdown/MZuFb/2/

...