Пользовательский движок текстового редактора в javascript

Я строю настраиваемое поле ввода в JavaScript. (т.е. без использования редактируемого контента, ввода, текстовой области или фреймов).

Мне нужно это для поддержки основных опций в поле textarea, например:

  • Щелчок мыши для положения курсора
  • выбор
  • Копировать вставить
    ...

На данный момент я слушаю нажатия клавиш на поле ввода. Когда клавиша нажата:
1. значение ключа String.fromCharCode(event.keyCode) передается в TMP Span.
2. Ширина промежутка измеряется и сохраняется в массиве.
3. позиция каретки рассчитывается с использованием массива размеров

Это работает более или менее в Chrome, но при использовании Internet Explorer 9, каретка, кажется, выходит из положения.

Кажется, ширина контейнера с одним контейнером не соответствует ширине, которую имеет этот символ, когда он вставляется в строку.

Я предполагаю, что это как-то связано с тем, как рассчитывается размер буквы на шаге 2. Но я не могу понять, как решить эту проблему.

Кто-нибудь имеет опыт работы с этой проблемой или указывает мне правильное направление с какой-то литературой, блогами apis, чем-нибудь? - это было бы прекрасно!

редактировать: вот ссылка на то, что я получил до сих пор;

NB: работает в Chrome и имеет упомянутый дефект в ie: 9 и 10, он сломан в Firefox:)

1 ответ

Если вы хотите узнать положение каждого символа в поле, вы можете попытаться получить ширину предыдущей подстроки:

var text = $content.text(),
    positions = [0],
    $ghost = $("<span class='ghost'>").appendTo($content);
for (var i = 1; i < text.length; i++) {
    $ghost.text(text.substring(0, i));
    positions.push($ghost.width());
}
$ghost.remove();

Это CSS, который вам нужен:

.ghost {
    visibility: hidden;
    position: absolute;
    bottom: 0;
    right: 0;
}

Помните, что каждый раз, когда вы получаете размер элемента, он вызывает перекомпоновку документа. Это не должно быть проблемой для абсолютно позиционированного элемента.

Другие вопросы по тегам